1. Hadoop HA 构架
2. 主机规划
主机名 | IP 地址 | 部署组件 |
hadoop-01 | 192.168.2.101 | Zookeeper、NameNode(active)、kzfc、ResourceManager(active) |
hadoop-02 | 192.168.2.102 | Zookeeper、NameNode(standby)、kzfc、 |
hadoop-03 | 192.168.2.103 | Zookeeper、 ResourceManager(standby)、 |
hadoop-04 | 192.168.2.104 | JournalNode、DataNode、NodeManager、Spark |
hadoop-05 | 192.168.2.105 | JournalNode、DataNode、NodeManager、Spark |
hadoop-06 | 192.168.2.106 | JournalNode、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
ShellScript3.3 关闭防火墙与 selinux
systemctl stop firewalld
systemctl disable firewalld
iptables -F
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
setenforce 0
ShellScript3.4 关闭 swap 分区
# 关闭swap分区
swapoff -a
# 注释swap分区
cp /etc/fstab /etc/fstab_bak
sed -i '/swap/d' /etc/fstab
ShellScript3.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
ShellScript3.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
ShellScript3.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
ShellScript4. 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/
ShellScript4.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
ShellScript4.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
ShellScript4.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
ShellScript4.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 进程。
ShellScript4.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
ShellScript4.7. 测试 Zookeeper 故障角色转移
# 查看服务状态
zkServer.sh status
# 停止角色为 leader 的服务
zkServer.sh stop
# 然后会发现选举出一个新的 leader,如果重启停掉的服务,它会变成 follower
ShellScript5. 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/
ShellScript5.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
ShellScript5.2. 修改配置文件
切换到配置文件目录:
cd /root/software/hadoop-2.10.1/etc/hadoop
ShellScript5.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
ShellScript5.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>
ShellScript5.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>
ShellScript5.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>
ShellScript5.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>
ShellScript5.2.6. 配置 slaves
# slaves 文件用于指定集群中的 DataNode 和 NodeManager
vim slaves
hadoop-04
hadoop-05
hadoop-06
ShellScript5.3. 创建上述配置中使用的目录
cd /root/software/hadoop-2.10.1
mkdir journal
mkdir tmp
cd tmp/
mkdir namenode
mkdir datanode
ShellScript5.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. 配置环境变量。
ShellScript5.5. Hadoop 集群启动
5.5.1. 启动zookeeper集群(启动则忽略)
在 zookeeper 部署节点上执行命令:
zkServer.sh start
ShellScript5.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]
ShellScript5.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
ShellScript5.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. 表示成功。
ShellScript5.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
ShellScript5.5.6. 启动 DataNode
在 hadoop-04、hadoop-05、hadoop-06 服务器上分别启动 datanode 节点,在这三台服务器上分别执行如下命令:
hadoop-daemon.sh start datanode # 执行完毕后用 jps 查看,会看到 DataNode 进程
ShellScript5.5.7. 启动 zkfc
FalioverControllerActive 是失败恢复线程。这个线程需要在 NameNode 节点所在的服务器上启动,在
hadoop-01、hadoop-02 服务器上执行如下命令:
hadoop-daemon.sh start zkfc # 启动后用 jps 命令可以看到 DFSZKFailoverController 进程
ShellScript5.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
ShellScript5.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
ShellScript5.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
ShellScriptspark-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"
ShellScriptspark-defaults.conf
cp spark-defaults.conf.template spark-defaults.conf
vim spark-defaults.conf
# 在文件末尾添加下列内容可以指定端口,可选项,不配置则默认端口(8040)
spark.ui.port 8040
ShellScriptslaves
cp slaves.template slaves
vim slaves
# 修改 localhost 为以下内容
hadoop-04
hadoop-05
hadoop-06
ShellScriptyarn-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>
ShellScript5.7. 重启集群
在修改了配置后需要重新启动集群,下面是重新启动集群相关组件的操作。
5.7.1. 重启 zookeeper 集群
# 在 zoopkeeper 集群的每台机器上执行
zkServer.sh restart
ShellScript5.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