Spark任务提交给YARN后,进行分布式的并行任务执行。
如果想知道具体executor的JVM情况,spark ui不能满足我们的需求。
有没有一种较好的方式可以支持呢?
这里记录下JMX结合JvisulaVM监控Spark Task的方法。
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=ip -Dcom.sun.management.jmxremote.port=port
在Spark中监控executor时,需要先配置jmx然后再启动spark应用程序,配置方式有三种:
1)在spark-defaults.conf中配置那三个参数
2)在spark-env.sh中配置:配置master,worker的JavaOptions
3)在spark-submit提交时配置
这里使用的是第三种方法
/usr/lib/LOCALCLUSTER/SERVICE-SPARK-f384b390e87647a597b21f3a9e00a6f9/bin/spark-submit
—conf spark.yarn.jars=hdfs://SERVICE-HADOOP-2e33730f3d424fc9914c09b826cc85e8/opt/medusa/sparkjars/.jar,hdfs://SERVICE-HADOOP-2e33730f3d424fc9914c09b826cc85e8/opt/medusa/common/task-common-0.3-SNAPSHOT.jar,hdfs://SERVICE-HADOOP-2e33730f3d424fc9914c09b826cc85e8/opt/medusa/worker/scheduler-worker-0.3-SNAPSHOT.jar,hdfs://SERVICE-HADOOP-2e33730f3d424fc9914c09b826cc85e8/opt/medusa/worker/lib/.jar,hdfs://SERVICE-HADOOP-2e33730f3d424fc9914c09b826cc85e8/opt/medusa/data/.jar,hdfs://SERVICE-HADOOP-2e33730f3d424fc9914c09b826cc85e8/opt/medusa/data/lib/_.jar
—conf spark.es.port=9200
—conf spark.es.nodes=10.3.67.138
—queue root.applications
—deploy-mode cluster —master yarn
—driver-memory 5g —driver-cores 2
—num-executors 5 —executor-cores 2 —executor-memory 10g
—class com.hikvision.medusa.scheduler.worker.third_party.SparkSubmitMain
—conf “spark.executor.extraJavaOptions=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=0 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false”
—name 16_66_DATA
/opt/medusa/services/scheduler-api-server/lib/scheduler-worker-0.3-SNAPSHOT.jar \
注意:
- 不能指定具体的 ip 和 port
- 因为spark中运行时,很可能一个节点上分配多个container进程,此时占用同一个端口,会导致spark应用程序通过spark-submit提交失败。
- 不指定具体的ip和port,在任务提交阶段会自动分配端口。
- 后续监控时需要额外在查找executor实际占用的端口