es6.5的海量数据写入

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

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

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

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

一、底层优化

1.es 配置文件目录修改JVM.Umm  jvm配置那个配置文件 xms xmx堆栈数字设置一定一样,而且最好都设置为30G,当然内存一定要足够

2.elasticsearch.yml 加 bootstrap.memory_lock:true  防止系统内存交换,只给es使用

3.需要修改/etc/security/limits.conf  这是对linux系统底层的多线程优化,允许es最大可以并发6万+线程

* soft nofile 65536
* hard nofile 65536
* soft memlock unlimited
* hard memlock unlimited

4.修改: /etc/sysctl.conf 然后之心 sysctl -p 使其生效  这个操作是,如果系统有其他进程需要临时用内存还是要允许系统分一点去做其他事儿

vm.swappiness = 1

5.es配置信息和索引设置信息外,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   //副本数默认为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的映射配置项

set hive.exec.parallel=true;    //设置可以并发执行hive 脚本
set hive.exec.parallel.thread.number=50;  //给hive任务足够多的cpu去执行mr任务,如果有足够的cpu还可以加更多的,一般写的慢除了es的问题,hive的任务执行速度也有关系的


add jar ./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.nodes' = 'host1:port1,host2:port2,host3:port3',
'es.resource' = 'index/type_name',
'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' = '1800s',
'es.batch.write.retry.count' = '-1',
'es.batch.size.bytes' = '20mb',
'es.batch.write.retry.wait' = '900s',
'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

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