【问题标题】:Apache Spark error : Could not connect to akka.tcp://sparkMaster@Apache Spark 错误:无法连接到 akka.tcp://sparkMaster@
【发布时间】:2015-04-11 19:02:46
【问题描述】:

这是我们使用 apache spark 和 hadoop 等大数据工具的第一步。

我们已经安装了 Cloudera CDH 5.3。从cloudera manager我们选择安装spark。 Spark 在集群中的一个节点上运行良好。

我从我的机器上创建了一个小应用程序,用于连接读取存储在 hadoop HDFS 上的文本文件。

我正在尝试从 Eclipse 运行应用程序,它会显示这些消息

15/02/11 14:44:01 INFO client.AppClient$ClientActor: Connecting to master spark://10.62.82.21:7077... 15/02/11 14:44:02 WARN client.AppClient$ClientActor: Could not connect to akka.tcp://sparkMaster@10.62.82.21:7077: akka.remote.InvalidAssociation: Invalid address: akka.tcp://sparkMaster@10.62.82.21:7077 15/02/11 14:44:02 WARN Remoting: Tried to associate with unreachable remote address [akka.tcp://sparkMaster@10.62.82.21:7077]. Address is now gated for 5000 ms, all messages to this address will be delivered to dead letters. Reason: Connection refused: no further information: /10.62.82.21:7077

应用程序有一个类使用以下行创建上下文

JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("Spark Count").setMaster("spark://10.62.82.21:7077"));

此 IP 是 spark 正在运行的机器的 IP。

然后我尝试使用以下行从 HDFS 读取文件

sc.textFile("hdfs://10.62.82.21/tmp/words.txt")

当我运行应用程序时,我得到了

【问题讨论】:

  • 您是否为同一台机器配置了多个 IP?
  • 其实我不知道,但是如果我使用域名而不是IP会抛出同样的异常。
  • 触发 ifconfig 时会看到什么
  • 我已经和系统管理员核实过,这台机器只有一个 IP。其实我怀疑Spark的安装。机器上正在运行一个 spark 进程(pgrep -f spark 使用进程 ID 回复)但是当我们启动 spark-shell 时,它会在显示一些异常后打开 scala shell。有没有办法确保正确安装火花?
  • 打开外壳后会出现哪些异常?你正在连接到主人吗?

标签: hadoop apache-spark cloudera


【解决方案1】:

检查您的 Spark 主日志,您应该会看到如下内容:

15/02/11 13:37:14 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkMaster@mymaster:7077]
15/02/11 13:37:14 INFO Remoting: Remoting now listens on addresses: [akka.tcp://sparkMaster@mymaster:7077]
15/02/11 13:37:14 INFO Master: Starting Spark master at spark://mymaster:7077

那么当你连接到master时,一定要使用与上面日志中完全相同的主机名(不要使用IP地址):

.setMaster("spark://mymaster:7077"));

Spark 独立版对这个主机名/IP 的东西有点挑剔。

【讨论】:

  • 机器有域名,如果我用它而不是IP,也会抛出同样的异常。
  • Spark 独立的另一个缺陷是它充当对等系统。您的客户端/驱动程序应用程序必须可由主节点加入。您可能已禁用防火墙设置并添加到 SparkConf: .set("spark.driver.host", "mydriverapp") .set("spark.driver.port", "7076")
【解决方案2】:

当您使用 shell 命令“sbin/start-master.sh”创建 Spark 主服务器时。转到地址http://localhost:8080 并检查“URL”行。

【讨论】:

  • 这是个好建议,同时我今天在测试中发现如果URL显示主机名,无论如何它都无法连接。只有当我设置一个设置(SPARK_MASTER_IP)并使用 IP 地址时,它才会连接。
【解决方案3】:

我注意到没有接受的答案,只是为了提供信息,我想我会提到几件事。

首先,在conf目录下的spark-env.sh文件中,SPARK_MASTER_IP和SPARK_LOCAL_IP设置可以是主机名。你不希望他们成为,但他们可以。

正如另一个答案中所述,Spark 对主机名与 IP 地址可能有点挑剔,因为这个已解决的错误/功能:See bug here。问题是,不清楚他们“解决”是否只是通过告诉我们使用 IP 而不是主机名?

嗯,我现在也有同样的问题,你要做的第一件事就是检查基础知识。

你能 ping 通 Spark master 运行的盒子吗?你能从主人那里ping通工人吗?更重要的是,你能从 master box 对 worker 进行无密码 ssh 吗? Per 1.5.2 docs 您需要能够使用私钥执行此操作,并将工作人员输入到 conf/slaves 文件中。我复制了最后的相关段落。

您可能会遇到这样的情况,工作人员可以联系主人,但主人无法回复工作人员,因此看起来没有建立任何联系。检查两个方向。

最后在所有设置组合中,在刚才的一个有限实验中,我只找到了一个重要的:在 master 上,在 spark-env.sh 中,将 SPARK_MASTER_IP 设置为 IP 地址,而不是主机名。 然后用 spark://192.168.0.10:7077 从工人连接,瞧,它连接了!这里似乎不需要其他配置参数。

这是 conf 中关于 ssh 和 slaves 文件的文档中的段落:

要使用启动脚本启动 Spark 独立集群,您 应该在 Spark 目录中创建一个名为 conf/slaves 的文件,该文件 必须包含您打算安装的所有机器的主机名 启动 Spark 工作人员,每行一个。如果 conf/slaves 不存在,则 启动脚本默认为单台机器 (localhost),即 对测试有用。注意,主机访问每个 通过 ssh 的工作机器。默认情况下,ssh 是并行运行的,并且 需要设置无密码(使用私钥)访问。如果 您没有无密码设置,您可以设置环境 变量 SPARK_SSH_FOREGROUND 并依次为每个 工人。

完成此操作后,使用 IP 地址应该可以在您的代码中使用。让我们知道!这可能是一个烦人的问题,并且了解大多数配置参数并不重要。

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2017-06-27
    相关资源
    最近更新 更多