【发布时间】:2020-08-27 06:53:24
【问题描述】:
我正在将数据从 elasticsearch 移动到 hdfs。 数据大小约200GB,8000万条数据。
这是我的代码。非常简单。只需读取es,然后写入hdfs。
// 1. config setting
public Map<String, String> esConfigParam() {
return new ImmutableMap.Builder<String, String>()
.put("es.nodes", params.getEsNodes())
.put("es.mapping.date.rich", "false")
.put("pushdown", "true")
.put("es.scroll.size", params.getScrollSize())
.put("es.read.field.as.array.include","label")
.put("es.input.json", "true")
.put("es.read.metadata", "true").build();
}
// 2. load ES data
Dataset<Row> dataSet = JavaEsSparkSQL.esDF(session.getSqlContext(), indexAlias, esConfigParam());
// 3. write to hdfs
dataSet.write()
.mode(SaveMode.Overwrite)
.option("compression", "gzip")
.parquet(params.getWritePath());
我认为以下是提高性能的调整点。
- 火花设置: executor-cores 5 / num-executors 16 / executor-memory 4g / driver-memory 4g
- ES 读取设置:params.getScrollSize()=2000
在这种情况下大约需要 30 分钟。 请告诉我如何通过提高写入性能来缩短时间。 (例如,申请 colesce(10) ??)
【问题讨论】: