【问题解决】Spark集群,通过master节点执行start-all.sh启动slave报错

本文记录了一次Spark集群部署过程中遇到的问题:通过master节点使用start-all.sh脚本启动集群时出现路径错误及连接失败的情况。分析了问题原因在于不同节点间Spark安装路径不一致及主机名解析问题,并给出了相应的解决办法。

Spark集群,通过master节点执行start-all.sh启动slave报错:./sbin/start-all.sh

所以最初我搭建完Spark集群后,一直是分别执行master和各slave的脚本来进行启动的:

启动master:

./sbin/start-master.sh -h 192.168.3.207 --host 192.168.3.207

启动slave:

/sbin/start-slave.sh spark://192.168.3.207:7077

而且各操作都是在各自的机器上。

今天同事说正常应该是直接通过master节点,直接start-all就可以启动所有节点。

我在master启动全部时,报错如下:

$ ../sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /home/ubutnu/spark_2_2_1/logs/spark-ubutnu-org.apache.spark.deploy.master.Master-1-ubutnu-Super-Server.out
192.168.3.104: bash: 第 0 行: cd: /home/ubutnu/spark_2_2_1: 没有那个文件或目录
192.168.3.104: bash: /home/ubutnu/spark_2_2_1/sbin/start-slave.sh: 没有那个文件或目录
192.168.3.102: bash: 第 0 行: cd: /home/ubutnu/spark_2_2_1: 没有那个文件或目录
192.168.3.102: bash: /home/ubutnu/spark_2_2_1/sbin/start-slave.sh: 没有那个文件或目录

关键点:路径找不到,是192.168.3.102和104报的。因为master机器只配了各slave的ip,并不知道他们的spark安装路径,所以我猜测master是按本机的路径去调,但可惜spark在另外两台的目录和master并不一样,因此就找不到指定的路径了。

解决办法:将所有slave机器的spark路径改成和master一致,便可解决。

$ ./start-all.sh 
starting org.apache.spark.deploy.master.Master, logging to /home/ubutnu/spark_2_2_1/logs/spark-ubutnu-org.apache.spark.deploy.master.Master-1-ubutnu-Super-Server.out
192.168.3.104: starting org.apache.spark.deploy.worker.Worker, logging to /home/ubutnu/spark_2_2_1/logs/spark-he-org.apache.spark.deploy.worker.Worker-1-he-V660.out
192.168.3.102: starting org.apache.spark.deploy.worker.Worker, logging to /home/ubutnu/spark_2_2_1/logs/spark-he-org.apache.spark.deploy.worker.Worker-1-he-200.out
但是打开webui页面,URL仍然是带主机名的:URL: spark://ubutnu-Super-Server:7077

而且worker机器报错:

18/04/17 17:03:33 INFO Worker: Spark home: /home/ubutnu/spark_2_2_1
18/04/17 17:03:33 INFO Utils: Successfully started service 'WorkerUI' on port 8081.
18/04/17 17:03:33 INFO WorkerWebUI: Bound WorkerWebUI to 192.168.3.102, and started at http://192.168.3.102:8081
18/04/17 17:03:33 INFO Worker: Connecting to master ubutnu-Super-Server:7077...
18/04/17 17:03:38 WARN TransportClientFactory: DNS resolution for ubutnu-Super-Server:7077 took 5028 ms
18/04/17 17:03:38 WARN Worker: Failed to connect to master ubutnu-Super-Server:7077
Caused by: java.io.IOException: Failed to connect to ubutnu-Super-Server:7077

解决办法:将master和slave各机器的conf/spark-env.sh加上:
export SPARK_MASTER_HOST=192.168.3.207

总结:

master直接启动所有节点:./sbin/start-all.sh

master直接停止所有节点:./sbin/stop-all.sh

### Spark Master节点配置及集群启动教程 在Standalone模式下,Spark集群采用Master-Slave架构。为了实现Master节点的高可用性(HA),可以通过Zookeeper进行主备切换配置[^1]。以下是具体的配置和启动步骤: #### 1. 配置环境变量 进入Spark安装目录下的`conf`文件夹,将模板文件`spark-env.sh.template`复制为`spark-env.sh`,然后编辑该文件以设置环境变量[^2]。以下是一个示例配置: ```bash export SPARK_MASTER_HOST=master export SPARK_LOCAL_DIRS=/mnt/spark/tmp export SPARK_LOG_DIR=/var/log/spark ``` #### 2. 配置Master节点的HA 为了实现Master节点的高可用性,需要通过Zookeeper进行配置。编辑`conf/spark-defaults.conf`文件,添加以下内容: ```properties spark.master.failover.enabled true spark.deploy.recoveryMode ZOOKEEPER spark.deploy.zookeeper.url zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 spark.deploy.zookeeper.dir /spark ``` 上述配置中,`zookeeper1:2181,zookeeper2:2181,zookeeper3:2181`是Zookeeper集群的地址列表,`/spark`是Zookeeper中存储Spark状态的根路径。 #### 3. 配置Slave节点Master节点上的Spark安装目录和环境配置文件复制到所有Slave节点上[^3]。例如,使用`scp`命令将文件从Master节点传输到Slave节点: ```bash scp -r /opt/spark-2.2.0 root@slave1:/opt scp /etc/profile root@slave1:/etc/ ``` #### 4. 启动Master和Worker节点Master节点启动Spark集群: ```bash # 启动Master节点 sbin/start-master.sh # 在所有Worker节点启动Worker进程 sbin/start-slave.sh spark://master:7077 ``` 如果启用了HA模式,还需要确保Zookeeper服务正常运行,并且可以通过以下命令检查Master节点的状态: ```bash http://<master-ip>:8080 ``` #### 5. 检查集群状态 访问Spark Web UI(默认端口为8080),可以查看Master节点和Worker节点的状态以及任务执行情况[^3]。 ### 示例代码 以下是一个简单的Scala程序,用于测试Spark集群是否正常工作[^4]: ```scala import org.apache.spark.SparkConf import org.apache.spark.SparkContext object TestCluster { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("TestCluster").setMaster("spark://master:7077") val sc = new SparkContext(conf) val data = sc.parallelize(1 to 100, 10) val result = data.map(x => x * 2).collect() result.foreach(println) sc.stop() } } ``` ### 注意事项 - 确保所有节点的时间同步(NTP服务)。 - 检查防火墙规则,确保Spark所需的端口(如7077、8080等)已开放。 - 如果使用HDFS作为存储系统,需确保HDFS服务正常运行并正确配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪知道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值