Hadoop HA 部署

1. Hadoop HA 构架

2. 主机规划

主机名IP 地址部署组件
hadoop-01192.168.2.101Zookeeper、NameNode(active)、kzfc、ResourceManager(active)
hadoop-02192.168.2.102Zookeeper、NameNode(standby)、kzfc、
hadoop-03192.168.2.103Zookeeper、
ResourceManager(standby)、
hadoop-04192.168.2.104JournalNode、DataNode、NodeManager、Spark
hadoop-05192.168.2.105JournalNode、DataNode、NodeManager、Spark
hadoop-06192.168.2.106JournalNode、DataNode、NodeManager、Spark

3. 环境准备

3.1 设置静态 IP

3.2 主机名配置(可选项)

hostnamectl set-hostname hadoop-01
...


# 配置主机名解析
cat >> /etc/hosts << EOF
192.168.2.101 hadoop-01
192.168.2.102 hadoop-02
192.168.2.103 hadoop-03
192.168.2.104 hadoop-04
192.168.2.105 hadoop-05
192.168.2.106 hadoop-06
EOF
ShellScript

3.3 关闭防火墙与 selinux

systemctl stop firewalld
systemctl disable firewalld
iptables -F

sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
setenforce 0
ShellScript

3.4 关闭 swap 分区

# 关闭swap分区
swapoff -a 

# 注释swap分区
cp /etc/fstab /etc/fstab_bak
sed -i '/swap/d' /etc/fstab
ShellScript

3.5 配置 ssh 密钥登录

集群中所有主机都要互相进行免密登录,包括自己和自己。也就是任一台主机都要能
与6台机器免密登录,将下列脚本在每台主机上执行一次。

#!/bin/bash
# 定义服务器名与ip地址对应的关联数组
declare -A servers=(
    ["hadoop-01"]="192.168.2.101"
    ["hadoop-02"]="192.168.2.102"
    ["hadoop-03"]="192.168.2.103"
    ["hadoop-04"]="192.168.2.104"
    ["hadoop-05"]="192.168.2.105"
    ["hadoop-06"]="192.168.2.106"
)

# 远程主机用户名与密码
server_username="root"
server_password="697195"


# 生成免密秘钥对
ssh-keygen -f ~/.ssh/id_rsa -N ""

# 推送公钥
sudo yum install sshpass -y
for server in "${servers[@]}"; do
    sshpass -p "$server_password" ssh-copy-id -o StrictHostKeyChecking=no $server_username@$server
done
ShellScript

做完秘钥登录后,可以在每台主机上执行下述脚本来进行测试,同时确认执行第一次连接的确认操作。

#!/bin/bash
ssh root@hadoop-01 hostname
ssh root@hadoop-02 hostname
ssh root@hadoop-03 hostname
ssh root@hadoop-04 hostname
ssh root@hadoop-05 hostname
ssh root@hadoop-06 hostname
ShellScript

3.6 安装 Jdk

jdk 下载地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html

# 创建软件管理目录
mkdir /root/software/
# 解压 jdk 安装包到 /root/software/ 目录
tar xf jdk-8u202-linux-x64.tar.gz -C /root/software/

# 修改 /etc/profile,在文件行尾加入以下内容后保存退出。
# 作用是将 Java JDK 的安装路径、类路径和可执行文件路径添加到系统的环境变量中,以便系统和应用程序能够正确地找到和使用 Java 开发环境。
cat > /etc/profile.d/jdk.sh << 'EOF'
#!/bin/bash
JAVA_HOME=/root/software/jdk1.8.0_202/
CLASSPATH=.:$JAVE_HOME/lib/dt.jar:$JAVE_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH CLASSPATH
EOF

# 重新加载 profile 使配置生效
source /etc/profile
ShellScript

3.7 安装 Scala 解释器

spark 使用 scala 语言开发,需要安装 Scala 解释器。下载地址:scala-lang.org/download/

wget https://downloads.lightbend.com/scala/2.11.12/scala-2.11.12.tgz
# 解压 scala 安装包到 /root/software/ 目录
tar xf scala-2.11.12.tgz -C /root/software/
# 修改/etc/profile,在文件行尾加入以下内容后保存退出。
cat > /etc/profile.d/scala.sh << 'EOF'
#!/bin/bash
SCALA_HOME=/root/software/scala-2.11.12/
PATH=$PATH:$SCALA_HOME/bin
export PATH
EOF

# 重新加载 profile 使配置生效
source /etc/profile
ShellScript

4. zookeeper 分布式集群搭建

按照计划部署在 hadoop-01、hadoop-02、hadoop-03 主机上部署 zookeeper 集群,需要安装 jdk 作为基础支持。

4.1. 下载安装包

wget https://downloads.apache.org/zookeeper/stable/apache-zookeeper-3.8.4-bin.tar.gz

tar xf apache-zookeeper-3.8.4-bin.tar.gz -C /root/software/
ShellScript

4.2. 启动命令添加环境变量

# 添加环境变量
cat > /etc/profile.d/zookeeper.sh << 'EOF'
#!/bin/bash
ZK_HOME=/root/software/apache-zookeeper-3.8.4-bin
PATH=$PATH:$ZK_HOME/bin
export PATH
EOF

# 立即生效
source /etc/profile
ShellScript

4.3. 修改配置文件

cd /root/software/apache-zookeeper-3.8.4-bin/conf/
cp zoo_sample.cfg zoo.cfg

vim zoo.cfg
# 此文件中需要修改以下两处:
# dataDir:指定 zookeeper 将数据保存在哪个目录下,如果不修改,默认在 /tmp 下,这个目录下的数据有可能会在磁盘空间不足或服务器重启时自动被 linux 清理,所以一定要修改这个地址。按个人习惯将其修改为自己的管理目录。
# 示例:
dataDir=/root/software/apache-zookeeper-3.8.4-bin/data
dataLogDir=/root/software/apache-zookeeper-3.8.4-bin/logs

# 完全分布式:多台机器各自配置,zookeeper 有几个节点,就配置几个 server.x 例如本案例总共三台主机,于是在配置文件末尾加上下面三行,可以填写 ip 也可以是 /etc/hosts 的主机名,建议后者,可以充分解耦
server.1=hadoop-01:2888:3888
server.2=hadoop-02:2888:3888
server.3=hadoop-03:2888:3888


# zookeeper 服务默认的端口号为 2888 和 3888,2888 端口用于 Leader 与 Follower 进行数据同步,3888 为选举端口,
# 配置文件中默认还有一个 clientPort=2181,代表客户端连接 zookeeper 服务的端口。这是一个 TCP port。
ShellScript

创建上述配置目录:

mkdir /root/software/apache-zookeeper-3.8.4-bin/data
mkdir /root/software/apache-zookeeper-3.8.4-bin/logs
ShellScript

4.4. 创建 myid 文件

到 dataDir 指定目录下生成一个文件叫 myid(必须叫这个名字),其中写上一个数字表明当前机器是哪一个编号的机器,注意:本机的 myid 内容一定要与配置文件中的 server.x 保持一致。

# 在 hadoop-01 主机
echo 1 > /root/software/apache-zookeeper-3.8.4-bin/data/myid

# 在 hadoop-02 主机
echo 2 > /root/software/apache-zookeeper-3.8.4-bin/data/myid

# 在 hadoop-03 主机
echo 3 > /root/software/apache-zookeeper-3.8.4-bin/data/myid
ShellScript

4.5. 启动 zookeeper

启动 zookeeper 的各种命令操作如下,如果没有添加环境变量的话,那么可以使用绝对路径操作这些命令,也可使用相对路径操作这些命令,相对路径需要进到 zookeeper 服务的 bin 目录进行操作。

# 启动服务,Zookeeper 集群需要每台机器逐个启动,必须全部启动,状态才会 running
zkServer.sh start
 
# 停止服务
zkServer.sh stop
 
# 重启服务
zkServer.sh restart

# 查看服务状态
zkServer.sh status  # 依次查看三台主机,会发现某一台被选举为leader,其余两台为follower


# 也可以使用 jps 命令查看线程 
# jps 是 Java 虚拟机自带的一个命令行工具,全称为 Java Virtual Machine Process Status Tool。它的主要作用是显示当前用户在系统上运行的所有 Java 进程的进程 ID(PID)和主类(Main Class)的名称。通常用于开发人员或者运维人员来查看正在运行的 Java 程序,并帮助定位特定的 Java 进程。
ShellScript

4.6. 测试 zookeeper 数据同步

# 在 hadoop-01 主机上调用客户端命令
zkCli.sh 
# 注意:zoo.cfg 如果修改了 clientPort,例如 clientPort=8131,那么此处需要指定参数 zkCli.sh -server localhost:8131
# localhost 也可以是其他主机的 IP 或 hostname。
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] get /zookeeper
[zk: localhost:2181(CONNECTED) 2] create /hadoop123 123 # 创建一个 hadoop123 文件并且值为:123
Created /hadoop123
[zk: localhost:2181(CONNECTED) 3] ls /  # 查看是否创建好了
[hadoop123, zookeeper]
[zk: localhost:2181(CONNECTED) 4] get /hadoop123  # 获取文件的值
123



# 在 hadoop-02 和 hadoop-03 上查看在 hadoop-01 上创建文件是否同步过来
zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /     
[hadoop123, zookeeper]  # 显示这一行表示同步过来了
[zk: localhost:2181(CONNECTED) 1] get /hadoop123
123
ShellScript

4.7. 测试 Zookeeper 故障角色转移

# 查看服务状态
zkServer.sh status

# 停止角色为 leader 的服务
zkServer.sh stop

# 然后会发现选举出一个新的 leader,如果重启停掉的服务,它会变成 follower 
ShellScript

5. hadoop2.0 HA 集群搭建

官网下载地址:https://hadoop.apache.org/releases.html

先在 Hadoop 集群中的一台主机上配置,本示例中用到的是 hadoop-2.10.1,在 hadoop-01 上配置。

解压到 /root/software/ 目录:

tar xf hadoop-2.10.1.tar.gz -C /root/software/
ShellScript

5.1. 配置环境变量

cat > /etc/profile.d/hadoop.sh << 'EOF'
#!/bin/bash
HADOOP_HOME=/root/software/hadoop-2.10.1
PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_HOME PATH
EOF

source /etc/profile
ShellScript

5.2. 修改配置文件

切换到配置文件目录:

cd /root/software/hadoop-2.10.1/etc/hadoop
ShellScript

5.2.1. 配置 hadoop-env.sh

vim hadoop-env.sh

# 此文件配置两项:jdk 安装目录、hadoop 配置文件目录。
export JAVA_HOME=/root/software/jdk1.8.0_202
export HADOOP_CONF_DIR=/root/software/hadoop-2.10.1/etc/hadoop
ShellScript

5.2.2. 配置 core-site.xml

vim core-site.xml

<configuration>
<!--用来指定hdfs的namenode,ns为固定属性名,此值可以自己设置,但是后面的值要和此值对应,表示两个namenode-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://ns</value>
</property>

<!--用来指定hadoop运行时产生文件的存放目录-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/root/software/hadoop-2.10.1/tmp</value>
</property>

<!--执行zookeeper地址,如果之前修改过zookeeper的clientPort,此处务必注意-->
<property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop-01:2181,hadoop-02:2181,hadoop-03:2181</value>
</property>
</configuration>
ShellScript

5.2.3. 配置 hdfs-site.xml

vim hdfs-site.xml

<configuration>
<!--执行hdfs的nameservice为ns,和core-site.xml保持一致-->
<property>
    <name>dfs.nameservices</name>
    <value>ns</value>
</property>

<!--ns下有两个namenode,分别是nn1,nn2-->
<property>
    <name>dfs.ha.namenodes.ns</name>
    <value>nn1,nn2</value>
</property>

<!--nn1的RPC通信地址-->
<property>
    <name>dfs.namenode.rpc-address.ns.nn1</name>
    <value>hadoop-01:9000</value>
</property>

<!--nn1的http通信地址-->
<property>
    <name>dfs.namenode.http-address.ns.nn1</name>
    <value>hadoop-01:50070</value>
</property>

<!--nn2的RPC通信地址-->
<property>
    <name>dfs.namenode.rpc-address.ns.nn2</name>
    <value>hadoop-02:9000</value>
</property>

<!--nn2的http通信地址-->
<property>
    <name>dfs.namenode.http-address.ns.nn2</name>
    <value>hadoop-02:50070</value>
</property>

<!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以从jn集群里获取最新的namenode的信息,达到热备的效果-->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop-04:8485;hadoop-05:8485;hadoop-06:8485/ns</value>
</property>
 
<!--指定JournalNode存放数据的位置-->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/root/software/hadoop-2.10.1/journal</value>
</property>

<!--开启namenode故障时自动切换-->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

<!--配置切换的实现方式-->
<property>
    <name>dfs.client.failover.proxy.provider.ns</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!--配置隔离机制-->
<property>
     <name>dfs.ha.fencing.methods</name>
     <value>sshfence</value>
</property>
 
<!--配置隔离机制的ssh登录秘钥所在的位置-->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>

<!--配置namenode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///root/software/hadoop-2.10.1/tmp/namenode</value>
</property>

<!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
    <name>dfs.datanode.data.dir</name>
     <value>file:///root/software/hadoop-2.10.1/tmp/datanode</value>
</property>
 
<!--配置block副本数量-->
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

<!--设置hdfs的操作权限,false表示任何用户都可以在hdfs上操作文件,生产环境不配置此项,默认为true-->
<property>
    <name>dfs.permissions</name>
    <value>false</value>
</property>
</configuration>
ShellScript

5.2.4. 配置 mapred-site.xml

cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml

<configuration>
<property>
    <!--指定mapreduce运行在yarn上-->
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
</configuration>
ShellScript

5.2.5. 配置 yarn-site.xml

vim yarn-site.xml


<configuration>
<!--开启YARN HA--> 
<property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
</property>

<!--指定两个resourcemanager的名称--> 
<property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
</property>

<!--配置rm1,rm2的主机--> 
<property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>hadoop-01</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>hadoop-03</value>
</property>

<!--开启yarn恢复机制-->
<property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
</property>

<!--执行rm恢复机制实现类-->
<property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

<!--配置zookeeper的地址,如果之前修改过zookeeper的clientPort,此处务必注意 -->  
<property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>hadoop-01:2181,hadoop-02:2181,hadoop-03:2181</value>
    <description>For multiple zk services, separate them with comma</description>
</property>

<!--指定YARN HA的名称-->
<property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-ha</value>
</property>

<!--指定yarn的老大 resoucemanager的地址-->
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop-01</value>
</property>

<!--NodeManager获取数据的方式-->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

<!--开启日志聚合-->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>

<!--日志在HDFS上最多保存多长时间-->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
</property>
</configuration>
ShellScript

5.2.6. 配置 slaves

# slaves 文件用于指定集群中的 DataNode 和 NodeManager
vim slaves

hadoop-04
hadoop-05
hadoop-06
ShellScript

5.3. 创建上述配置中使用的目录

cd /root/software/hadoop-2.10.1
mkdir journal
mkdir tmp
cd tmp/
mkdir namenode
mkdir datanode
ShellScript

5.4. 其他主机安装

上述配置项配置了 hadoop HA 需要的所有组件配置,现在将 hadoop 安装目录 copy 到其他5台机器上。
按照安装部署规划在相应主机启动相应组件即可。

for i in `seq 2 6`;
do
    remote_host=hadoop-0$i
    scp -r /root/software/hadoop-2.10.1 root@$remote_host:/root/software/hadoop-2.10.1
done


# 并在每台主机上设置环境变量同 5.1. 配置环境变量。
ShellScript

5.5. Hadoop 集群启动

5.5.1. 启动zookeeper集群(启动则忽略)

在 zookeeper 部署节点上执行命令:

zkServer.sh start
ShellScript

5.5.2. 格式化 zkfc

zkfc 用来做两个 namenode 的状态切换管理或者失败切换管理。在运行 namenode 的 zk 的节点服务器上,执行如下命令:

# 这个指令的作用是在 zookeeper 集群上生成 ha节点(ns节点)
sh hdfs zkfc -formatZK

# 若出现报错:using SASL (unknown error)
vim /root/software/apache-zookeeper-3.8.4-bin/conf/zoo.cfg  
# 添加
zookeeper.sasl.client=false
ShellScript

格式化以后会在 Zookeeper 写一些东西,现在可以看一下去(master节点):

zkCli.sh 

ls /

# 可以看到
[hadoop-ha, zookeeper]
ShellScript

5.5.3. 启动 journalnode 集群

按照部署规划在 hadoop-04、hadoop-05、hadoop-06 主机上启动 journalnode 集群。命令如下:

# 命令所在目录:/root/software/hadoop-2.10.1/sbin/
hadoop-daemons.sh start journalnode

# 注意:
# 第一次需要手动起,以后就不需要手动启动了,就包含在了s tart-dfs.sh 脚本里面了。
# 此命令执行一次就可以启动所有 journalnode节点。命令使用的是 hadoop-daemons.sh,是有s的,启动的时候一定要注意,不要用错了命令。

# 查看
[root@hadoop-04 software]# jps
3610 JournalNode
3674 Jps
ShellScript

5.5.4. 格式化 NameNode

在 hadoop-01 上格式化 namenode:

hadoop namenode -format
# 显示 24/12/29 12:17:36 INFO common.Storage: Storage directory /root/software/hadoop-2.10.1/tmp/namenode has been successfully formatted. 表示成功。
ShellScript

5.5.5. 启动 NameNode

在 hadoop-01 执行命令:

hadoop-daemon.sh start namenode


# 查看
[root@hadoop-01 sbin]# jps
2144 QuorumPeerMain
4648 Jps
4569 NameNode
ShellScript

在 hadoop-02 执行命令:

# 设置 hadoop-02 上的 namenode 为 Standby。
hdfs namenode -bootstrapStandby

# 启动 hadoop-02 上的 namenode 
hadoop-daemon.sh start namenode
ShellScript

5.5.6. 启动 DataNode

在 hadoop-04、hadoop-05、hadoop-06 服务器上分别启动 datanode 节点,在这三台服务器上分别执行如下命令:

hadoop-daemon.sh start datanode # 执行完毕后用 jps 查看,会看到 DataNode 进程
ShellScript

5.5.7. 启动 zkfc

FalioverControllerActive 是失败恢复线程。这个线程需要在 NameNode 节点所在的服务器上启动,在
hadoop-01、hadoop-02 服务器上执行如下命令:

hadoop-daemon.sh start zkfc # 启动后用 jps 命令可以看到 DFSZKFailoverController 进程
ShellScript

5.5.8. 启动 Resourcemanager

在 hadoop-01 服务器上启动主 Resourcemanager 节点,执行如下命令:

start-yarn.sh

# 可以看到 hadoop-04、hadoop-05、hadoop-06 服务器上的 nodemanager 也会跟随启动。
[root@hadoop-01 sbin]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /root/software/hadoop-2.10.1/logs/yarn-root-resourcemanager-hadoop-01.out
hadoop-04: starting nodemanager, logging to /root/software/hadoop-2.10.1/logs/yarn-root-nodemanager-hadoop-04.out
hadoop-05: starting nodemanager, logging to /root/software/hadoop-2.10.1/logs/yarn-root-nodemanager-hadoop-05.out
hadoop-06: starting nodemanager, logging to /root/software/hadoop-2.10.1/logs/yarn-root-nodemanager-hadoop-06.out
ShellScript

在 hadoop-03 服务器上启动副 Resoucemanager 节点,执行如下命令:

yarn-daemon.sh start resourcemanager
ShellScript

5.5.9. 测试

访问主 namenode,在浏览器中输入地址:http://192.168.2.101:50070(hadoop-01 IP),查看 namenode 的信息,是active 状态的。

访问备 namenode,在浏览器中输入地址:http://192.168.2.102:50070(hadoop-02 IP),查看 namenode 的信息,是standby 状态的。

查看 yarn 的管理地址:http://192.168.2.101:8088

查看各个节点的进程:

[root@hadoop-01 software]# jps
2144 QuorumPeerMain
4736 DFSZKFailoverController
5172 Jps
4569 NameNode
4857 ResourceManager

[root@hadoop-02 software]# jps
4192 NameNode
2290 QuorumPeerMain
4351 DFSZKFailoverController
4511 Jps

[root@hadoop-03 software]# jps
4337 ResourceManager
1972 QuorumPeerMain
4398 Jps

[root@hadoop-04 software]# jps
3842 NodeManager
3986 Jps
3610 JournalNode
3723 DataNode

[root@hadoop-05 software]# jps
4097 Jps
3955 NodeManager
3833 DataNode
3722 JournalNode

[root@hadoop-06 software]# jps
3745 NodeManager
3891 Jps
3508 JournalNode
3623 DataNode
ShellScript

5.6. Spark On Yarn-cluster 搭建

5.6.1. 安装

在 hadoop-04、hadoop-05、hadoop-06 节点上安装配置 spark。此处以 hadoop-04 服务器为例。

新版本下载地址:https://spark.apache.org/downloads.html

历史版本下载地址:https://archive.apache.org/dist/spark

现在越来越多的场景,都是 Spark 跑在 Hadoop 集群中,所以为了做到资源能够均衡调度,会使用 YARN
来做为 Spark 的 Cluster Manager,来为 Spark 的应用程序分配资源。
在执行 Spark 应用程序前,要启动 Hadoop 的各种服务。由于已经有了资源管理器,所以不需要启动 Spark 的 Master、Worker 守护进程。
在 spark-Yarn 模式下,Spark 自身的 Master 节点和 Worker 节点不需要启动(只有集群的 Standalone 方式时,才需要这两个角色),但是 Spark 的部署包必须是基于对应的 Yarn 版本正确编译后的,否则会出现Spark 和 Yarn 的兼容性问题。

参考文档:https://spark-reference-doc-cn.readthedocs.io/zh_CN/latest/deploy-guide/running-on-yarn.html

下载解压到 /root/software 目录。

5.6.2. 配置

切换到 spark 配置文件目录:

cd /root/software/spark-2.4.8-bin-hadoop2.7/conf
ShellScript
spark-env.sh
cp spark-env.sh.template spark-env.sh
vim spark-env.sh

# 直接在文件末尾添加如下内容:
export JAVA_HOME=/root/software/jdk1.8.0_202/
export SCALA_HOME=/root/software/scala-2.11.12/  # 如果不依赖 scala 语言,则忽略
export HADOOP_HOME=/root/software/hadoop-2.10.1
export HADOOP_CONF_DIR=/root/software/hadoop-2.10.1/etc/hadoop #让 spark 知道 hadoop 配置文件的路径,完成 spark 整合 hadoop
export LANG="en_US.UTF-8"
ShellScript
spark-defaults.conf
cp spark-defaults.conf.template spark-defaults.conf
vim spark-defaults.conf

# 在文件末尾添加下列内容可以指定端口,可选项,不配置则默认端口(8040)
spark.ui.port                      8040
ShellScript
slaves
cp slaves.template slaves
vim slaves

# 修改 localhost 为以下内容
hadoop-04
hadoop-05
hadoop-06
ShellScript
yarn-site.xml

如果是用虚拟机搭建,可能会由于虚拟机内存过小而导致启动失败,比如内存资源过小,yarn会直接kill
掉进程导致rpc连接失败。

所以,我们还需要配置Hadoop的yarn-site.xml文件,在configuration内加入如下两项property配置:

vim /root/software/hadoop-2.10.1/etc/hadoop/yarn-site.xml

<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>
ShellScript

5.7. 重启集群

在修改了配置后需要重新启动集群,下面是重新启动集群相关组件的操作。

5.7.1. 重启 zookeeper 集群

# 在 zoopkeeper 集群的每台机器上执行
zkServer.sh restart
ShellScript

5.7.2. 重启 Hadoop 集群

停止 HDFS 相关组件:

# 在任意一台机器上执行
stop-dfs.sh


# 单个组件停止方式
# 停止 namenode(在运行 namenode 的节点上依次执行
hadoop-daemon.sh stop namenode
# 停止 journalnode(在任意节点执行都行,一条命令即可关停 journalnode 集群)
hadoop-daemons.sh stop journalnode
# 停 ZKFC(在运行 ZKFC 的节点上依次执行)
hadoop-daemon.sh stop zkfc
ShellScript

停止 Yarn 相关组件:

# 在 resourcemanager 主节点上执行
stop-yarn.sh

# 上述命令可以停止 resourcemanager 主节点和所有 nodemanager
# 备用 resourcemanager节点需要到相应主机上手动停止
yarn-daemon.sh stop resourcemanager
ShellScript

启动 HDFS 相关组件:

# 任意一台机器执行(只能用于重启)
start-dfs.sh 
ShellScript

启动 Yarn 相关组件:

# 在 resourcemanager 主节点上执行
# 会启动 resourcemanager 主节点和所有 nodemanager
start-yarn.sh

# 备用 resourcemanager节点需要到相应主机上手动启动
yarn-daemon.sh start resourcemanager
ShellScript
./bin/spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.JavaSparkPi ./examples/jars/spark-examples_2.11-2.4.8.jar 80
ShellScript