有什么方法可以改善火花写入性能?

时间:2020-08-27 06:53:24

标签: apache-spark-sql parquet

我正在将数据从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());

我认为以下是提高性能的调整点。

  1. 火花设置: executor-cores 5 / num-executors 16 / executor-memory 4g / driver-memory 4g
  2. ES读取设置:params.getScrollSize()= 2000

在这种情况下,大约需要30分钟。 请告诉我如何通过改善写入性能来缩短时间。 (例如,应用colesce(10)?)

1 个答案:

答案 0 :(得分:2)

一个非常有趣的问题!

出于讨论的目的,我假设您的集群有4个节点,每个节点16个核心,每个节点64GB。

(对于您的特殊情况,您需要了解此信息并应用以下示例)

由于以下三个原因,您无法使用群集的所有资源:

  • 每个节点至少需要1个内核和1GB来运行OS和YARN进程。
  • 也许其他应用程序可以同时使用群集。
  • 我们假设AM在其中一个节点上运行。

那么,实际上,您有4个节点,每个节点15个核心,每个节点63GB可用。

您可以认为一个好主意必须是--num-executors 4 --executor-cores 15 --executor-memory 63G,但是不要!

原因:

  • 首先,您要考虑内存开销(执行器内存的大约7%),即63GB + 7%= 67.41> 64GB
  • 第二,您将使用节点中的所有核心,但是您需要其中一个核心来运行AM(应用程序管理器)
  • 最后,每个执行者15个内核可能会导致HDFS I / O吞吐量下降。

一个好的方法是--num-executors 11 -executor-cores 4 -executor-memory 19G:

  • 节点1,2,3:每个节点将使用3个执行器和12个内核(SO和其他进程免费使用3个内核)
  • 节点4:将使用2个执行程序和8个内核(另外8个内核免费用于AM,SO和其他进程)
  • 每个执行者将使用19GB + 7%(开销)= 20.33GB
  • 节点1,2,3:将使用20.33 * 3个执行程序= 60.99GB(3GB免费)
  • 节点4:将使用40,66GB(用于AM,SO和其他进程的23,44 GB可用空间)

这不是您可以使用的唯一配置,还有其他配置。

结论,调教火花始终是一项艰巨的任务。您必须知道您的群集资源(内存,节点和核心)。

官方cloudera博客中的其他信息:https://blog.cloudera.com/how-to-tune-your-apache-spark-jobs-part-2/