apache-spark - 限制从 Apache Spark 写入 ES
问题描述
在我们的项目中,我们使用 Apache Spark 写入 ES。我们运行多个并行写入 ES 的 spark 作业。我们正在处理的数据量太大,导致写入吞吐量高达约 5K 写入/秒。
我们希望限制我们的 ES 写入,以将其降低到 500 到 1000 写入/秒的范围。我们遇到过类似的 ES 配置es.batch.size.bytes
,es.batch.size.entries
但我们不确定这些配置如何与 Apache Spark 一起使用。
解决方案
在 Spark 中使用 重新分区您的数据,或者如果您要降低分区数量repartition()
则更可取的是,这是一种限制对 ES 的索引速率的简单方法。coalesce()
如果要在 pyspark 中设置属性
esconf={}
esconf["es.mapping.id"] = "_id"
esconf["es.nodes"] = "localhost"
esconf["es.port"] = "9200"
esconf["es.batch.size.bytes"] = "1000000" //default 1mb for bulk request
esconf["es.batch.size.entries"] = "1000" //default 1000 for bulk request
df.write.format("org.elasticsearch.spark.sql").options(**esconf).mode("append").save("index_name")
注意:请注意,批量大小和条目是按任务实例分配的。始终乘以 Hadoop 作业中的任务数,以获得运行时到达 Elasticsearch 的总批量大小/条目。这就是您获得 5K 写入/秒的原因
推荐阅读
- sql-server - 如何在 Peewee 中覆盖 LIMIT 和 OFFSET?
- python - 使用字典理解将函数应用于每个键的特定子键
- tensorflow - 为什么第一个密集层不“密集”?
- python-3.x - 在 Python 中添加 Mock 对象
- python - 在numpy中覆盖矩阵行的有效方法
- python - 使用 Python 在 Visual Studio Code 中调试不起作用
- prolog - prolog 将函数调用视为结构定义
- c# - 如何在 lua cpp 模块中调用托管 c++ dll 函数
- c# - 为什么受“枚举”约束的泛型类型在 C# 7.3 中无法成为“结构”?
- reporting-services - 需要将 proc 结果转换为 SSRS