首页 > 解决方案 > 在 SparkSession 中连接到远程 Dataproc 主服务器

问题描述

我在 Google Cloud Dataproc 上创建了一个 3 节点(1 个主节点,2 个工作节点)Apache Spark 集群。通过 ssh 与主服务器连接时,我可以向集群提交作业,但是我无法让它远程工作。除了 AWS 上的类似问题外,我找不到任何有关如何执行此操作的文档,但这对我不起作用。

这是我正在尝试的

import pyspark
conf = pyspark.SparkConf().setAppName('Test').setMaster('spark://<master-node-ip>:7077')
sc = pyspark.SparkContext(conf=conf)

我得到错误

19/11/13 13:33:49 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
19/11/13 13:33:53 WARN StandaloneAppClient$ClientEndpoint: Failed to connect to master <master-node-ip>:7077
org.apache.spark.SparkException: Exception thrown in awaitResult: 
        at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:226)
        at org.apache.spark.rpc.RpcTimeout.awaitResult(RpcTimeout.scala:75)
        at org.apache.spark.rpc.RpcEnv.setupEndpointRefByURI(RpcEnv.scala:101)
        at org.apache.spark.rpc.RpcEnv.setupEndpointRef(RpcEnv.scala:109)
        at org.apache.spark.deploy.client.StandaloneAppClient$ClientEndpoint$$anonfun$tryRegisterAllMasters$1$$anon$1.run(StandaloneAppClient.scala:106)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Failed to connect to /<master-node-ip>:7077
        at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:245)
        at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:187)
        at org.apache.spark.rpc.netty.NettyRpcEnv.createClient(NettyRpcEnv.scala:198)
        at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:194)
        at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:190)
        ... 4 more
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: /<master-node-ip>:7077
        at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
        at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
        at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:323)
        at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:340)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:633)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
        at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
        ... 1 more
Caused by: java.net.ConnectException: Connection refused

我添加了一条防火墙规则以允许 tcp:7077 上的入口流量。但这并不能解决问题。

最后,我想在计算引擎上设置一个虚拟机,它可以运行此代码,同时通过内部 IP 地址(在我创建的 VPC 中)连接以在 dataproc 上运行作业而不使用gcloud dataproc jobs submit. 我通过内部和外部 IP 都尝试过,但都没有工作。

有谁知道我怎样才能让它工作?

标签: apache-sparkhadoopgoogle-cloud-dataproc

解决方案


所以这里有一些东西要解压。

我要确保您理解的第一件事是,在将分布式计算框架暴露给入口流量时,您应该非常小心。如果 Dataproc 在端口 7077 上公开了 Spark-Standalone 集群,您需要确保锁定该入口流量。听起来您知道通过共享 VPC 上的虚拟机来了解这一点,但即使在测试您是否打开防火墙时,这也非常重要。

看起来您遇到的主要问题是您似乎正在尝试连接,就好像它是Spark-Standalone cluster一样。Dataproc 实际上在 YARN 上使用 Spark。要连接,您需要将 Spark 集群管理器类型设置为“yarn”,并正确配置本地计算机以与远程 YARN 集群通信,方法是设置 ayarn-site.xmlHADOOP_CONF_DIR指向它,或者直接设置YARN 属性,如yarn.resourcemanager.addressvia spark-submit --conf.

另请注意,一旦您知道 Dataproc 使用 YARN,这与此问题类似:Scala Spark connect to remote cluster


推荐阅读