六、海量hive数据写入es优化

场景:

业务部门将客户画像结果表通过hive映射到es表,其中结果表600W条数据,但每条数据接近2W个标签,数据入到es后主要场景是多字段组合过滤查询后聚合求和。

优化思路

es默认最大字段数是1000,需要增大字段数
hive端优化: hive的取数据的速度大于写入到es的速度,es会由于集群规模问题或者资源问题无法同时接收hive过多的并发数。 由此hive端主要优化是减小map数

  • set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat 将多个小文件打包作为一个整体的inputsplit,减少map任务数
  • set mapred.max.split.size=256000000;
    set mapred.min.split.size.per.node=256000000
    set Mapred.min.split.size.per.rack=256000000
    增大map输入split的大小

es端优化:主要分为索引设计层面和数据写入层面
#创建es索引 curl -u ${ESUser}:${ESPasswd} -X PUT -H "Content-Type: application/json" "http://${ESIP}:${ESPort}/${ESIndex}/" -d '{"settings":{"number_of_shards":10,"number_of_replicas": 0},"mappings":{'"cmfe_coscp_tag_cust_base"':{"_all":{"enabled":false}}}}'
#修改es设置curl -u ${ESUser}:${ESPasswd} -X PUT -H "Content-Type: application/json" "http://${ESIP}:${ESPort}/${ESIndex}/_settings" -d'{"index.mapping.total_fields.limit":"5000","refresh_interval":"60s","index.translog.durability":"async"}'
'es.batch.size.entries' = '100', 'es.batch.size.bytes' = '1mb', 'es.batch.write.retry.count' = '10', 'es.batch.write.retry.wait' = '60s',

优化参数详解

精细设置全文域:string类型字段默认会分词,不仅会额外占用资源,而且会影响创建索引的速度。所以,把不需要分词的字段设置为not_analyzed
禁用_all字段
副本数量设置为0:全量数据保存在hadoop es副本数量是可以随时修改的,区别分片数量
使用es自动生成id:es对于自动生成的id有优化,避免了版本查找。因为其生成的id是唯一的
设置index.refresh_interval:索引刷新间隔,默认为1s。因为不需要如此高的实时性,我们修改为30s 
设置段合并的线程数量: "index.merge.scheduler.max_thread_count" : 1
设置异步刷盘事务日志文件:"index.translog.durability": "async","index.translog.sync_interval": "30s"

集群层面参数设置
indices.memory.index_buffer_size: 20%,indices.memory.min_index_buffer_size: 96mb

 已经索引好的文档会先存放在内存缓存中,等待被写到到段(segment)中。缓存满的时候会触发段刷盘(吃i/o和cpu的操作)。默认最小缓存大小为48m,不太够,最大为堆内存的10%。对于大量写入的场景也显得有点小。

设置index、merge、bulk、search的线程数和队列数。例如以下elasticsearch.yml设置:

			# Search pool
			thread_pool.search.size: 5
			thread_pool.search.queue_size: 100
			# 这个参数慎用!强制修改cpu核数,以突破写线程数限制
			# processors: 16
			# Bulk pool
			thread_pool.bulk.size: 16
			thread_pool.bulk.queue_size: 300
			# Index pool
			thread_pool.index.size: 16
			thread_pool.index.queue_size: 300

``
大数量写入的场景,会占用大量的网络带宽,很可能使节点之间的心跳超时。并且默认的心跳间隔也相对过于频繁(1s检测一次)此项配置将大大缓解节点间的超时问题

discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s

补充 :常用线程池参数设置

  threadpool.index.type: fixed 写索引线程池类型
  threadpool.index.size: 64 线程池大小(建议2~3倍cpu数)
  threadpool.index.queue_size: 1000 队列大小
  threadpool.search.size: 64 搜索线程池大小
  threadpool.search.type: fixed 搜索线程池类型 
  threadpool.search.queue_size: 1000 队列大小
  threadpool.get.type: fixed 取数据线程池类型 
  threadpool.get.size: 32 取数据线程池大小
  threadpool.get.queue_size: 1000 
  队列大小threadpool.bulk.type: fixed 批量请求线程池类型 
  threadpool.bulk.size: 32 批量请求线程池大小
 threadpool.bulk.queue_size: 1000 
 队列大小threadpool.flush.type: fixed 
 刷磁盘线程池类型 threadpool.flush.size: 32  刷磁盘线程池大小 threadpool.flush.queue_size: 1000 队列大小

你可能感兴趣的:(elasticsearch学习)