看到使用spark java的elasticsearch写入次数很少。
以下是配置
对ES集群使用13.xlarge机器
4 instances each have 4 processors.
Set refresh interval to -1 and replications to '0' and other basic
configurations required for better writing.
火花:
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万个文档(每个文档的大小为1300Bytes),因此它在每个ES节点上加载500条记录/文档。
在spark日志中,我看到了每项任务
-1116 bytes result sent to driver
Spark代码
JavaRDD<String> javaRDD = jsc.textFile("<S3 Path>");
JavaEsSpark.saveJsonToEs(javaRDD,"<Index name>");
此外,当我查看ES集群中的In-Network图时,它非常低,我看到EMR没有通过网络发送大量数据。有没有办法让Spark发送适当数量的数据来加快写入速度?
或
是否有任何其他配置我遗漏了调整。因为我看到每个es实例每秒500个文档更低。有没有人可以指导我在这个设置中缺失了什么,以提高我的es写入性能
提前感谢
发布于 2017-10-18 23:54:29
您可能在这里有一个问题。spark.executor.instances=2
您被限制为两个executors,根据您的集群配置,您可以有4个。我会将其更改为4或更大。我也可以尝试executor-memory = 1500M,cores=1,instances=16。我喜欢在内存中留下一点开销,这就是为什么我从2G下降到1.5G (但你不能做1.5G,所以我们必须做1500M)。如果你是通过你的执行器连接的,这将会提高性能。
需要一些代码来进一步调试。我想知道你是否只在你的驱动中连接到elastic search,而不是在你的worker节点中。这意味着您只能获得一个连接,而不是每个executor都有一个连接。
https://stackoverflow.com/questions/46813305
复制相似问题