基本Spark示例不起作用

时间:2016-02-16 13:45:09

标签: apache-spark

我正在学习Spark并希望运行由两台物理机器组成的最简单的集群。我已完成所有基本设置,似乎没问题。自动启动脚本的输出如下所示:

getEntityManager().createNativeQuery("LOCK TABLE schemaname.tablename").executeUpdate();

所以这里没有错误,似乎主节点正在运行以及两个Worker节点。但是,当我在192.168.?????:8080打开WebGUI时,它只列出一个工作人员 - 本地工作人员。我的问题类似于此处描述的问题:Spark Clusters: worker info doesn't show on web UI但我的/ etc / hosts文件中没有任何内容。它包含的全部是:

[username@localhost sbin]$ ./start-all.sh 
starting org.apache.spark.deploy.master.Master, logging to /home/username/spark-1.6.0-bin-hadoop2.6/logs/spark-username-org.apache.spark.deploy.master.Master-1-localhost.out
localhost: starting org.apache.spark.deploy.worker.Worker, logging to /home/sername/spark-1.6.0-bin-hadoop2.6/logs/spark-username-org.apache.spark.deploy.worker.Worker-1-localhost.out
username@192.168.???.??: starting org.apache.spark.deploy.worker.Worker, logging to /home/username/spark-1.6.0-bin-hadoop2.6/logs/spark-username-org.apache.spark.deploy.worker.Worker-1-localhost.localdomain.out

我错过了什么? 两台机器都在运行Fedora Workstation x86_64。

3 个答案:

答案 0 :(得分:5)

基本上问题的根源是主主机名解析为e.Values。它在两个控制台输出中都可见:

localhost

其中最后一部分对应于主机名。您可以在主日志中看到相同的行为:

starting org.apache.spark.deploy.master.Master, logging to 
/home/.../spark-username-org.apache.spark.deploy.master.Master-1-localhost.out

和远程工作人员日志:

16/02/17 11:13:54 WARN Utils: Your hostname, localhost resolves to a loopback address: 127.0.0.1; using 192.168.128.224 instead (on interface eno1)

这意味着远程工作人员试图访问16/02/17 11:13:58 WARN Worker: Failed to connect to master localhost:7077 java.io.IOException: Failed to connect to localhost/127.0.0.1:7077 at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:216) at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:167) at org.apache.spark.rpc.netty.NettyRpcEnv.createClient(NettyRpcEnv.scala:200) at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:187) at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:183) 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:745) Caused by: java.net.ConnectException: Connection refused: localhost/127.0.0.1:7077 上的主人并且显然失败了。即使工人能够连接到主人,我也不会出于同样的原因反向工作。

解决此问题的一些方法:

  • 为worker和master提供适当的网络配置,以确保每台计算机使用的主机名可以正确解析为相应的IP地址。
  • 使用ssh隧道转发远程工作人员和主人之间所需的所有端口。

答案 1 :(得分:4)

似乎火花对IP和机器名称非常挑剔。因此,在启动主站时,它将使用您的机器名称来注册spark master。 如果您的工人无法获得该名称,则几乎无法联系到该名称。

解决方法是像这样启动你的主人

SPARK_MASTER_IP=YOUR_SPARK_MASTER_IP ${SPARK_HOME}/sbin/start-master.sh

然后,您将能够像这样连接您的奴隶

${SPARK_HOME}/sbin/start-slave.sh spark://**YOUR_SPARK_MASTER_IP**:PORT

然后你去!

答案 2 :(得分:0)

通过在$ SPARK_HOME / conf / spark-env.sh中提供SPARK_MASTER_IP,我遇到了类似问题。 spark-env.sh实际上设置了一个环境变量SPARK_MASTER_IP,它指向要与Master绑定的IP。然后start-master.sh读取此变量并将Master绑定到它。现在SPARK_MASTER_IP在Master正在运行的框外可见。