首页 > 其他 > 详细

es的海量数据写入优化

时间:2019-08-15 15:35:08      阅读:614      评论:0      收藏:0      [点我收藏+]

最近在做es集群的海量数据写入,公司的数据量比较大,日均增量达到了5亿+,有将近150G的数据,这对es来说,如果用默认的设置和常规的写入简直无法完成,哪怕写进去了,也是大量重复,数据丢失,基本写不进去。

es的写入方式有很多种,可以通过logstach直接写入,可以通过api接口写入,也可以通过spark写入,还可以直接从kafka、filebeat、flume之类的写入。

综合考虑后,我们选择了数据先进入hive,然后做清洗和增加uuid等处理。

下面将详细介绍这次测试的效果和思路,分享给广大的es开发者们,希望可以给大伙儿有一点帮助吧。

 

一、Elasticsearch整理之template使用

  es在开发过程中,还是建议使用模板,这样可以批量设置索引的信息,在数据写入的时候可以更方便管理,也可以在数据写入的时候再创建索引,不创建便不占内存空间。

创建模板如下,

PUT _template/template_date_test_index_mapping
{
   "index_patterns": ["date_test_index_*"],
   "settings": {
    "number_of_shards":4,  
    "number_of_replicas":0   
  },
   "mappings": {
     "doc":{
       "properties": {
         "appname":{
           "type": "keyword",
           "index_options": "freqs",
           "norms": false,
           "copy_to": "full_name"
         },
         "request_time": {
            "type": "date",
              "format":"yyyy-MM-dd HH:mm:ss"
          }
       }
     }
  }
}

 

 

 二、Elasticsearch整理之settings的设置

以下内容摘自:https://blog.csdn.net/Interstellar_/article/details/81355589  ,当然大家可以去官网看看,会有更详细的设置信息,我看到这篇博客的博主写的挺好的就摘下来附上了

//静态设置:只能在索引创建时或者在状态为 closed index(闭合的索引)上设置
 
index.number_of_shards //主分片数,默认为5.只能在创建索引时设置,不能修改
 
index.shard.check_on_startup //是否应在索引打开前检查分片是否损坏,当检查到分片损坏将禁止分片被打开
   false //默认值
   checksum //检查物理损坏
   true //检查物理和逻辑损坏,这将消耗大量内存和CPU
   fix //检查物理和逻辑损坏。有损坏的分片将被集群自动删除,这可能导致数据丢失
 
index.routing_partition_size //自定义路由值可以转发的目的分片数。默认为 1,只能在索引创建时设置。此值必须小于index.number_of_shards
 
index.codec //默认使用LZ4压缩方式存储数据,也可以设置为 best_compression,它使用 DEFLATE 方式以牺牲字段存储性能为代价来获得更高的压缩比例。
//动态设置
 
index.number_of_replicas //每个主分片的副本数。默认为 1。
 
index.auto_expand_replicas //基于可用节点的数量自动分配副本数量,默认为 false(即禁用此功能)
 
index.refresh_interval //执行刷新操作的频率,这使得索引的最近更改可以被搜索。默认为 1s。可以设置为 -1 以禁用刷新。
 
index.max_result_window //用于索引搜索的 from+size 的最大值。默认为 10000
 
index.max_rescore_window // 在搜索此索引中 rescore 的 window_size 的最大值
 
index.blocks.read_only //设置为 true 使索引和索引元数据为只读,false 为允许写入和元数据更改。
 
index.blocks.read // 设置为 true 可禁用对索引的读取操作
 
index.blocks.write //设置为 true 可禁用对索引的写入操作。
 
index.blocks.metadata // 设置为 true 可禁用索引元数据的读取和写入。
 
index.max_refresh_listeners //索引的每个分片上可用的最大刷新侦听器数

 

三、elasticsearch整理之hive写es的http设置项

add jar ${DIR}/elasticsearch-hadoop-hive-6.5.0.jar;

USE testdb;
DROP TABLE IF EXISTS test_20190806;
CREATE EXTERNAL TABLE test_20190806
(
    cs_uri_stem     STRING      COMMENT 客户端访问的url
    ,userid           STRING      COMMENT 客户端访问ID
    ,requesttime    STRING      COMMENT 客户端提交请求的时间
    ,session_id     STRING      COMMENT 会话id
    ,server_port       STRING      COMMENT 服务器端口号
    ,server_ip      STRING      COMMENT 服务器IP
    ,client_ip      STRING      COMMENT 客户端IP
    ,uuid            STRING      COMMENT uuid
)COMMENT ACC日志数据传入ES外部表 
STORED BY org.elasticsearch.hadoop.hive.EsStorageHandler
TBLPROPERTIES(
    es.resource = test_index_20190806/doc,

   es.index.auto.create = true, 
    es.nodes.wan.only = true,
    
    es.index.translog.durability = async,
    es.index.translog.sync_interval = 120s,
    es.index.translog.flush_threshold_size = 1024mb,
    es.index.translog.flush_threshold_period = 120m,
    
    es.index.refresh_interval=120s,
    
    es.read.metadata = true,
    es.mapping.id = uuid,
    es.write.operation = upsert,
    
    es.http.timeout = 600s, 
    es.batch.size.bytes = 10mb,
    es.batch.write.retry.count = -1, 
    es.batch.write.retry.wait = 600s,   
    es.batch.size.entries = 5000
)
;

 

具体的es配置优化可以根据自己的需求到官网找,此处附上配置的官方url:https://www.elastic.co/guide/en/elasticsearch/hadoop/master/configuration.html#cfg-multi-writes

 

四、elasticsearch整理之mapping字段 的相关配置

名称             枚举               作用
enable        true/false              仅存储,不做搜索和聚合分析
index          true/false              是否构建倒排索引,false不记录,即不可搜索
index_options      docss/freqs/positions/offsets      存储倒排索引的哪些信息,text类型默认配置为positions,其他默认为docs ,记录内容越多,占用空间越大。
norms          true/false              是否存储归一化的相关参数,如果字段仅用于过滤和聚合分析,可关闭
doc_values        true/false              是否开启,用于排序和聚合分析
field_data        true/false               是否为text类型启用,实现排序和聚合分析
store          true/false               是否存储该字段值
coerce         true/false              是否开启自动数据类型转换,比如字符串转数字,浮点转int(默认是true)
multifields                       多字段:灵活使用多字段来解决多样的业务需求
dynamic         true/false/strict           控制mapping的自动跟新
date_detection      true/false               是否自动识别日期类型 (建议false,手动去设置格式)

 五、_source,_all,store的关系

_source默认会存储写入es的json文档,可通过includes参数指定存储部分field,也可以通过excludes参数指定那些部分field不存储,不过查询的时候只会显示这里存储的field,不存的将无法显示。

_all是默认将所有字段合并,做一个分词,但是es6以后该字段默认禁用,好像还不能更改,但是可以通过copy_to把需要进行多字段分词查询的field指定到一个full_name的字段里,这个字段类似_all的功能

一般来说_source和store必须要存储一份数据,否则该字段在es中将没有任何存储。但是_source里没有的字段,即便设置field的store为true,该field在查询结果中也无法显示。

 本段摘自:https://blog.csdn.net/qq_34646817/article/details/82585517

 

es的海量数据写入优化

原文:https://www.cnblogs.com/xinyumuhe/p/11344171.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!