我正在将数据从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());
我认为以下是提高性能的调整点。
在这种情况下,大约需要30分钟。 请告诉我如何通过改善写入性能来缩短时间。 (例如,应用colesce(10)?)
答案 0 :(得分:2)
一个非常有趣的问题!
出于讨论的目的,我假设您的集群有4个节点,每个节点16个核心,每个节点64GB。
(对于您的特殊情况,您需要了解此信息并应用以下示例)
由于以下三个原因,您无法使用群集的所有资源:
那么,实际上,您有4个节点,每个节点15个核心,每个节点63GB可用。
您可以认为一个好主意必须是--num-executors 4 --executor-cores 15 --executor-memory 63G,但是不要!
原因:
一个好的方法是--num-executors 11 -executor-cores 4 -executor-memory 19G:
这不是您可以使用的唯一配置,还有其他配置。
结论,调教火花始终是一项艰巨的任务。您必须知道您的群集资源(内存,节点和核心)。
官方cloudera博客中的其他信息:https://blog.cloudera.com/how-to-tune-your-apache-spark-jobs-part-2/