首页 文章

Apache Spark:“未能启动org.apache.spark.deploy.worker.Worker”或Master

提问于
浏览
7

我在Openbuack上创建了一个Spark集群,在Ubuntu14.04上运行,内存为8GB . 我创建了两个虚拟机,每个虚拟机3GB(为父操作系统保留2 GB) . 此外,我从第一台虚拟机和第二台机器的3名 Worker 创建了一个主人和两名 Worker .

spark-env.sh文件具有基本设置

export SPARK_MASTER_IP=10.0.0.30
export SPARK_WORKER_INSTANCES=2
export SPARK_WORKER_MEMORY=1g
export SPARK_WORKER_CORES=1

每当我使用start-all.sh部署集群时,我都会“无法启动org.apache.spark.deploy.worker.Worker”,有时“无法启动org.apache.spark.deploy.master.Master” . 当我看到日志文件以查找错误时,我得到以下内容

Spark命令:/ usr / lib / jvm / java-7-openjdk-amd64 / bin / java -cp> /home/ubuntu/spark-1.5.1/sbin /../ conf /:/ home / ubuntu / spark - > 1.5.1 /组件/目标/阶-2.10 /火花组件-1.5.1-> hadoop2.2.0.jar:/home/ubuntu/spark-1.5.1/lib_managed/jars/datanucleus-api-> JDO -3.2.6.jar:/home/ubuntu/spark-1.5.1/lib_managed/jars/datanucleus-core-> 3.2.10.jar:/home/ubuntu/spark-1.5.1/lib_managed/jars/datanucleus- rdbms-> 3.2.9.jar -Xms1g -Xmx1g -XX:MaxPermSize = 256m> org.apache.spark.deploy.master.Master --ip 10.0.0.30 --port 7077 --webui-> port 8080

虽然我得到了失败的消息,但主人或 Worker 在几秒钟后就活了起来 .

有人可以解释原因吗?

1 回答

  • 8

    Spark配置系统是一堆环境变量,参数标志和Java属性文件 . 我只花了几个小时追踪相同的警告,并解开Spark初始化程序,这就是我发现的:

    • sbin/start-all.sh 调用 sbin/start-master.sh (然后 sbin/start-slaves.sh

    • sbin/start-master.sh 来电 sbin/spark-daemon.sh start org.apache.spark.deploy.master.Master ...

    • sbin/spark-daemon.sh start ... 分叉调用 bin/spark-class org.apache.spark.deploy.master.Master ... ,捕获生成的进程ID(pid),休眠2秒,然后检查pid 's command'的名称是否为"java"

    • bin/spark-class 是一个bash脚本,所以它从命令名"bash"开始,然后进入:

    • (重新)通过采购 bin/load-spark-env.sh 加载Spark环境

    • 找到 java 可执行文件

    • 找到合适的Spark jar

    • 调用 java ... org.apache.spark.launcher.Main ... 以获取Spark部署所需的完整类路径

    • 然后终于通过 exec 将控制权移交给 java ... org.apache.spark.deploy.master.Master ,此时命令名称变为"java"

    如果步骤4.1到4.5花费的时间超过2秒,那么在我(和你的)经验中似乎几乎不可避免地在一个以前从未运行 java 的新操作系统上,你会收到"failed to launch"消息,尽管实际上没有任何失败 .

    奴隶会抱怨出于同样的原因,并且在主人实际可用之前摔倒,但他们应该继续重试,直到他们成功连接到主人 .

    我在EC2上运行了一个非常标准的Spark部署;我用:

    • conf/spark-defaults.conf 设置 spark.executor.memory 并通过 spark.{driver,executor}.extraClassPath 添加一些自定义jar

    • conf/spark-env.sh 设置 SPARK_WORKER_CORES=$(($(nproc) * 2))

    • conf/slaves 列出我的奴隶

    这是我如何开始Spark部署,绕过一些 {bin,sbin}/*.sh 雷区/迷宫:

    # on master, with SPARK_HOME and conf/slaves set appropriately
    mapfile -t ARGS < <(java -cp $SPARK_HOME/lib/spark-assembly-1.6.1-hadoop2.6.0.jar org.apache.spark.launcher.Main org.apache.spark.deploy.master.Master | tr '\0' '\n')
    # $ARGS now contains the full call to start the master, which I daemonize with nohup
    SPARK_PUBLIC_DNS=0.0.0.0 nohup "${ARGS[@]}" >> $SPARK_HOME/master.log 2>&1 < /dev/null &
    

    我仍在使用 sbin/start-daemon.sh 启动从站,因为这比在 ssh 命令中调用 nohup 更容易:

    MASTER=spark://$(hostname -i):7077
    while read -r; do
      ssh -o StrictHostKeyChecking=no $REPLY "$SPARK_HOME/sbin/spark-daemon.sh start org.apache.spark.deploy.worker.Worker 1 $MASTER" &
    done <$SPARK_HOME/conf/slaves
    # this forks the ssh calls, so wait for them to exit before you logout
    

    那里!它假设我正在使用所有默认端口和东西,并且我没有做愚蠢的狗屎,就像在文件名中添加空格一样,但我认为这样更干净 .

相关问题