Spark集群部署
部署顺序
- 系统安装
- SHH配置
- JDK安装
- Hadoop安装
- Spark安装
系统安装
安装CentOS系统,选择最低配置。
安装版本为: CentOS-7-x86_64-Everything-1804
记录集群中每个节点的IP,并测试连通性确保各节点间互相可以ping通。
安装软件版本为:
JDK:jdk-8u191-linux-x64.tar
Hadoop:hadoop-3.1.0.tar
Spark:spark-2.3.2-bin-hadoop2.7
hosts修改
整个配置过程中,注意账号名的不同;即出现账号名时应对对应账号名作相应修改!
- 修改各个节点的主机名,使其与该节点的角色名一致,如
master,slave1,slave2,...
(这一步非必须,只是为了便于区分):
sudo vi /etc/hostname #编辑 /etc/hostname 文件从而修改主机名
sudo reboot #重启使新主机名生效
- 修改各个 hosts 文件,在本地植入部分 DNS 映射,将对应的角色名与IP匹配起来,然 后尝试用角色名相互 ping,相互能 ping 通证明配置成功:
sudo vi /etc/hosts
ping master -c 4
说明: 第 2 步保障了 Hadoop 可以通过角色名在局域网里找到各个节点,为了让 Hadoop 可以进 一步读取、操作各个节点,需要赋予其登录的权限,意即让 Hadoop 拥有各个节点的普通用户账 号,从而在需要操作各个节点时直接用对应的账号登录获取操作权限。SSH 协议可以为节点上的账户创建唯一的公私钥,然后利用这些公私钥实现无密码登录,从而让Hadoop 直接绕开传统的账号密码登录过程,直接用公私钥访问节点。
SHH配置
配置 SSH 无密码登录
-
生成各个节点的 SSH 公私钥:
cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost rm ./id_rsa* # 删除之前生成的公匙(如果有) ssh-keygen -t rsa # 一直按回车就可以
-
为了让每个节点都拥有其它节点的公钥,要先把所有公钥放进一个文件里,分 4 步 走:
( a ) 在 master 上,将 master 的公钥复制到 authorized_keys 文件里:cat ./id_rsa.pub >> ./authorized_keys # cat 命令用于提取内容,>>输出重定向
( b ) 将 slave1 的公钥文件发送给 master,此时的传送要输入密码:
scp ~/.ssh/id_rsa.pub 账号名@master:/home/账号名/
注意,这里前后两处hadoop需要修改为对应的账号名
( c )
master
将接收到的slave1
的公钥文件里的内容提取追加到authorized_keys
文 件里:cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
( d ) 重复前两步,将 slave2 (其他节点)的公钥内容也放进
authorized_keys
文件,然后将authorized_keys
文件分别发送到两个slave
的~/.ssh/
下:scp ~/.ssh/authorized_keys 账号名@slave1:/home/账号名/.ssh/ scp ~/.ssh/authorized_keys 账号名@slave2:/home/账号名/.ssh/
注意,修改账号名hadoop为自己的账号名。
-
每个节点尝试使用
ssh <角色名>
的命令直接登录其它节点,直到每个节点都可以 成功免密码登录其它节点,则免密码登录配置成功! 如在master
上输入:ssh slave1
JDK安装
JDK安装需在各个机器上都做一遍。或者在master上安装完成后通过scp发送到各个节点相同目录下,然后修改PATH环境变量。这里我安装的JDK版本为:
jdk-8u191-linux-x64.tar
。
- 将上传的 JDK 压缩包(jdk-8u191-linux-x64.tar)放到家目录(
/home/账号名/
),解压并放到指定的文件夹:
sudo mkdir -p /usr/local/jvm
sudo tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/local/jvm
- 将当前的
PATH
环境变量提取保存到setenv.sh
,然后将其修改为初始化语句,增加JAVA
的路径(我用的是jdk1.8.0_191
,大家相应地改成自己的jdk
版本号):
echo $PATH >> ~/setenv.sh
sudo vi ~/setenv.sh
export JAVA_HOME=/usr/local/jvm/jdk1.8.0_191
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin
- 执行
setenv.sh
脚本文件修改当前环境变量PATH
,然后尝试java
和javac
指令是否有效:
source ~/setenv.sh
java -version
javac -version
Hadoop安装
Hadoop安装需在各个机器上都做一遍。或者在master上安装完成后通过scp发送到各个节点相同目录下,然后修改PATH环境变量。这里我安装的Hadoop版本为:
jdk-8u191-linux-x64.tar
。
- 在各个节点上将
hadoop
解压到/usr/local/
目录下,改变其所属用户和所属组(让hadoop
软件用相应账号登录时对hadoop
文件夹拥有最高权限):
sudo tar -zxvf hadoop-3.1.0.tar.gz -C /usr/local/ #解压
sudo mv /usr/loca/hadoop-3.1.0 /usr/local/hadoop #mv 实现重命名
sudo chown -R 账号名:账号名 /usr/local/hadoop
- 修改
slaves
文件,让 hadoop 知道自己可以聚合的节点名(保证与 hosts 里的角色名一致):
sudo vi /usr/local/hadoop/etc/hadoop/slaves
master
slave1
slave2
- 修改
workers
文件
vi /usr/local/hadoop/etc/hadoop/workers
master
slave1
slave2
- 修改
core-site.xml
文件如下:
sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
- 修改
hdfs-site.xml
文件如下(启用所有节点作为 DataNode,故replication=3
):
若集群数为n,则replication可以设置为n
sudo vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.http.address</name>
<value>192.168.142.130:50070</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>192.168.142.130:50075</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>192.168.142.130:50010</value>
</property>
</configuration>
这里
192.168.142.130
应当修改为各个节点的ip地址。
- 修改
mapred-site.xml
文件如下:
sudo vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
- 修改
yarn-site.xml
文件如下(启用 yarn 资源管理器):
sudo vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- 修改
hadoop-env.sh
文件,将出现 JAVA_HOME 的值换成 jdk 所在的路径:
sudo vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
/usr/local/jvm/jdk1.8.0_191
说明:上述 Hadoop 的配置操作要在每个节点上做一次(或者通过scp传送到各个节点上),确保每个环节都不出错,然后就 可以尝试初始化 NameNode(聚合所有节点成为一个集群的服务),然后尝试启动各项服务。
- 添加PATH环境变量,将以下信息添加到setenv.sh中:
sudo vi ~/setenv.sh
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:${HADOOP_HOME}/bin
source ~/setenv.sh
启动并验证Hadoop
- 对 hadoop 进行 NameNode 的格式化/初始化:
注意,不可以随意多次初始化hadoop,否则会出现问题,如果确实需要初始化,则先删除master节点下的文件hadoop/tmp,hadoop/hdfs/name,hadoop/hdfs/data,以及其他slave节点的hadoop/hdfs/data文件。删除后在进行初始化操作,删除目录为
sudo rm -rf 文件路径
/usr/local/hadoop/bin/hdfs namenode -format
Spark安装
这里选择spark on yarn模式进行安装。
- 具体的内存配置请依据自己的电脑合适修改,不要直接套 pdf 数据。我的电脑是 1G 运行内存,所以设置的是1000M,executor cores是2(经过测试driver memory和worker memory如果小于512M,executor cores大于2的话用spark提交任务会很容易就崩死, 提示的是 SparkContext 相关错误)。
- 关于 spark 的概念、运行机制、spark on yarn 的内容,请阅读下面两个链接内容 http://blog.csdn.net/wwwxxdddx/article/details/51087188 spark 基本概念 http://www.aboutyun.com/thread-12294-1-1.html spark on yarn 的两种运行模式
以下步骤是在 master 主机上完成的,完成后可以直接将整个 spark 文件夹传给 slave。
-
将
spark-2.3.2-bin-hadoop2.7.tgz
放到/home/hadoop/
目录下; -
解压文件到
/usr/local
下,重命名文件夹并修改属主;
sudo tar -xzvf spark-2.3.2-bin-hadoop2.7.tgz -C /usr/local/
sudo mv /usr/local/spark-2.3.2-bin-hadoop2.7 /usr/local/spark
sudo chown -R 账号名:账号名 /usr/local/spark/
- 利用
spark
的template
文件生成配置文件;
cp /usr/local/spark/conf/spark-env.sh.template /usr/local/spark/conf/spark-env.sh
cp /usr/local/spark/conf/slaves.template /usr/local/spark/conf/slaves
cp /usr/local/spark/conf/spark-defaults.conf.template /usr/local/spark/conf/spark-defaults.conf
- 修改
spark-env.sh
,在文件末尾添加如下内容:
sudo vi /usr/local/spark/conf/spark-env.sh
export HADOOP_HOME=/usr/local/hadoop
export JAVA_HOME=/usr/local/jvm/jdk1.8.0_191
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export SPARK_MASTER_IP=master
export SPARK_LOCAL_DIRS=/usr/local/spark
export SPARK_WORKER_MEMORY=1000M
export SPARK_EXECUTOR_MEMORY=1000M
export SPARK_DRIVER_MEMORY=1000M
export SPARK_EXECUTOR_CORES=2
这一步是为了配置
spark
的运行参数,hadoop_conf_dir
的设置是为了让spark
运行在yarn
上。 几个memory
命令分别用于设置driver
和executor
进程的内存,executor_cores
设置的是每个executor
进程的CPU cores
的数量,这些设置请依据自己的电脑实际可负载情况设置。
- 修改 slaves 文件,在文件末尾添加其他节点 IP;
sudo vi /usr/local/spark/conf/slaves
master
slave1
slave2
- 修改
spark-defaults.conf
,在文件末尾添加如下内容:
sudo vi /usr/local/spark/conf/spark-defaults.conf
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/historyserverforSpark
spark.yarn.historyServer.address master:18080
spark.history.fs.logDirectory hdfs://master:9000/historyserverforSpark
spark.speculation true
这一步是为保存 spark 的运行日志,并且是保存到 hdfs 上的文件夹里面,方便运维。
- 将配置好的 spark 文件夹传到 slave1、slave2等节点。
sudo scp usr/local/spark 账号名@节点名:/usr/local/
sudo scp -r /usr/local/spark its312@slave1:/usr/local/
sudo scp -r /usr/local/spark its312@slave2:/usr/local/
- 配置 hadoop;
修改 yarn-site.xml 文件,添加新的属性:
sudo vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
这一步是为了开启日志整合功能,spark 在遇到问题时,利用命令 /usr/local/hadoop/bin/yarn logs -applicationId XXX
即可查看 applicationId 为 XXX 的实例的运行日志
这里需要重新初始化hadoop,使得修改的hadoop配置文件生效;
-
运行 spark;
- 运行 hadoop;
/usr/local/hadoop/sbin/start-all.sh
- 在 spark 中创建 historyserverforSpark 文件夹;
/usr/local/hadoop/bin/hdfs dfs -mkdir /historyserverforSpark
- 运行 spark;
/usr/local/spark/sbin/start-all.sh
可以进入 spark 的 webui 查看是否成功启动:
masterIP:8080/
masterIP:8088/cluster
- 运行 history-server,这样应用运行完的结果可以通过 webui 看到。
usr/local/spark/sbin/start-history-server.sh
安装过程中的注意事项
防火墙问题
安装过程中需要关闭所有节点的防火墙,参考命令如下:
# CentOS 7的方式
systemctl stop firewalld.service #停止防火墙
systemctl start firewalld.service #开启防火墙
systemctl status firewalld.service #查看防火墙状态
systemctl enable firewalld.service #开机自启 “启用”
systemctl disable firewalld.service #开机自启 “禁用”
启动hadoop后查看节点启动数量
hdfs dfsadmin -report
hadoop多次初始化问题
在多次初始化之前,先删除对应的data、name、tmp文件夹,然后再进行初始化命令。
hadoop启动后live node数量为1问题
若hadoop启动后,master和slave节点输入jsp返回的信息都是正确的,但live node只有1个,且是master节点时,可能时hosts有问题,这是进入hosts修改ip,只有一个localhost=127.0.0.1
;
live node问题参考:Hadoop-2.2.0集群部署时live nodes数目不对的问题