Docker的Spark顶上不接受工作

时间:2014-05-28 21:28:50

标签: scala apache-spark

我试图使用spark + docker创建一个hello world示例,这是我的代码。

object Generic {
  def main(args: Array[String]) {
    val sc = new SparkContext("spark://172.17.0.3:7077", "Generic", "/opt/spark-0.9.0")

    val NUM_SAMPLES = 100000
    val count = sc.parallelize(1 to NUM_SAMPLES).map{i =>
      val x = Math.random * 2 - 1
      val y = Math.random * 2 - 1
      if (x * x + y * y < 1) 1.0 else 0.0
    }.reduce(_ + _)

    println("Pi is roughly " + 4 * count / NUM_SAMPLES)
  }
}

当我运行sbt run时,我得到了

14/05/28 15:19:58 INFO client.AppClient$ClientActor: Connecting to master spark://172.17.0.3:7077...
14/05/28 15:20:08 WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory

我检查了集群UI,其中我有3个节点,每个节点有1.5g内存,以及namenode UI,我看到同样的事情。

docker日志显示工作人员没有输出,主人

显示以下内容
14/05/28 21:20:38 ERROR EndpointWriter: AssociationError [akka.tcp://sparkMaster@master:7077] -> [akka.tcp://spark@10.0.3.1:48085]: Error [Association failed with [akka.tcp://spark@10.0.3.1:48085]] [
akka.remote.EndpointAssociationException: Association failed with [akka.tcp://spark@10.0.3.1:48085]
Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$anon$2: Connection refused: /10.0.3.1:48085

这种情况发生了几次,然后程序超时并以

消亡
[error] (run-main-0) org.apache.spark.SparkException: Job aborted: Spark cluster looks down

当我在docker0接口上执行tcpdump时,看起来工作者和主节点正在说话。

但是,火花控制台可以正常工作。

如果我将sc设置为val sc = new SparkContext("local", "Generic", System.getenv("SPARK_HOME")),则程序会运行

3 个答案:

答案 0 :(得分:5)

我去过那里。问题看起来像Spark中的AKKA actor子系统绑定在与docker0上的Spark不同的接口上。​​

当你的主IP开启时:spark://172.17.0.3:7077

Akka绑定于:akka.tcp://spark@10.0.3.1:48085

如果主站/从站是docker容器,它们应该通过172.17.x.x范围内的docker0接口进行通信。

尝试使用env config SPARK_LOCAL_IP为主设备和从设备提供正确的本地IP。有关详细信息,请参阅config docs

在Spark 0.9的docker设置中,我们使用此命令启动从站:

${SPARK_HOME}/bin/spark-class org.apache.spark.deploy.worker.Worker $MASTER_IP -i $LOCAL_IP 

直接向工作人员提供本地IP。

答案 1 :(得分:0)

为了在Docker上运行spark,它对

至关重要
  1. 公开所有必要的端口
  2. 设置正确的spark.broadcast.factory
  3. 处理泊坞窗别名
  4. 如果不处理所有3个问题,火花集群部分(主人,工人,司机)都无法沟通。您可以在http://sometechshit.blogspot.ru/2015/04/running-spark-standalone-cluster-in.html上仔细阅读每个问题,或使用容器准备好来自https://registry.hub.docker.com/u/epahomov/docker-spark/

    的火花

答案 2 :(得分:0)

如果您在Windows主机上,则必须检查防火墙,并确保允许java.exe访问公共网络或将dockerNAT更改为私有。通常,worker 必须能够连接回驱动程序(您提交的程序)。