我正在尝试使用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"))
,则程序运行
我去过那儿.问题看起来像Spark中的AKKA actor子系统绑定在与docker0上的Spark不同的接口上.
当您的主IP开启时: spark://172.17.0.3:7077
Akka对以下内容具有约束力 akka.tcp://spark@10.0.3.1:48085
如果master/slaves是docker容器,则它们应该通过172.17.xx范围内的docker0接口进行通信.
尝试使用env配置为主设备和从设备提供正确的本地IP SPARK_LOCAL_IP
.有关详细信息,请参阅配置文档
在Spark 0.9的docker设置中,我们使用此命令启动从站:
${SPARK_HOME}/bin/spark-class org.apache.spark.deploy.worker.Worker $MASTER_IP -i $LOCAL_IP
这直接为工作人员提供本地IP.