Apache Spark Map算子内获取Executor ID的问题咨询
Spark Executor ID获取问题解答
方案合理性判定
通过SparkEnv获取Executor ID属于合理方案,你遇到的报错属于语法调用错误,和方案本身无关。
报错修复方案
executorId()是SparkEnv类的实例方法,不能直接通过类名静态调用,需要先通过静态方法SparkEnv.get()获取当前运行环境绑定的SparkEnv实例,再调用实例方法获取ID,修改后的业务代码如下:
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();
注意事项与替代方案
- 上述代码只能放在算子内部(即会下发到Executor端执行的逻辑中)调用,若在Driver端调用,返回值固定为
driver,无法获取到Executor的真实ID - 如果你需要更高的版本兼容性、不想依赖Spark内部API,可以通过读取Executor进程的环境变量获取ID,代码如下:
该环境变量由Spark在启动Executor进程时默认注入,属于更稳定的获取方案。String executorId = System.getenv("EXECUTOR_ID");
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

