Apache Spark:在 map reduce 管道中获取执行者 ID

Posted

技术标签:

【中文标题】Apache Spark:在 map reduce 管道中获取执行者 ID【英文标题】:Apache Spark: get the executor ID in the map reduce pipeline 【发布时间】:2021-09-07 09:15:36 【问题描述】:

关于如何在 Apache Spark 作业中获取 Spark 执行程序 ID 的小问题。

我有一段非常简单的代码:

final Dataset<Row> rowDataSet = sparkSession.read()[...].load();
final Dataset<String> stringDataSet = rowDataSet
        .map(
                (MapFunction<Row, String>) row -> 
                        doSomeTransformationFromRowToStringUsingSparkExecutorID(row, SparkEnv.executorId()), Encoders.STRING()
        );
stringDataSet.show();

问题是关于 doSomeTransformationFromRowToStringUsingSparkExecutorID 方法的。

此方法需要正在处理的行的 spark executor ID,以便进行一些转换。

由于需要Spark executor ID,所以我使用了官方文档中的SparkEnv.executorId()

不幸的是,上面的方法不起作用,因为Non-static method 'executorId()' cannot be referenced from a static context

SparkEnv.executorId() 在这种情况下甚至是获取执行者 ID 的好方法吗?

如果是,请问如何解决这个非静态方法 'executorId()' 的问题?

如果不是,请问获取执行者 ID 的最佳选择是什么?

谢谢

【问题讨论】:

【参考方案1】:

根据documentationSparkEnv类有static方法get用于获取SparkEnv实例。在这种情况下,您可以调用executorId() 方法(不是静态的):

import org.apache.spark.SparkEnv

SparkEnv sparkEnv = SparkEnv.get();
String executorId = sparkEnv.executorId();
final Dataset<Row> rowDataSet = sparkSession.read()[...].load();
final Dataset<String> stringDataSet = rowDataSet
        .map(
                (MapFunction<Row, String>) row ->
                        doSomeTransformationFromRowToStringUsingSparkExecutorID(row, SparkEnv.get().executorId()), Encoders.STRING()
        );
stringDataSet.show();

【讨论】:

谢谢@鲍里斯! (希望你在它被删除之前得到它?)

以上是关于Apache Spark:在 map reduce 管道中获取执行者 ID的主要内容,如果未能解决你的问题,请参考以下文章

Spark:在 SparkSql 中使用 map 和 reduce

`map` 和 `reduce` 方法在 Spark RDD 中如何工作?

Apache Spark reductionByWindow 函数在哪里执行?

如何从 spark rdd map 和 reduce 操作写入单个文件

如何在 Apache Spark 中实现递归算法?

如何查看hadoop mapreduce 性能