Spark + Elastic搜索写入性能问题

时间:2017-10-18 15:00:18

标签: apache-spark elasticsearch elasticsearch-hadoop elasticsearch-spark

使用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

使用此配置,我尝试加载1Million文档(每个文档的大小为1300字节),因此它可以为每个ES节点加载500条记录/文档。

并在火花日志中看到每个任务

 -1116 bytes result sent to driver

Spark Code

    JavaRDD<String> javaRDD = jsc.textFile("<S3 Path>");
    JavaEsSpark.saveJsonToEs(javaRDD,"<Index name>");

此外,当我查看ES群集中​​的网内图时,它非常低,我看到EMR没有通过网络发送大量数据。有没有办法告诉Spark发送正确数量的数据以使写入更快?

OR

是否有任何其他配置我缺少调整。 因为我看到每个实例的每秒500docs更低。有人可以指导这个设置缺少什么来提高我的写作性能

提前致谢

1 个答案:

答案 0 :(得分:0)

您可能在此处遇到问题。 spark.executor.instances=2

您只能使用两个执行程序,根据您的群集配置,您可以拥有4个执行程序。我会把它改为4或更高。我也可以尝试executor-memory = 1500M,cores = 1,instances = 16。我喜欢在我的记忆中留下一点开销,这就是为什么我从2G降到1.5G(但你不能做1.5G因此我们必须做1500M)。如果您通过执行程序进行连接,则可以提高性能。

需要一些代码才能进一步调试。我想知道你是否只在你的驱动程序中连接到弹性搜索,而不是在你的工作节点中。这意味着每个执行程序只能获得一个连接而不是一个连接。