Spark standalone模式结合虚拟机遇到的问题

在Spark standalone模式下运行作业时遇到driver URL获取问题,表现为TaskScheduler无法接收worker回复。问题源于executor启动命令中使用的driver IP(192.168.56.1)为虚拟机网卡IP。通过检查worker工作日志,发现executor启动参数包含错误的driver IP。解决方案是启动时设置`spark.driver.host`环境变量,确保使用正确的driver IP地址。
在spark standalone模式启动结合虚拟机遇到的driver url获取问题


学习博客:http://bit1129.iteye.com/blog/2179543


在job启动后,输出如下问题:
17/12/22 10:01:21 WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources


定位问题:
查看worker ui中executor的stdout和stderr。stderr输出如下:
Caused by: org.apache.spark.rpc.RpcTimeoutException: Cannot receive any reply from192.168.56.1:61266 in 120 seconds. This timeout is controlled by spark.rpc.askTimeout
全部过程中并没有使用该ip,但是考虑到启动该job时并未设置任何参数,所以应该是环境变量设置问题。查看ip地址,发现192.168.56.1为虚拟机网卡ip。
然后查看worker的工作日志,也就是worker链接到master后提示的日志文件,通常在logs目录下,有如下信息:
17/12/21 17:00:55 INFO Worker: Asked to launch executor app-20171221165506-0000/5 for spark_main
17/12/21 17:00:55 INFO SecurityManager: Changing view acls to: user
17/12/21 17:00:55 INFO SecurityManager: Changing modify acls to: user
17/12/21 17:00:55 INFO SecurityManager: Changing view acls groups to: 
17/12/21 17:00:55 INFO SecurityManager: Changing modify acls groups to: 
17/12/21 17:00:55 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users  with view permissions: Set(user); groups with view permissions: Set(); users  with modify permissions: Set(user); groups with modify permissions: Set()
17/12/21 17:00:55 INFO ExecutorRunner: Launch command: 
"/home/user/java/jdk1.8.0_151/bin/java" 
"-cp" "/home/user/spark/spark-2.2.1-bin-hadoop2.7/conf/:/home/user/spark/spark-2.2.1-bin-hadoop2.7/jars/*" "-Xmx1024M" 
"-Dspark.driver.port=61266" 
"org.apache.spark.executor.CoarseGrainedExecutorBackend" 
"--driver-url" "spark://CoarseGrainedScheduler@192.168.56.1:61266" 
"--executor-id" "5" 
"--hostname" "10.16.143.60" 
"--cores" "1" 
"--app-id" "app-20171221165506-0000" 
"--worker-url" "spark://Worker@10.16.143.60:40670"
通过launch command命令发现,该ip是当worker启动job时传递的driver ip,根据官方文档,可以手动设置driver ip。


解决办法:
通过启动时设置“spark.driver.host”解决该问题。

<think> 首先,用户的问题是关于在Ubuntu系统虚拟机中手动搭建配置Spark Standalone集群的详细步骤。我必须基于提供的引用内容来构建回答。 回顾引用内容: - 引用[1]:介绍了Spark集群搭建的三种方式,包括standalone模式。 - 引用[2]:提供了一个实验报告格式,包括验证JDK、SSH无密码登录、安装Spark、配置环境等步骤。 - 引用[3]:描述了使用VirtualBox安装Ubuntu虚拟机、设置静态IP等基础步骤。 - 引用[4]:涉及Spark配置文件的设置,如spark-env.sh。 - 引用[5]:提到版本冲突问题,如guava.jar版本不一致。 用户的需求是详细的步骤,所以我需要整合这些引用,创建一个结构清晰的指南。 回答结构: 1. **介绍**:简要说明Spark Standalone集群是什么,为什么在Ubuntu虚拟机上搭建。 2. **准备工作**: - 安装Ubuntu虚拟机(参考引用[3])。 - 设置静态IP(参考引用[3])。 - 安装JDK(参考引用[2])。 - 配置SSH无密码登录(参考引用[2])。 3. **安装和配置Spark**: - 下载并安装Spark(参考引用[2])。 - 配置Spark环境文件(参考引用[4])。 4. **配置集群**: - 设置master和worker节点(参考引用[2]和[4])。 - 同步配置(参考引用[2])。 5. **测试集群**: - 启动和测试Spark集群(参考引用[2])。 - 常见问题解决(如guava.jar版本冲突,参考引用[5])。 6. **结论**:简要总结。 确保格式: - 使用中文回答。 - 行内数学表达式用$...$,但这里可能不涉及数学,所以省略。 - 独立公式用$$...$$,但同样可能不需要。 - 添加引用标识,如[^1]在相关段落后。 - 生成相关问题。 最后,生成相关问题:基于回答内容,提出几个相关问题。 详细步骤整合: 1. **准备虚拟机环境**: - 使用VirtualBox创建多个Ubuntu虚拟机(如master和worker节点)。 - 为每个虚拟机设置静态IP(参考引用[3])。 2. **基础配置**: - 在所有节点上安装JDK(例如OpenJDK 8),并验证安装(参考引用[2])。 - 配置SSH免密登录:在master节点上生成SSH密钥,并复制公钥到所有节点(包括自身),以确保master可以无密码访问所有worker节点(参考引用[2])。 3. **安装Spark**: - 在master节点上下载并解压Spark安装包(如从官网下载)。 - 配置环境变量,如JAVA_HOME、SCALA_HOME(如果使用Scala)等(参考引用[4])。 4. **配置Spark集群**: - 在Spark的conf目录下,配置spark-env.sh:设置JAVA_HOME、SPARK_MASTER_HOST等参数(参考引用[4])。 - 配置slaves文件:添加所有worker节点的hostname或IP地址(参考引用[2])。 - 将配置好的Spark目录复制到所有worker节点(参考引用[2])。 5. **启动和测试集群**: - 在master节点上启动Spark集群(使用start-master.sh和start-workers.sh)。 - 通过Spark Web UI验证集群状态。 - 运行示例程序测试集群(如spark-shellspark-submit)。 6. **常见问题**: - 如果遇到启动问题,检查guava.jar版本是否一致(参考引用[5])。 添加引用: - 在相关步骤后添加[^1]、[^2]等。 生成相关问题: 1. Spark Standalone集群与YARN模式有什么区别? 2. 如何优化Spark集群的性能? 3. Spark集群搭建中常见错误如何解决? 完整回答。 </think> 以下是在Ubuntu系统虚拟机中手动搭建配置Spark Standalone集群的详细步骤。Spark Standalone模式Spark自带的轻量级集群管理器,无需依赖Hadoop YARN或Mesos,适合在虚拟机环境中学习和测试分布式计算。搭建过程分为六个阶段:**准备虚拟机环境、基础配置、安装Spark、配置集群、启动与测试、常见问题解决**。每个步骤都基于引用内容优化,确保可操作性。引用来源包括Spark集群搭建的实践经验[^1][^2][^3][^4][^5]。 ### 1. 准备虚拟机环境 在搭建前,准备多台Ubuntu虚拟机(一台作为Master节点,其他作为Worker节点)。推荐使用VirtualBox创建虚拟机: - **下载和安装VirtualBox**:从[官网](https://www.virtualbox.org/)下载并安装VirtualBox。 - **创建虚拟机**: - 点击“新建”,输入名称(如`spark-master`),类型选择“Linux”,版本选择“Ubuntu (64-bit)”。 - 分配内存(至少2GB,建议4GB)和硬盘(至少20GB),使用默认的VDI格式和动态分配[^3]。 - **安装Ubuntu系统**: - 下载Ubuntu 20.04 LTS镜像(推荐,兼容性好)。 - 在VirtualBox中挂载镜像作为启动盘,启动虚拟机并完成Ubuntu安装(选择最小安装,减少资源占用)。 - 安装后,启用“增强功能”(VirtualBox菜单 > 设备 > 安装增强功能),以便跨机复制文件。 - **设置静态IP**: - 编辑网络配置文件:`sudo nano /etc/netplan/00-installer-config.yaml`。 - 添加以下内容(替换`your_interface`为网卡名,如`enp0s3`;IP地址按需分配,例如Master: `192.168.1.100`, Worker1: `192.168.1.101`): ```yaml network: ethernets: your_interface: dhcp4: no addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8] version: 2 ``` - 应用配置:`sudo netplan apply`。 - **克隆Worker节点**:在VirtualBox中克隆Master虚拟机(右键 > 克隆),修改主机名和静态IP以避免冲突: - 修改主机名:`sudo hostnamectl set-hostname spark-worker1`。 - 更新IP配置(如上步骤)。 - **配置共享粘贴板**:在VirtualBox设置中,为每台虚拟机设置“共享粘贴板”和“拖放”为“双向”,方便复制命令[^3]。 > **提示**:确保所有虚拟机在同一网络段,并能互相ping通(测试:`ping 192.168.1.101`)。引用中强调了静态IP对集群通信的关键性[^3]。 ### 2. 基础配置 在所有节点(Master和Worker)上完成以下基础设置: - **更新系统**: ```bash sudo apt update && sudo apt upgrade -y ``` - **安装JDK**: - Spark依赖Java,安装OpenJDK 8: ```bash sudo apt install openjdk-8-jdk -y ``` - 验证安装:`java -version`,输出应显示"1.8.x"。 - **配置环境变量**: - 编辑`~/.bashrc`:`nano ~/.bashrc`。 - 添加以下行(替换路径为实际JDK安装路径): ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$PATH:$JAVA_HOME/bin ``` - 使配置生效:`source ~/.bashrc`。 - **配置SSH免密登录**(关键步骤,允许Master无密码访问所有节点): - 在Master节点生成SSH密钥:`ssh-keygen -t rsa`(按回车接受默认)。 - 复制公钥到所有节点(包括Master自身): ```bash ssh-copy-id localhost # 复制到Master自身 ssh-copy-id spark-worker1 # 复制到Worker节点 ``` - 验证免密登录:从Master运行`ssh spark-worker1`,无需输入密码即可登录。 - **设置主机名解析**: - 编辑所有节点的`/etc/hosts`文件: ```bash sudo nano /etc/hosts ``` - 添加所有节点的IP和主机名(例如): ``` 192.168.1.100 spark-master 192.168.1.101 spark-worker1 ``` > **为什么重要**:SSH免密登录是Spark集群启动的基础,确保节点间通信无阻。引用中将其列为实验的必要步骤[^2]。 ### 3. 安装Spark 仅在Master节点操作,完成后同步到Worker。 - **下载Spark**: - 从[Spark官网](https://spark.apache.org/downloads.html)下载预编译包(如Spark 3.3.2 with Hadoop 3)。 ```bash wget https://dlcdn.apache.org/spark/spark-3.3.2/spark-3.3.2-bin-hadoop3.tgz ``` - **解压和安装**: ```bash tar -xzvf spark-3.3.2-bin-hadoop3.tgz sudo mv spark-3.3.2-bin-hadoop3 /opt/spark # 移动至/opt目录 ``` - **配置环境变量**: - 编辑`~/.bashrc`: ```bash export SPARK_HOME=/opt/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin ``` - 使配置生效:`source ~/.bashrc`。 ### 4. 配置集群 Spark Standalone集群的核心是配置文件,在Master节点操作。 - **配置`spark-env.sh`**: - 进入Spark配置目录:`cd $SPARK_HOME/conf`。 - 复制模板文件:`cp spark-env.sh.template spark-env.sh`。 - 编辑`spark-env.sh`: ```bash nano spark-env.sh ``` - 添加以下内容(根据实际路径调整): ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export SPARK_MASTER_HOST=spark-master # Master节点主机名 export SPARK_MASTER_WEBUI_PORT=8080 # Web UI端口 export SPARK_WORKER_CORES=2 # 每个Worker使用的CPU核心数 export SPARK_WORKER_MEMORY=2g # 每个Worker的内存分配 ``` - **配置`workers`文件(旧版本为slaves)**: - 复制模板:`cp workers.template workers`。 - 编辑`workers`: ```bash nano workers ``` - 添加所有Worker节点的主机名(每行一个): ``` spark-worker1 spark-worker2 ``` - **同步配置到Worker节点**: - 使用`rsync`或`scp`复制Spark安装目录: ```bash scp -r /opt/spark spark-worker1:/opt/ scp -r /opt/spark spark-worker2:/opt/ ``` - 在Worker节点上,同样设置环境变量(编辑`~/.bashrc`并`source`)。 > **注意**:配置文件中的`SPARK_MASTER_HOST`必须与Master主机名一致,否则集群无法启动。引用中详细说明了参数设置[^4]。 ### 5. 启动与测试集群 - **启动集群**: - 在Master节点运行: ```bash $SPARK_HOME/sbin/start-master.sh # 启动Master进程 $SPARK_HOME/sbin/start-workers.sh # 启动所有Worker进程 ``` - 验证启动: - Master日志:`tail -f $SPARK_HOME/logs/spark-*-master-*.out`。 - Worker日志:`tail -f $SPARK_HOME/logs/spark-*-worker-*.out`。 - **访问Web UI**: - 在浏览器输入`http://spark-master:8080`(替换为Master的IP),应显示集群状态,包括Worker节点列表。 - **运行测试程序**: - 在Master节点,使用Spark Shell验证: ```bash spark-shell --master spark://spark-master:7077 ``` - 在Shell中运行简单任务: ```scala val data = sc.parallelize(1 to 100) data.sum() // 输出应为5050 ``` - 或提交Python示例: ```bash spark-submit --master spark://spark-master:7077 $SPARK_HOME/examples/src/main/python/pi.py 10 ``` - **关闭集群**: ```bash $SPARK_HOME/sbin/stop-workers.sh $SPARK_HOME/sbin/stop-master.sh ``` ### 6. 常见问题解决 - **Spark节点无法启动**: - **问题**:Worker未出现在Web UI中。 - **解决**: - 检查SSH免密登录是否配置正确(从Master运行`ssh worker-hostname`测试)。 - 确保所有节点的防火墙已关闭:`sudo ufw disable`。 - 验证`workers`文件中的主机名拼写正确。 - **版本冲突(如guava.jar)**: - **问题**:启动时报错"java.lang.NoSuchMethodError",常见于Hadoop与Spark库冲突。 - **解决**: - 检查Spark和Hadoop的`guava.jar`版本: ```bash ls $SPARK_HOME/jars/guava-*.jar ls $HADOOP_HOME/share/hadoop/common/lib/guava-*.jar ``` - 将高版本文件复制到低版本目录(例如,Spark的guava.jar版本较高时): ```bash cp $SPARK_HOME/jars/guava-*.jar $HADOOP_HOME/share/hadoop/common/lib/ ``` - 重启集群生效。引用中强调了此问题[^5]。 - **其他错误**: - 查看日志文件(`$SPARK_HOME/logs`)定位错误。 - 确保所有节点的系统时间同步:`sudo timedatectl set-ntp on`。 ### 总结 手动搭建Spark Standalone集群涉及虚拟机准备、SSH配置、Spark安装和参数调整。完成后,您将拥有一个分布式计算环境,适用于大数据处理实验。整个过程约需1-2小时,具体时间取决于虚拟机性能和网络。引用经验表明,严格遵循步骤可避免常见陷阱[^1][^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值