apache-spark - Spark + Elastic搜索写入性能问题

标签 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

使用这种配置,我尝试加载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/

相关文章:

python - Django:在单个应用程序中使用 MySQL 和 ElasticSearch

scala - 将 Scalaz 与 Spark 结合使用时出现不可序列化异常

elasticsearch - Spark流到ElasticSearch

apache-spark - 如何在 spark yarn 客户端模式下更新 Kerberos 票证?

spring - 如何让elasticsearch数据与MySql保持同步?

geolocation - ElasticSearch 中的地理排序和距离计算不起作用

scala - 无法通过 Elasticsearch-hadoop 库在多个 spark 节点上的 RDD 上应用映射

serialization - ElasticSearch 到 Spark RDD

elasticsearch - 如何将es.nodes参数设置为Spark的多个Elasticsearch节点?

python - 来自 Spark 数据帧的 block topandas