首页 > 解决方案 > Apache Spark:在 map reduce 管道中获取执行者 ID

问题描述

关于如何在 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 执行器 ID,所以我去使用SparkEnv.executorId()在官方文档中找到的。

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

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

如果是,请如何解决此非静态方法“executorId()”问题?

如果没有,请问获得执行人 ID 的最佳选择是什么?

谢谢

标签: javaapache-spark

解决方案


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

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();

推荐阅读