在Java Spark应用中获取当前运行任务的AWS EMR集群ID
解决方案
方案1:传递环境变量(适配原有代码逻辑)
你之前获取不到EMR_CLUSTER_ID的核心原因是:该环境变量默认仅在EMR主节点的系统服务进程中存在,Spark的Driver、Executor进程默认不会继承该变量,你只需要在提交Spark作业时添加两个配置参数,把环境变量传递到Spark进程即可:
spark-submit \ --conf spark.yarn.appMasterEnv.EMR_CLUSTER_ID=$EMR_CLUSTER_ID \ --conf spark.executorEnv.EMR_CLUSTER_ID=$EMR_CLUSTER_ID \ --class <你的业务主类全限定名> \ <你的Jar包路径>
如果是通过EMR Steps提交作业,直接在Step的Spark命令里添加上述参数即可,Step运行环境默认可以读取到$EMR_CLUSTER_ID变量的值,不需要额外配置。
配置完成后,你原有代码String emrClusterID = System.getenv("EMR_CLUSTER_ID");就可以正常获取到集群ID。
方案2:读取EMR内置配置文件(无需修改提交参数)
如果没有权限调整作业提交参数,可以直接读取EMR所有节点默认内置的集群配置文件/mnt/var/lib/info/job-flow.json,该文件是集群启动时自动生成的,其中jobFlowId字段就是集群ID,Java代码示例如下:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; public class EmrClusterUtil { public static String getCurrentClusterId() throws Exception { File emrConfigFile = new File("/mnt/var/lib/info/job-flow.json"); ObjectMapper mapper = new ObjectMapper(); JsonNode jsonRoot = mapper.readTree(emrConfigFile); return jsonRoot.get("jobFlowId").asText(); } }
该方案不需要调用AWS API,也不需要提前知道集群名称、标签等信息,适配所有EMR版本,稳定性更高。
内容的提问来源于stack exchange,提问作者seou1
相关产品推荐
相关产品推荐

