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

标签 apache-spark hadoop google-cloud-dataproc

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

这是我正在尝试的

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 上的入口流量。但这并不能解决它。

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

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

最佳答案

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

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

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

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

关于apache-spark - 在 SparkSession 中连接到远程 Dataproc 主节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58838594/

相关文章:

python - 将 DenseVector 存储在 PySpark 的 DataFrame 列中

java - 如何将每个 RDD 分区限制为仅 'n' 条记录?

hadoop - HDFS孤立文件可以在datanode中吗?

apache-spark - GCP Dataproc 与 Elasticsearch

python - 在 PySpark Builder 中设置 PySpark 序列化器

scala - 从RDD获取值

testing - 使用 Hive 进行数据测试

sql - 从3张 table 中选择HIVE

apache-spark - 使用 Cloud SQL 代理从 Dataproc 连接到 Cloud SQL

python-2.7 - PySpark打印到控制台