步骤
一、Hadoop分布式环境搭建
1.虚拟机环境准备
- 准备一台虚拟机,操作系统centos7.x
- 配置虚拟机的静态ip
- 修改主机名为hadoop101并进行端口映射
[root@master ~]# vi /etc/hostname
master
[root@master ~]# vi /etc/hosts
192.168.247.200 master
此时需要重启机器 reboot
- 关闭防火墙
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
禁用selinux
[root@master ~]# vi /etc/selinux/config
将selinux=enforcing改成selinux=disabled
- 配置时钟同步
(1) ntp服务安装
[root@master ~]# yum -y install ntp
[root@master ~]# rpm -qa|grep ntp
ntpdate-4.2.6p5-29.el7.centos.2.x86_64
ntp-4.2.6p5-29.el7.centos.2.x86_64
(2) 修改ntp配置文件
写一个定时同步网络时间到硬件的脚本
[root@master ~]# crontab -e
编辑模式下输入
*/1 * * * * /usr/sbin/ntpdate -u pool.ntp.org;clock -w
保存退出
(3) 重新启动ntpd
[root@master ~]# systemctl stop ntpd
[root@master ~]# systemctl start ntpd
(4) 设置为开机启动
[root@master ~]# systemctl enable ntpd.service
- 创建文件夹
在/opt目录下创建download、software文件夹,分别用来存放安装包和程序
[root@master ~]# cd /opt/
[root@master opt]# mkdir download software
[root@master opt]# ls
download software
2.安装jdk1.8
(1) 如果已经安装jdk1.8以上版本,可忽略此操作
(2) 用Xftp工具将jdk安装包导入到/opt/download目录下
(3) 将安装包解压到/opt/software下
[root@master hadoop]# tar -zxvf jdk-8u111-linux-x64.tar.gz -C /opt/software
[root@master opt]# cd software/
[root@master software]# ls
jdk1.8.0_111
(4) 给文件重命名,更加简洁
[root@master software]# mv jdk1.8.0_111/ jdk180
[root@master software]# ls
jdk180
(5) 进入jdk目录,复制jdk所在路径
[root@master software]# cd jdk180/
[root@master jdk180]# pwd
/opt/software/jdk180
(6) 配置jdk环境变量
[root@master software]# vi /etc/profile
在文件最后加入环境变量,然后保存退出
export JAVA_HOME=/opt/software/jdk180
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
(7) 验证
先source /etc/profile激活环境变量,然后查看jdk版本
[root@master jdk180]# source /etc/profile
[root@master jdk180]# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
3.安装Hadoop
先让本机能够免密登录linux ssh 免密登录
(1) 下载
Hadoop下载地址
用Xftp工具将hadoop-2.6.0-cdh5.14.2.tar.gz导入到/opt/download/hadoop目录下
(2) 解压
进入hadoop压缩包所在目录,执行解压命令,解压到/opt/software目录下
[root@master hadoop]# tar -zxvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/software
(3) 查看是否解压成功并重命名
[root@master hadoop]# cd ../../software/
[root@master software]# ls
hadoop-2.6.0-cdh5.14.2 jdk180
[root@master software]# mv hadoop-2.6.0-cdh5.14.2/ hadoop260
[root@master software]# ls
hadoop260 jdk180
把download里的native包,解压到software下hadoop里的lib/native目录下
(4) 将hadoop添加到环境变量
[root@master software]# cd hadoop260/
[root@master hadoop260]# pwd
/opt/software/hadoop260
[root@master hadoop260]# vi /etc/profile
在最后加入下面的环境变量
export HADOOP_HOME=/opt/software/hadoop260
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
记得source /etc/profile查看结果
[root@master hadoop260]# hadoop version
Hadoop 2.6.0-cdh5.14.2
Subversion http://github.com/cloudera/hadoop -r 5724a4ad7a27f7af31aa725694d3df09a68bb213
Compiled by jenkins on 2018-03-27T20:40Z
Compiled with protoc 2.5.0
From source with checksum 302899e86485742c090f626a828b28
This command was run using /opt/software/hadoop260/share/hadoop/common/hadoop-common-2.6.0-cdh5.14.2.jar
(5) 配置集群
Hadoop的配置文件全部在$HADOOP_HOME/etc/hadoop目录下,下面不再说明
切换目录
[root@master hadoop260]# cd $HADOOP_HOME/etc/hadoop
先配置hdfs
(a)配置:hadoop-env.sh
Linux系统中获取jdk的安装路径:
可以通过echo $JAVA_HOME查看
[root@master hadoop260]# vi hadoop-env.sh
修改JAVA_HOME 路径:
export JAVA_HOME=/opt/software/jdk180
(b)配置:core-site.xml
在hadoop260下创建/data/tmp
[root@master hadoop260]# vi core-site.xml
在< configuration></ configuration>之间写入配置信息
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.247.200:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software/hadoop260/data/tmp</value>
</property>
</configuration>
(c)配置:hdfs-site.xml
[root@master hadoop260]# vi hdfs-site.xml
在< configuration></ configuration>之间写入配置信息
<configuration>
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
再配置yarn
(a)配置mapred-site.xml
[root@master hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(b)配置yarn-site.xml
[root@master hadoop]# vi yarn-site.xml
<configuration>
<!-- reducer取数据的方式是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
(6) 启动集群
(a)格式化NameNode(第一次启动时格式化,以后就不要格式化,多次格式化会导致namenode无法启动)
[root@master hadoop]# hdfs namenode -format
(b)启动集群
[root@master hadoop]# start-dfs.sh
[root@master hadoop]# jps
[root@master hadoop]# start-yarn.sh
(c)web端查看HDFS文件系统
http://192.168.247.200:50070
此时分布式环境搭建完成
二、ZooKeeper完全分布式环境搭建
(1) 解压zookeeper
[root@master hadoop]# tar -zxvf zookeeper-3.4.5-cdh5.14.2.tar.gz -C /opt/software/
(2) 进入安装目录,改名
[root@master software]# ls
hadoop260 jdk180 zookeeper-3.4.5-cdh5.14.2
[root@master software]# mv zookeeper-3.4.5-cdh5.14.2/ zookeeper345
[root@master software]# ls
hadoop260 jdk180 zookeeper345
(3) zookeeper目录下创建mydata文件夹,mydata下创建一个myid文件,myid里只需要写机器序号
(4) 进入conf目录,拷贝一份zoo_sample.cfg 命名为zoo.cfg 防止配置时写错
[root@master zookeeper345]# cd conf/
[root@master conf]# cp zoo_sample.cfg zoo.cfg
[root@master conf]# vi zoo.cfg
修改如图所标注的地方
(5) 配置环境变量
[root@master conf]# vi /etc/profile
激活环境变量
[root@master conf]# source /etc/profile
(6) 启动zookeeper
zookeeper配置完成!
三、Hadoop高可用集群搭建
1.准备
(a) 搭建好一个Hadoop完全分布式集群(可以未进行namenode格式化),此处用到三台机器master、slave1、slave2
(b) ZooKeeper完全分布式环境已经安装完成
2.HDFS-HA(High Available)
a.配置 HDFS-HA 集群
master | slave1 | slave2 |
---|---|---|
NameNode | NameNode | |
ResourceManager | ResourceManager | |
ZKFC | ZKFC | |
DataNode | DataNode | DataNode |
JournalNode | JournalNode | JournalNode |
NodeManager | NodeManager | NodeManager |
ZooKeeper | ZooKeeper | ZooKeeper |
(1) 在第一台机器 (master) 配置core-site.xml
<configuration>
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software/hadoop260/data/tmp</value>
</property>
</configuration>
(2) 在第一台机器 (master) 配置hdfs-site.xml
<configuration>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些,这里是nn1和nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:9000</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应,多个机制用换行分割,即每个机制占用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/software/hadoop260/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>
(3) 拷贝配置好的hadoop环境到其他节点
[root@master hadoop]# scp core-site.xml root@slave1:$PWD
[root@master hadoop]# scp hdfs-site.xml root@slave1:$PWD
b.启动 HDFS-HA 集群
(1) 在各个JournalNode节点上,输入以下命令启动journalnode服务
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
(2) 在[nn1]上,对其进行格式化,并启动
(如果之前已经格式化过,此处格式化会导致namenode和datanode VRESION中的clusterID不一致,进而导致datanode无法启动。解决方案:修改datanode中的clusterID与namenode中的clusterID相同)
[root@master tmp]# $HADOOP_HOME/bin/hdfs namenode -format
[root@master tmp]# $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
(3) 在[nn2]上,同步nn1的元数据信息
[root@slave1 tmp]# $HADOOP_HOME/bin/hdfs namenode -bootstrapStandby
(4) 启动[nn2]
[root@slave1 tmp]# $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
(5) 查看web页面显示
(6) 在[nn1]上,启动所有datanode
[root@master tmp]# $HADOOP_HOME/sbin/hadoop-daemons.sh start datanode
(7) 将[nn1]切换为Active
[root@master tmp]# $HADOOP_HOME/bin/hdfs haadmin -transitionToActive nn1
(8) 查看是否Active
[root@master tmp]# $HADOOP_HOME/bin/hdfs haadmin -getServiceState nn1
c.配置 HDFS-HA 自动故障转移
- 具体配置
(1) 在hdfs-site.xml中增加
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
(2) 在core-site.xml文件中增加
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
- 启动
(1) 关闭所有HDFS服务
stop-dfs.sh
(2) 启动Zookeeper集群
zkServer.sh start
(3) 初始化 HA 在 Zookeeper 中状态
hdfs zkfc -formatZK
(4) 启动HDFS服务
start-dfs.sh
(5) 在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode(默认start-dfs.sh已经自动启动,以下是单独启动的命令)
hadoop-daemon.sh start zkfc
- 验证
(1) 将Active NameNode进程kill
kill -9 namenode的进程id
(2) 将Active NameNode机器断开网络
service network stop
3.YARN-HA
a.配置YARN-HA集群
- 规划集群
master | slave |
---|---|
ResourceManager | ResourceManager |
- 具体配置
(1) yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--声明两台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
(2) 同步更新其他节点的yarn-site.xml配置信息
[root@master hadoop]# scp yarn-site.xml root@slave1:$PWD
b.启动yarn
(1) 在 master 中执行
start-yarn.sh
(2) 在 slave1 中执行
yarn-daemon.sh start resourcemanager
(3) 查看服务状态
yarn rmadmin -getServiceState rm1
(4) 查看web端显示