本文主要是介绍搭建Spark真实分布式运行环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
搭建Spark真实分布式运行环境
文章目录
- 搭建Spark真实分布式运行环境
- 配置不依赖于HDFS的spark standslone模式
- 准备工作
- 配置基本环境
- 配置免密登录
- 分布式spark standalone 环境部署,不依赖于HDFS
- 配置spark-env.sh文件
- 配置 slaves.template 文件
- 将配置好的spark文件分发至slaves机器
- 启动spark
- 测试
- 添加slave1和slave2到master的免密登录
- 运行spark执行任务
Spark是一个计算分析平台,使用内存进行计算,相当于只是一个计算框架。
Hadoop是一个大数据平台,使用磁盘进行计算。包括HDFS存储平台,MapReduce计算分析平台,Yarn资源调度平台。
Spark部署模式:
Local
Standalone
Yarn
Mesos
具体有什么样的区别,请参考:https://blog.csdn.net/WYpersist/article/details/79731621
一点点小结:
1.local(本地模式):常用于本地开发测试,本地分为local单线程和local-cluster多线程
2.standalone(集群模式):典型的Mater/slave模式,不过也能看出Master是有单点故障的;Spark支持ZooKeeper来实现 HA
3.on yarn(集群模式):运行在 yarn 资源管理器框架之上,由 yarn 负责资源管理,Spark 负责任务调度和计算
4.on mesos(集群模式):运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算
5.on cloud(集群模式):比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon的 S3;Spark 支持多种分布式存储系统:HDFS 和 S3
由于只想跑spark,暂时用不到HDFS,所以就了解了一下:
配置standalone模式,不一定需要配置hadoop,因为可以不需要HDFS,从本地文件读取数据需要在每台机器上保证路径一致,或者可以使用NFS代替HDFS。
配置不依赖于HDFS的spark standslone模式
准备工作
配置基本环境
基本环境(在三台虚拟机上 ubuntu18.04):
安装统一在 /home/wj/apps/ 目录下
Java:1.8.0
Scala:2.11.8
Maven:3.5.4
配置免密登录
免密登录,现在只配置master免密登录slaves ,我的虚拟机的IP信息如下:
spark-master :192.168.73.134
spark-slave1 :192.168.73.135
spack-slave2 :192.168.73.137
安装ssh-server,ubuntu 18.04中只默认安装了 ssh-agent,可以使用命令 ps –e | grep ssh查看。
sudo apt-get install openssh-server
开启ssh-server服务:
service sshd restart
在 master 上执行 ssh-keygen -t rsa
生成对应 rsa key pair ,在 ~/.ssh/
目录下
将 id_rsa.pub 内容拷贝至 authorized_keys,将这个 authorized_keys 文件放置在 slaves 机器上的 .ssh 目录下便可从该 master 单向免密登录。
注意,有时需要修改 authorized_keys 的权限:
chmod 600 authorized_keys
Host文件配置
为了不直接使用IP,可以通过设置hosts文件达到ssh Spark-slave1这样的的效果(三个节点设置相同)
sudo gedit /etc/hosts
在文件尾部添加如下行,保存后退出:
192.168.73.134 spark-master
192.168.73.135 spark-slave1
192.168.73.137 spark-slave2
测试,可通过在spark-master上通过 ssh spark-slave1 命令登录到 spark-slave1 上
(如果slave需要免密登录master,还需要继续配置,这里暂时先不进行配置,一种完全错误的侥幸心理)
分布式spark standalone 环境部署,不依赖于HDFS
使用spark版本为官网下载预编译版本:spark-2.2.0-bin-hadoop2.7.tgz
安装在 /home/wj/apps/
目录下
配置spark-env.sh文件
cd conf/
mv spark-env.sh.template spark-env.sh
gedit spark-env.sh
在后面添加 :
export JAVA_HOME=/home/wj/apps/jdk1.8.0_181
export SPARK_MASTER_IP=spark-master
export SPARK_MASTER_PORT=7077
配置 slaves.template 文件
mv slaves.template slaves
gedit slaves
在后面添加 :
spark-slave1
spark-slave2
将配置好的spark文件分发至slaves机器
scp -r spark-2.2.0-bin-hadoop2.7 spark-slave1:/home/wj/apps/
scp -r spark-2.2.0-bin-hadoop2.7 spark-slave2:/home/wj/apps/
启动spark
在spark下的文件夹sbin中,执行命令:
./start-all.sh
可见到:
spark-master:
spark-slave1:
spark-slave2:
配置完成
测试
通过master主机上访问http://localhost:8080/ 发现Alive workers只有1,且过一段时间之后,slave1和slave2上的worker会死掉,考虑大概率是因为ssh免密登录是单向的。
添加slave1和slave2到master的免密登录
在slave1和slave2上生成公钥私钥对(按照上述方式),然后使用ssh-copy-id
命令直接完成权限授予,在当前机器下,若想访问某台机器,便将其公钥复制到某台机器上。
ssh-copy-id
命令可以把本地主机的公钥复制到远程主机的authorized_keys
文件上,ssh-copy-id
命令也会给远程主机的用户主目录(home)和~/.ssh
, 和~/.ssh/authorized_keys
设置合适的权限。
现在三台机器之间互相可以免密登录。
再次启动,slaves 上的 worker 不会自动死掉。
但是:Alive workers仍然显示只有1个,在网上查询了一下,问题原因如下,解决方案也很简单,在master机器上屏蔽127.0.0.1相关的映射就可以了
但是,在后一次实践中,发现这个操作方式存在两点问题
第一,如果127.0.1.1这个地址映射到了nameserver中,即nameserver必须采用这个地址进行域名解析,该文件在/etc/resolv.conf中,如果在/etc/hosts中删除的话,会造成无法联网的问题。在ubuntu16.04中,在我实践过程中,是这个地址,在ubuntu18.04中为127.0.0.53,删除之后无故障。在虚拟机集群中,删除之后该问题得到解决,但是在物理机上,发现并没有解决问题。
第二,发现最终原因在于/spark/conf/spark-env.sh的配置写得太简陋了,关于slave相关的信息不全,补全之后,这个问题得到了解决。
之前的配置信息:
export JAVA_HOME=/home/wj/apps/jdk1.8.0_181
export SPARK_MASTER_IP=spark-master
export SPARK_MASTER_PORT=7077
适当补全之后的配置信息:
export JAVA_HOME=/home/wj/apps/jdk1.8.0_181
export SPARK_MASTER_IP=spark-master
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_HOST=spark-master
export SPARK_LOCAL_IP=spark-slave
环境整体上应该配置完成
运行spark执行任务
通过bin目录下的spark-shell
启动scala面板,需要给超级权限
sudo ./spark-shell --master spark://spark-master:7077 --executor-memory 512m --total-executor-cores 3
--master
如果在机群中有多个spark集群,需要使用这个参数指定具体是哪一个spark集群
如果只使用 --master
参数,则启动的是单机版本,启动多机版本需要指定后面两个参数,第一个参数表示每台机器可用的内存,第二个参数表示所有机器加起来可以使用的core数。
这与sparkUI上的一致,每个application需要提供cores和memory
这篇关于搭建Spark真实分布式运行环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!