使用Spark Java看到对Elasticsearch的写入次数低。
这是配置
将13.xlarge机器用于ES群集
4 instances each have 4 processors.
Set refresh interval to -1 and replications to '0' and other basic
configurations required for better writing.
Spark :
2节点EMR集群
2 Core instances
- 8 vCPU, 16 GiB memory, EBS only storage
- EBS Storage:1000 GiB
1 Master node
- 1 vCPU, 3.8 GiB memory, 410 SSD GB storage
ES索引在映射中定义了16个分片。
在运行作业时配置低于
executor-memory - 8g
spark.executor.instances=2
spark.executor.cores=4
和使用
es.batch.size.bytes - 6MB
es.batch.size.entries - 10000
es.batch.write.refresh - false
使用这种配置,我尝试加载100万个文档(每个文档的大小为1300字节),因此每个ES节点的加载量为500个记录/文档。
在星火日志中看到了每个任务
-1116 bytes result sent to driver
Spark 代码
JavaRDD<String> javaRDD = jsc.textFile("<S3 Path>");
JavaEsSpark.saveJsonToEs(javaRDD,"<Index name>");
另外,当我查看ES群集中的In-Network图时,它非常低,而且我看到EMR没有通过网络发送大量数据。有没有一种方法可以告诉Spark发送正确数量的数据以加快写入速度?
要么
还有其他我想调整的配置吗?
原因我看到每个实例每秒500docs的速度较低。有人可以指导此设置缺少什么以提高我的ES写入性能
提前致谢
最佳答案
您可能在这里遇到问题。spark.executor.instances=2
您仅限于两个执行程序,根据群集配置,您可以有四个执行程序。我将其更改为4或更大。我也可以尝试executor-memory = 1500M,cores = 1,instances = 16。我想在内存中留一点开销,这就是为什么我从2G下降到1.5G(但是您不能做1.5G,所以我们必须做1500M)的原因。如果您通过执行程序进行连接,则可以提高性能。
需要一些代码来进一步调试。我想知道您是否仅在驱动程序中而不是在工作节点中连接到 flex 搜索。这意味着您只会获得一个连接,而不是每个执行器一个连接。
关于apache-spark - Spark + Elastic搜索写入性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46813305/