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实际占用的端口

    参考Spark(五十):使用JvisualVM监控Spark Executor JVM