如何通过 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 工作器的主要内容,如果未能解决你的问题,请参考以下文章
仍然可以使用 Java Mission Control 连接到远程 JMX 但证书已过期?
如何使用 JMX 连接到在 EC2 上运行的 Java 实例