【问题标题】:Apache Spark: "failed to launch org.apache.spark.deploy.worker.Worker" or MasterApache Spark:“无法启动 org.apache.spark.deploy.worker.Worker”或 Master
【发布时间】:2016-05-10 17:34:19
【问题描述】:

我在 Openstack 上创建了一个 Spark 集群,该集群在 Ubuntu14.04 上运行,内存为 8gb。我创建了两个每个 3gb 的虚拟机(为父操作系统保留 2gb)。此外,我从第一台虚拟机创建了一个 master 和 2 个 worker,从第二个虚拟机创建了 3 个 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。掌握”。当我看到日志文件以查找错误时,我得到以下信息

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/assembly/target/scala-2.10/spark-assembly-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

虽然我收到了失败消息,但主人或工人在几秒钟后变得活跃。

谁能解释一下原因?

【问题讨论】:

  • 我将日志从 ERROR 切换到 INFO,我看到了两个警告。 1.你的主机名worker1解析为一个环回地址:127.0.1.1;使用 10.0.0.30 代替(在接口道德上)和 2. 无法为您的平台加载 native-hadoop 库......在适用的情况下使用内置 java 类。这些会干扰集群部署吗?

标签: ubuntu apache-spark cluster-computing


【解决方案1】:

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

  1. sbin/start-all.sh 调用sbin/start-master.sh(然后是sbin/start-slaves.sh
  2. sbin/start-master.sh 致电sbin/spark-daemon.sh start org.apache.spark.deploy.master.Master ...
  3. sbin/spark-daemon.sh start ... 派生出对 bin/spark-class org.apache.spark.deploy.master.Master ... 的调用,捕获生成的进程 id (pid),休眠 2 秒,然后检查该 pid 的命令名称是否为“java”
  4. bin/spark-class 是一个 bash 脚本,所以它以命令名称“bash”开始,然后继续:
    1. (重新)通过采购bin/load-spark-env.sh 加载 Spark 环境
    2. 找到java 可执行文件
    3. 找到合适的 Spark jar
    4. 调用 java ... org.apache.spark.launcher.Main ... 以获取 Spark 部署所需的完整类路径
    5. 然后最终通过exec 将控制权移交给java ... org.apache.spark.deploy.master.Master,此时命令名称变为“java”

如果步骤 4.1 到 4.5 花费的时间超过 2 秒,根据我(和您)的经验,这在以前从未运行过 java 的新操作系统上似乎是不可避免的,您将得到“启动失败”消息,尽管实际上并没有失败。

slave 会因为同样的原因而抱怨,并在 master 真正可用之前一直在不停地挣扎,但它们应该继续重试,直到成功连接到 master。

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

  • conf/spark-defaults.conf 设置spark.executor.memory 并通过spark.{driver,executor}.extraClassPath 添加一些自定义罐子
  • conf/spark-env.sh 设置SPARK_WORKER_CORES=$(($(nproc) * 2))
  • conf/slaves 列出我的奴隶

以下是我绕过 {bin,sbin}/*.sh 雷区/迷宫的一些方法开始部署 Spark:

# 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

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

【讨论】:

    【解决方案2】:

    我有同样的问题,在主节点上运行 spark/sbin/start-slave.sh。

    hadoop@master:/opt/spark$ sudo ./sbin/start-slave.sh --master spark://master:7077
    starting org.apache.spark.deploy.worker.Worker, logging to /opt/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-master.out
    failed to launch: nice -n 0 /opt/spark/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8081 --master spark://master:7077
      Options:
        -c CORES, --cores CORES  Number of cores to use
        -m MEM, --memory MEM     Amount of memory to use (e.g. 1000M, 2G)
        -d DIR, --work-dir DIR   Directory to run apps in (default: SPARK_HOME/work)
        -i HOST, --ip IP         Hostname to listen on (deprecated, please use --host or -h)
        -h HOST, --host HOST     Hostname to listen on
        -p PORT, --port PORT     Port to listen on (default: random)
        --webui-port PORT        Port for web UI (default: 8081)
        --properties-file FILE   Path to a custom Spark properties file.
                                 Default is conf/spark-defaults.conf.
    full log in /opt/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-master.out
    

    我发现我的错,我不应该使用 --master 关键字而只运行命令

    hadoop@master:/opt/spark$ sudo ./sbin/start-slave.sh spark://master:7077
    

    按照本教程的步骤: https://phoenixnap.com/kb/install-spark-on-ubuntu

    提示:确保在之前安装所有依赖项:

    sudo apt install scala git -y
    

    【讨论】:

    • 但是我的主启动脚本也有同样的问题。我还没有找到解决方案。我的环境是 Windows 10,带有 ubuntu 20.04.1 LTS 的 WSL 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多