本文共 2907 字,大约阅读时间需要 9 分钟。
前言
最近sparksql写入elasticsearch数据量逐渐增大,所以需要优化写入的速度. 先说一下集群情况. es集群:elasticsearch-6.2.4, 机器配置:5台4C*16G阿里云机器. spark: 2.1.3.优化方向
从spark参数和es索引两个方向进行优化spark参数
es提供了一套完整的hadoop生态支持.可以完整的支持spark读写es. 在spark的config可以设置两个参数,es.batch.size.bytes 以及es.batch.size.entries
,这两个参数表示写入时es bulk操作的batch大小和条数.这些设置对应到每个task中.hadoop/spark 相关配置信息见链接: 这两个参数默认1mb和1000条,在调节的时候也不是越大越好,需要根据自己的数据不断的去测试. index参数
number_of_replicas:0
,在大量数据写入的时候,数据从主分片往副本同步数据,也是很消耗资源的.在数据写入完成后,可以恢复副本,副本的主要作用是容灾和负载均衡,可以参考elasticsearch权威指南:translog.durability
为async.translog.durability 默认值是request,该属性类似于hbase 中的WAL,是为了防止数据写入后 ,还没有落盘之前 出现宕机导致数据丢失。client提交request后,除了在in-memory buffer 添加新的文档/操作,还需要在translog 追加新的文档/操作 ,以保证数据的可靠性 。 其实translog.durability 属性可以设置为async,当然async并不能保证新的文档/操作一定写入到trans-log,如果写到translog 没有成功 刚好这时也出现宕机,重启后从translog恢复时就会有数据丢失,所以我们需要在做好数据可靠性和写入效率之间做好权衡后再设置 。translog在 满足下面其中一个条件时 会执行commit 请求即filesystem cache 刷写到磁盘 condition1:缓存数据达到512M(default) condition2 : 缓存时间达到5s(default),commit成功后translog会删除. 这个参数也是在创建索引的时候设置的. 4.translog.sync_interval, translog.flush_threshold_size 设置translog.sync_interval, translog.flush_threshold_size
,这两个参数的作用已经在上面说明了.可以再创建索引的时候把这两个参数设大一些.修改elasticsearch的yml文件
网上很多博客都说修改yml的部分参数,也可以优化写入速度,但是我没有测.还是写出来供大家参考.# Search poolthread_pool.search.size: 5thread_pool.search.queue_size: 100# 这个参数慎用!强制修改cpu核数,以突破写线程数限制# processors: 16# Bulk poolthread_pool.bulk.size: 16thread_pool.bulk.queue_size: 300# Index poolthread_pool.index.size: 16thread_pool.index.queue_size: 300
discovery.zen.fd.ping_timeout: 120sdiscovery.zen.fd.ping_retries: 6discovery.zen.fd.ping_interval: 30s
其他调整
最后, 我这里只搭配调整了3,4,6里的大部分设置,写入速度大概提升了4~5倍左右. 这里只是记录了实际对写入有提升的一些配置,还没有深入研究有扩展继续填坑.
参考:
转载地址:http://ykjkb.baihongyu.com/