如何通过 JMX 远程连接到 Dataproc 上的 Spark 工作器

Posted

技术标签:

【中文标题】如何通过 JMX 远程连接到 Dataproc 上的 Spark 工作器【英文标题】:How to connect with JMX remotely to Spark worker on Dataproc 【发布时间】:2018-01-08 04:01:57 【问题描述】:

我可以通过添加以下内容很好地连接到驱动程序:

spark.driver.extraJavaOptions=-Dcom.sun.management.jmxremote \
                              -Dcom.sun.management.jmxremote.port=9178 \
                              -Dcom.sun.management.jmxremote.authenticate=false \
                              -Dcom.sun.management.jmxremote.ssl=false

但是做...

spark.executor.extraJavaOptions=-Dcom.sun.management.jmxremote \
                                -Dcom.sun.management.jmxremote.port=9178 \
                                -Dcom.sun.management.jmxremote.authenticate=false \
                                -Dcom.sun.management.jmxremote.ssl=false

...只会在驱动程序上产生一堆错误...

Container id: container_1501548048292_0024_01_000003
Exit code: 1
Stack trace: ExitCodeException exitCode=1: 
    at org.apache.hadoop.util.Shell.runCommand(Shell.java:972)
    at org.apache.hadoop.util.Shell.run(Shell.java:869)
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:1170)
    at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:236)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:305)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:84)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)


Container exited with a non-zero exit code 1

...最终导致作业崩溃。

工人没有错误,它只是退出:

[org.apache.spark.util.ShutdownHookManager] - Shutdown hook called

Spark v2.2.0,集群是一个简单的 1m-2w 配置,我的作业在没有执行器参数的情况下运行没有问题。

【问题讨论】:

您检查过这些端口是免费的吗?如果这些执行器在同一台机器上被实例化,端口冲突就会带来麻烦。 worker 上的冲突端口似乎确实是崩溃的根源。但是,否则我该如何控制呢?将其设置为0 会给我一个随机的。是否可以将不同的参数传递给不同的执行者? 我建议将执行程序内存设置得足够大,每台机器上只能容纳一个。您可能还需要调整资源管理器设置。 【参考方案1】:

正如Rick Mortiz 指出的那样,问题在于执行程序 jmx 的端口冲突。

设置:

-Dcom.sun.management.jmxremote.port=0

产生一个随机端口,并从 Spark 中删除错误。要找出最终使用的端口,请执行以下操作:

netstat -alp | grep LISTEN.*<executor-pid>/java

列出该进程当前打开的端口。

【讨论】:

【参考方案2】:

使用 spark-submit 传递以下配置对我有用 --conf "spark.executor.extraJavaOptions=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9178 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote .ssl=false"

【讨论】:

以上是关于如何通过 JMX 远程连接到 Dataproc 上的 Spark 工作器的主要内容,如果未能解决你的问题,请参考以下文章

visualvm 可以通过 JMX 自动连接到远程进程吗?

JConsole 远程连接到 JBoss EAP

仍然可以使用 Java Mission Control 连接到远程 JMX 但证书已过期?

如何使用 JMX 连接到在 EC2 上运行的 Java 实例

如何使用 JMX 连接到 localhost jvm 上的 java 程序?

将 SQLserver jdbc 驱动程序连接到 Dataproc 集群