在 SparkSession 中连接到远程 Dataproc 主节点

Jut*_*uta 4 hadoop apache-spark google-cloud-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)
Run Code Online (Sandbox Code Playgroud)

我收到错误

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Koo*_*ing 5

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

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

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

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