Hadoop高可用安装

概述

原创文章,转载请注明出处!
在本系列文档中,将利用4台虚拟机搭建Hadoop生态高可用环境,并引入基本示例,供学习参考之用。
虚拟机配置:CPU 1核、内存 2G、硬盘 50G

1. 规划

节点名称 HDFS YARN HA
bigdata02 NameNode + DataNode NodeManager zk + JournalNode
bigdata03 DataNode NodeManager zk + NameNode + JournalNode
bigdata04 DataNode ResourceManager + NodeManager zk + JournalNode
bigdata05 DataNode + jobhistory ResourceManager + NodeManager observer

注意:在HA的架构下,就不需要secondarynamenode了。 JN日志节点是一个轻量级的,所以可以和Hadoop的其他守护线程放在一起。

2. Hadoop介绍

Hadoop从2.x开始,就开始分化了。逐渐演变成:HDFS,YARN,MapReduce三大应用模块,这三个应用模块分别的能力和作用是:

1、HDFS:分布式文件系统,用来解决海量大文件的存储问题
2、MapReduce:一套通用的用来解决海量大文件计算的编程模型API
3、YARN:资源调度/管理系统

其中需要注意的是:这三者之间的关系。彼此独立,又相互依赖。使用 MapReduce 的分布式编程API编写分布式计算应用程序,读取存储在 HDFS 上的海量大文件进行计算,由YARN提供计算资源。HDFS和 YARN 可以独立运行。主要表现在:

1、使用MapReduce编写的应有程序也可以运行在其他资源调度系统之上
2、使用其他编程模型编写的应用程序,比如Storm,Spark,Flink等也可运行在YARN集群上

所以称 Hadoop 是一个分布式的成熟解决方案。 所以其实安装 Hadoop,其实就是安装 HDFS 和 YARN 两个集群。HDFS 和 YARN 都是一个一主多从的 集群。

HDFS 集群:

一个NameNode主节点/管理节点
多个DataNode从节点/工作节点

YARN集群:

一个ResourceManager主节点/管理节点
多个NodeManager从节点/工作节点

3. 技术选型

现阶段,搭建 Hadoop 集群主要有两种方式:

1、使用官网下载的安装包,或者官网的 Hadoop 源码包自行编译安装,或者使用安装包自行安装。这种开源的方式最大的好处就是开源不收费,灵活可控。 2、使用 Hadoop 的发行厂商的套件进行安装,比如 Cloudera 企业的 CDH,HortonWorks 的 HDP,当然现在他们合并了,而且也是部分功能收费的。使用这些收费厂商的发行版本最大的好处,就是相对来说,修复bug的速度会快于开源社区。

现阶段,比较典型的,就是少部分企业,选择 CDH,特别是个别有钱的中小企业。能用钱快速解决的事情,绝对不麻烦程序员小哥哥自己开发。另外,中大型公司的主流选择,都是使用开源的源码自行编译安装,然后开发对应的管理平台。好处就是可控。反正大厂中,没有程序小哥哥解决不了的bug。实在不行,还有社区和开原组织。

所以该怎么选,还是根据企业的实际情况来选择。

在此,我们选择开源的 Hadoop。感谢 Apache 和广大开源社区。

4. 版本选择

现在 Hadoop 经历四个大版本:

hadoop-0.x # 古老的Hadoop,连YARN都没有,现在应该没有任何企业还在使用这么古老的Hadoop了
hadoop-1.x # 基本淘汰的Hadoop版本。不用考虑
hadoop-2.x # 现阶段主流的使用版本。比如Hadoop-2.6.5, hadoop-2.7.7, hadoop-2.8.5
hadoop-3.x # 目前较新的Hadoop版本,提供了很多新特性,但是升级的企业还是比较少。

根据以上的说明和比较,本手册选择使用 Hadoop-2.7.7。

一、关于CentOS7的一些必备配置

1. 安装一些必备的软件

yum -y install net-tools
yum -y install ntpdate
yum -y install wget
yum -y install perl
yum -y install vim*
yum -y install lrzsz

2. 修改主机名

在root账号下,使用命令也可以进行永久更改:

hostnamectl set-hostname bigdata01

3. 设置系统默认启动级别【可选】

我们安装的如果是centos7的minimal系统的话,可以不用做任何 更改的。centos7的minimal系统的默认级别就是multi-user.target。 如果需要更改:

systemctl set-default multi-user.target

4. 配置bigdata用户 sudoer权限

1、创建bigdata用户,并且在bigdata的用户家目录中,创建如下文件夹备用:

mkdir ~/apps
mkdir ~/bins
mkdir ~/data
mkdir ~/soft
mkdir ~/logs

2、 在root账号下,命令终端输入:

vi /etc/sudoers

3、 找到

root ALL=(ALL) ALL

这一行,然后在他下面添加一行,内容如下:

## Allow root to run any commands anywhere
root ALL=(ALL) ALL
bigdata ALL=(ALL) ALL

该操作表示,把bigdata用户也配置成和root用户一样具有root权限。当然这个操作,只有root用户才 能操作。

5. 配置IP

Linux服务器的IP修改方式有三种,在此不细讲,请参考之前的学习文档。这里提供简易步骤: 第一步:进入到ip配置文件目录中

cd /etc/sysconfig/network-scripts

第二步:编辑IP配置文件

vi ifcfg-ens33

按需修改或者增加如下内容:

BOOTPROTO="static"
ONBOOT="yes"
IPADDR="192.168.123.151"
GATEWAY="192.168.123.2"
DNS1="192.168.123.2"

完整的如下:

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="c08cc7b8-0b9a-46d0-9fc5-f94a233ffa7e"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.123.151"
PREFIX="24"
GATEWAY="192.168.123.2"
DNS1="192.168.123.2"
IPV6_PRIVACY="no"

第三步:重启网络服务

systemctl restart network

6. 关闭防火墙/关闭Selinux

6.1. 防火墙操作相关

查看防火墙状态:如果看到avtive(running)就意味着防火墙开启

systemctl status firewalld

关闭防火墙: 如果看到inactive(dead)就意味着防火墙关闭了

systemctl stop firewalld

开启防火墙:

systemctl start firewalld

以上的开启和关闭,都是临时性的。如果重启,则又恢复原样。默认是开启了防火墙的 查询firewall服务是否开机启动的:

systemctl list-unit-files | grep firewalld

如果为disabled那么就是开机不启动。 如果想永久开启或者关闭(跟重启无关)防火墙,则: 永久关闭防火墙

systemctl disable firewalld

永久开启防火墙:

systemctl enable firewalld

当然如果作为专业的运维人员。其实也可以配置防火墙细则,例如一台机器只作为web服务器的话,就 只需要开放80端口几口。

6.2. 关闭Selinux

具体做法是修改/etc/selinux/config配置文件中的SELINUX=disabled

vi /etc/selinux/config

修改如下配置项:

SELINUX=disabled

保存退出。

7. 添加主机域名ip映射

修改配置文件:

vi /etc/hosts

增加对应的内容:

192.168.123.151 bigdata01
192.168.123.152 bigdata02
192.168.123.153 bigdata03
192.168.123.154 bigdata04
192.168.123.155 bigdata05
192.168.123.156 bigdata06
192.168.123.157 bigdata07
192.168.123.158 bigdata08
192.168.123.159 bigdata09

修改好之后,保存退出即可。 Windows配置:C:\Windows\System32\drivers\etc\hosts

8. 同步服务器时间

对于一个Hadoop集群来说,每个节点的系统时间,应该要都是一样的。进行时间同步,可以有两种简 单的方式,一是手动同步,而是搭建时间服务器进行同步或者从网络定时同步系统时间。推荐最后一 种:从网络定时同步时间。 1、使用date命令手动简单同步一下

date -s "2016-10-23 11:11:11"

修改时间后,需要写入硬件bios才能在重启之后依然生效

hwclock -w

2、配置 crontab 服务,用ntpdate 定时同步时间(推荐方式

*/10 * * * * ntpdate ntp.sjtu.edu.cn

请先测试一下ntpdate命令是否可以使用,如果不可以,使用命令安装一下:

[root@mycentos7 ~]# ntpdate time.nist.gov
[root@mycentos7 ~]# ntpdate 202.120.2.101
[root@mycentos7 ~]# ntpdate ntp.sjtu.edu.cn

3、如果类似202.120.2.101这种网络时间服务器无法访问,那么请自行搭建时间服务器 当然还有一个非常重要的点:不要忘记更改时区,然后再同步时间CentOS中时区是以文件形式存在,当前正在使用的时区文件位于/etc/localtime,其他时区文件则位于

/usr/share/zoneinfo

其中中国时区使用

/usr/share/zoneinfo/Asia/Shanghai

则,更改时区的话,直接使用如下命令就OK

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

如果没有Asia/Shanghai时区文件,请执行tzselect命令按照引导去生成时区文件,生成好的时区文件就 在/usr/share/zoneinfo目录下。

9. 配置YUM源

1、配置本地yum源 2、配置国内远程yum源

yum -y install wget
wget http://mirrors.aliyun.com/repo/Centos-7.repo
mv /root/Centos-7.repo /root/Centos-7-aliyun.repo
cp /root/Centos-7-aliyun.repo /etc/yum.repos.d/
yum repolist

这个步骤最好做一下,但是是非必须的。

10. 安装JDK

安装JDK的操作,请参考对应的安装文档。 在此贴出关键步骤:

tar -zxvf /root/soft/jdk-8u73-linux-x64.tar.gz -C /usr/local/java/
vi /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_73
export PATH=$PATH:$JAVA_HOME/bin
export
CLASSPATH=.:/usr/local/java/jdk1.8.0_73/lib/dt.jar:/usr/local/java/jdk1.8.0_73/l
ib/tools.jar
source /etc/profile
java -version

11. 执行虚拟机克隆

根据规划的节点数克隆:VMware,在data01虚拟机右键-管理-克隆-完全克隆

切记:克隆完毕需要做几件事: 1、mac地址

vmware-编辑虚拟机-网络适配器-高级-MAC地址-生成

2、IP地址

cd /etc/sysconfig/network-scripts
vi ifcfg-ens33
或
vi /etc/sysconfig/network-scripts/ifcfg-ens33
记住把UUID行去掉
也可可输入如下命令获得新UUID号:uuidgen ens33
按需修改或者增加如下内容
BOOTPROTO="static"
ONBOOT="yes"
IPADDR="192.168.123.151"
GATEWAY="192.168.123.2"
DNS1="114.114.114.114"
DNS2="114.114.115.115"

3、主机名称

vi /etc/hostname
或
hostnamectl set-hostname bigdata02

12. 配置SSH免密登录

对于一个集群来说,节点间的互信是必不可少的。所以一定要给集群的所有节点之间配置免密SSH访 问。切记,你使用哪个用户搭建Hadoop集群,就给哪个用户配置SSH免密访问。另外需要注意的:所 有节点的安装Hadoop的用户都一样该一样。我使用的就是bigdata用户。 在bigdata用户登录状态下,执行命令生成公钥私钥对:

ssh-keygen -t rsa # 或者执行这个命令 -t 表示指定秘钥算法

之后你会发现,在/home/hadoop/.ssh目录下生成了公钥文件

id_rsa # 私钥
id_rsa.pub # 公钥

使用一个更简单的方式,使用命令:

ssh-copy-id bigdata02 # 该命令的作用,就是把当前用户的公钥文件内容,发送到hadoop02这台
机器的相同用户的授权文件中去。
ssh-copy-id bigdata03
ssh-copy-id bigdata04
ssh-copy-id bigdata05

建立bigdata01到bigdata02的免密登录,切记,我把公钥发送给对方,我就可以访问对方。而不是对方 可以访问我。 检查免密登录是否设置成功

ssh bigdata02

看看是不是能登录进入bigdata02的服务器,如果能登陆,则证明配置成功。

注意:本机也需要拷贝自己一份,否则在启动HDFS集群时会出错。

二、ZooKeeper集群安装

鉴于 ZooKeeper 本身的特点,服务器集群的节点数推荐设置为奇数台。这里我规划为三台,为别为 bigdata02, bigdata03, bigdata04。

注意:牢记 Linux 上安装大数据领域技术软件的安装四大步骤。

1. 做技术选型,选择合适版本,从官网下载对应平台的软件安装包
2. 安装(zookeeper可以直接从官网下载二进制发布包,所以可以解压缩到对应目录进行安装即可)
3. 修改配置文件,集群初始化
4. 启动集群,测试验证,基本使用

1. 第一步:下载

下载地址:http://mirrors.hust.edu.cn/apache/ZooKeeper/ 版本号:zookeeper-3.4.14.tar.gz 命令:

[bigdata@bigdata05 soft]$ cd ~/soft
[bigdata@bigdata05 soft]$ wget
http://mirrors.hust.edu.cn/apache/ZooKeeper/ZooKeeper-3.4.14.tar.gz

也可以通过其他渠道进行下载。 如在SecureCRT中alt+p,打开ftp窗口,然后拖进去。 或者用rz。

2. 第二步:解压缩安装到自己的安装目录

命令:

[bigdata@bigdata05 ~]$ tar -zxvf ~/soft/zookeeper-3.4.14.tar.gz -C ~/apps/

3. 修改配置文件

命令:

[bigdata@bigdata05 ~] cd /home/bigdata/apps/zookeeper-3.4.14
[bigdata@bigdata05 zookeeper-3.4.14]# cd conf/
[bigdata@bigdata05 conf]# cp zoo_sample.cfg zoo.cfg
[bigdata@bigdata05 conf]# vi zoo.cfg

添加以下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/bigdata/data/zkdata
dataLogDir=/home/bigdata/logs/zklog/
clientPort=2181
server.2=bigdata02:2888:3888
server.3=bigdata03:2888:3888
server.4=bigdata04:2888:3888

如果要给 zookeeper 集群补充 observer 角色的节点,则可以这么修改配置文件:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/bigdata/data/zkdata/
dataLogDir=/home/bigdata/logs/zklog/
clientPort=2181
server.2=bigdata02:2888:3888
server.3=bigdata03:2888:3888
server.4=bigdata04:2888:3888
server.5=bigdata05:2888:3888:observer
# 如果有第四台机器,并且想配置observer

配置参数解析:

tickTime
# 基本事件单元,以毫秒为单位。它用来控制心跳和超时,默认情况下最小的会话超时时间为两倍的
tickTime。
initLimit
# 此配置表示,允许follower(相对于leader而言的“客户端”)连接并同步到leader的初始化连接时间,
它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败。
syncLimit
# 此配置表示,leader与follower之间发送消息,请求和应答时间长度。如果follower在设置的时间内不
能与leader进行通信,那么此follower将被丢弃。
dataDir
# 存储内存中数据库快照的位置。注意:如果需要保留日志信息,那么可以考虑配置dataLogDir的位置,这
个位置就是日志的存储目录。通常情况下是分开存储的。并且应该谨慎地选择日志存放的位置,使用专用的日
志存储设备能够大大地提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会在很大程度上影
响系统的性能。
clientPort
# 监听客户端连接的端口,默认是2181,最好不要修改
server.id=主机名:心跳端口:选举端口
# 例子:server.2=bigdata02:2888:3888
# 其中id虽然可以随便写,但是有两点要求,第一不能重复,第二范围是1-255,并且对应服务器列表上还得
存在对应的id文件,具体看下面操作

4. 分发安装包到其他节点

命令:

cd ~/apps
[bigdata@bigdata05 apps]$ scp -r zookeeper-3.4.14/ bigdata@bigdata02:$PWD
[bigdata@bigdata05 apps]$ scp -r zookeeper-3.4.14/ bigdata@bigdata03:$PWD
[bigdata@bigdata05 apps]$ scp -r zookeeper-3.4.14/ bigdata@bigdata04:$PWD

5. 特别重要的步骤

然后是最重要的步骤,一定不能忘了。 去你的各个 ZooKeeper 服务器节点,新建目录 dataDir=/home/bigdata/apps/zkdata,这个目录就是 你在 zoo.cfg 中配置的dataDir的目录,建好之后,在里面新建一个文件,文件名叫 myid,里面存放的 内容就是服务器的 id,就是server.2=bigdata02:2888:3888 当中的 id,就是 2,那么对应的每个服务器 节点都应该做类似的操作。

mkdir -p /home/bigdata/data/zkdata
cd /home/bigdata/data/zkdata
echo 2 > myid  #[echo n > myid]

拿服务器 bigdata02 举例:

[bigdat@bigdata02 ~]$ mkdir /home/bigdata/data/zkdata
[bigdat@bigdata02 ~]$ cd /home/bigdata/data/zkdata
[bigdat@bigdata02 zkdata]$ echo 2 > myid

当以上所有步骤都完成时,意味着我们 ZooKeeper 的配置文件相关的修改都做完了。

6. 配置环境变量

命令:

cd ~
[bigdata@bigdata02 ~]$ vi ~/.bashrc

文件末尾追加两行内容:

export ZOOKEEPER_HOME=/home/bigdata/apps/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin

保存退出之后,可以在一台节点上做好,再复制到其他节点:

scp -r .bashrc bigdata03:~
scp -r .bashrc bigdata04:~
scp -r .bashrc bigdata05:~

使用命令source使之生效

[bigdata@bigdata02 ~]$ source ~/.bashrc

7. 启动集群

启动命令(在所有节点执行):

[bigdata@bigdata02 ~]$ zkServer.sh start

关闭命令:

[bigdata@bigdata02 ~]$ zkServer.sh stop

查看集群节点状态和角色命令:

[bigdata@bigdata02 ~]$ zkServer.sh status

注意:

关于 zookeeper 集群, 记住,并没有一键启动集群的启动脚本,需要每个服务节点各自单独启动。 在每台服务节点中,都会运行一个 QuorumPeerMain 的 Java进程,所以也还可以使用 JPS 命令来检查该进程是否正常启动。

三、Hadoop集群安装

为什么会有 hadoop HA机制呢?

HA:High Available,高可用。在Hadoop 2.0之前,在HDFS集群中NameNode 存在单点故障(SPOF:A Single Point of Failure)。对于只有一个NameNode的集群,如果NameNode 机器出现故障(比如宕机或是软件、硬件升级),那么整个集群将无法使用,直到NameNode 重新启动。

那如何解决呢?

HDFS 的HA 功能通过配置Active/Standby 两个NameNodes实现在集群中对NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode 很快的切换到另外一台机器。 在一个典型的HDFS(HA)集群中,使用两台单独的机器配置为NameNodes 。在任何时间点,确保NameNodes 中只有一个处于Active状态,其他的处在Standby状态。其中ActiveNameNode 负责集群中的所有客户端操作,StandbyNameNode仅仅充当备机,保证一旦ActiveNameNode 出现问题能够快速切换。 为了能够实时同步Active和Standby两个NameNode的元数据信息(实际上editlog),需提供一个共享存储系统,可以是NFS、QJM(Quorum Journal Manager)或者Zookeeper,Active Namenode将数据写入共享存储系统,而Standby监听该系统,一旦发现有新数据写入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与ActiveNameNode保持基本一致,如此这般,在紧急情况下standby便可快速切为active namenode。为了实现快速切换,Standby节点获取集群的最新文件块信息也是很有必要的。为了实现这一目标,DataNode需要配置NameNodes 的位置,并同时给他们发送文件块信息以及心跳检测。

1. 上传安装包

使用编译好的hadoop安装包,并解压到相关目录。

cd /home/bigdata/soft
put c:/hadoop-2.7.7-centos-7.tar.gz
tar -zxvf hadoop-2.7.7-centos-7.tar.gz -C /home/bigdata/apps

2. 修改hadoop-env.sh配置文件

修改hadoop-env.sh配置文件,添加jdk安装目录配置。

cd ~/apps/hadoop-2.7.7/etc/hadoop/
echo $JAVA_HOME
[bigdata@bigdata02 hadoop]$ vi hadoop-env.sh

配置如下内容: 将原来的内容 export JAVA_HOME=${JAVA_HOME} 改为echo $JAVA_HOME的内容: (写成 实际的 jdk 的安装, 这是官网推荐的, 因为通过这个脚本去获取, 有bug )

export JAVA_HOME=/usr/java/jdk1.8.0_241

3. 修改core-site.xml配置文件

vi core-site.xml

在标签中添加如下内容:

<configuration>
    <!-- 指定hdfs的nameservice为hadoop277ha -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop277ha/</value>
    </property>
    
    <!-- 指定hadoop工作目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/bigdata/data/hadoopdata/</value>
    </property>
    
    <!-- 指定zookeeper集群访问地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>bigdata02:2181,bigdata03:2181,bigdata04:2181</value>
    </property>
    
    <!-- 这项配置为了解决以后其他组件连接HDFS集群来做准备的 -->
    <property>
        <name>hadoop.proxyuser.bigdata.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.bigdata.groups</name>
        <value>*</value>
    </property>
</configuration>

4. 修改hdfs-site.xml配置文件

vi hdfs-site.xml

在标签中添加如下内容:

<configuration>
	<!-- 指定副本数 -->
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	
	<!--指定hdfs的nameservice为hadoop277ha,需要和core-site.xml中保持一致-->
	<property>
		<name>dfs.nameservices</name>
		<value>hadoop277ha</value>
	</property>
	
	<!-- hadoop277ha下面有两个NameNode,分别是nn1,nn2 -->
	<property>
		<name>dfs.ha.namenodes.hadoop277ha</name>
		<value>nn1,nn2</value>
	</property>
	
	<!-- nn1的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.hadoop277ha.nn1</name>
		<value>bigdata02:9000</value>
	</property>
	
	<!-- nn1的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.hadoop277ha.nn1</name>
		<value>bigdata02:50070</value>
	</property>
	
	<!-- nn2的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.hadoop277ha.nn2</name>
		<value>bigdata03:9000</value>
	</property>
	
	<!-- nn2的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.hadoop277ha.nn2</name>
		<value>bigdata03:50070</value>
	</property>
	
	<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://bigdata02:8485;bigdata03:8485;bigdata04:8485/hadoop277ha</value>
	</property>
	
	<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/home/bigdata/data/journaldata</value>
	</property>
	
	<!-- 开启NameNode失败自动切换 -->
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	
	<!-- 配置失败自动切换实现方式 -->
	<!-- 此处配置在安装的时候切记检查不要换行-->
	<property>
		<name>dfs.client.failover.proxy.provider.hadoop277ha</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	
	<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>
			sshfence
			shell(/bin/true)
		</value>
	</property>
	
	<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/home/bigdata/.ssh/id_rsa</value>
	</property>
	
	<!-- 配置sshfence隔离机制超时时间 -->
	<property>
		<name>dfs.ha.fencing.ssh.connect-timeout</name>
		<value>30000</value>
	</property>
	
	<property>
		<name>dfs.webhdfs.enabled</name>
		<value>true</value>
	</property>
</configuration>

注意:NN的RPC端口可以不指定,默认是 8020,也可以指定。如在配置集群版时, hdfs://hadoop0:9000/ 集群版 core-site.xml:

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop0/</value>
</property>
<property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop0:2181,hadoop1:2181,hadoop2:2181</value>
</property>

5. 修改mapred-site.xml配置文件

你会发现:集群只有mapred-site.xml.template,可以从这个文件进行复制,或者直接改名也可。

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

然后修改配置:

vi mapred-site.xml
<configuration>
	<!-- 指定mr框架为yarn方式 -->
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	
	<!-- 设置mapreduce的历史服务器地址和端口号 -->
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>bigdata05:10020</value>
	</property>
	
	<!-- mapreduce历史服务器的web访问地址 -->
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>bigdata05:19888</value>
	</property>
</configuration>

6. 配置yarn-site.xml配置文件

vi yarn-site.xml

在标签中添加如下内容:

<configuration>
	<!-- 开启RM高可用 -->
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	
	<!-- 指定RM的cluster id -->
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>yrc277</value>
	</property>
	
	<!-- 指定RM的名字 -->
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	
	<!-- 分别指定RM的地址 -->
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>bigdata04</value>
	</property>
	
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>bigdata05</value>
	</property>
	
	<!-- 指定zk集群地址 -->
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>bigdata02:2181,bigdata03:2181,bigdata04:2181</value>
	</property>
	
	<!-- 要运行MapReduce程序必须配置的附属服务 -->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	
	<!-- 开启YARN集群的日志聚合功能 -->
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	
	<!-- YARN集群的聚合日志最长保留时长 -->
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>86400</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>

7. 配置slaves配置文件

vi slaves

注意:删除localhost

bigdata02
bigdata03
bigdata04
bigdata05

8. 分发安装到其他节点

如果刚才我是在 bigdata02 执行安装的话, 那么现在要把 hadoop 安装包分发到 bigdata03,bigdata04, bigdata05 的相同目录下。

cd ~/apps
[bigdata@bigdata02 apps]$ scp -r hadoop-2.7.7/ bigdata@bigdata03:$PWD
[bigdata@bigdata02 apps]$ scp -r hadoop-2.7.7/ bigdata@bigdata04:$PWD
[bigdata@bigdata02 apps]$ scp -r hadoop-2.7.7/ bigdata@bigdata05:$PWD

9. 配置环境

由于我们安装Hadoop 集群使用的是 bigdata用户,那么我们配置用户变量即可。

vi ~/.bashrc

在文件的末尾追加内容:

export HADOOP_HOME=/home/bigdata/apps/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

然后保存退出即可。需要注意的是:需要每个节点都配置环境变量。 运行source命令使其生效:

source ~/.bashrc

10. 启动 zookeeper 集群

[bigdata@bigdata02 ~]$ zkServer.sh start
[bigdata@bigdata03 ~]$ zkServer.sh start
[bigdata@bigdata04 ~]$ zkServer.sh start

启动 journalnode

[bigdata@bigdata02 ~]$ hadoop-daemon.sh start journalnode
[bigdata@bigdata03 ~]$ hadoop-daemon.sh start journalnode
[bigdata@bigdata04 ~]$ hadoop-daemon.sh start journalnode

11. 执行HDFS集群的初始化

在第一个namenode节点进行格式化: 先检查一下Hadoop数据文件夹,没有的话开始初始化。

cd ~/data/
ll
[bigdata@bigdata02 ~]$ hadoop namenode -format

可以看到类似以下“successfully formatted”的信息,则说明初始化成功。

20/07/11 18:24:33 INFO common.Storage: Storage directory /home/bigdata/data/hadoopdata/dfs/name has been successfully formatted.

切记:

关于初始化操作,是第一次安装Hadoop集群的时候初始化一次就可以了,而不是后面每次使用 的都需要初始化一次。切记。很多小伙伴在此翻车了。所以做重点提醒。如果你想要把一个旧HDFS集群的数据都给删掉,当做一个新集群来使用。那么你可以重新初始化,但是你还是要记得把对应的每个 节点数据存储目录先行删掉。然后再初始化。这样你就又得到了一个新HDFS集群。

初始化成功后,可以看到数据目录hadoopdata。

拷贝第一个 namenode 节点上初始化成功的元数据到第二个namenode 节点的相同目录下:

[bigdata@bigdata02 ~]$ cd /home/bigdata/data
[bigdata@bigdata02 data]$ ll
total 0
drwxrwxr-x 3 bigdata bigdata 17 Jul 11 18:24 hadoopdata
drwxrwxr-x 3 bigdata bigdata 25 Jul 11 18:24 journaldata
drwxrwxr-x 3 bigdata bigdata 63 Jul 11 14:19 zkdata
[bigdata@bigdata02 data]$ scp -r hadoopdata/ bigdata@bigdata03:$PWD
VERSION 100% 207 333.1KB/s 00:00
seen_txid 100% 2 4.4KB/s 00:00
fsimage_0000000000000000000.md5 100% 62 118.0KB/s 00:00
fsimage_0000000000000000000 100% 324 582.1KB/s 00:00

这样就算成功了。 选择一个节点执行zookeeper的元数据初始化:

[bigdata@bigdata02 data]$ hdfs zkfc -formatZK

可以看到类似以下“successfully created”的信息,则说明初始化成功。

20/07/11 18:37:54 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/hadoop277ha in ZK.

12. 启动HDFS集群

启动hdfs:

start-dfs.sh

不论在那个节点执行这个命令,都可以启动HDFS集群。 启动成功的话,会在对应的节点上启动好对应的守护进程,就如前面的集群规划表中所列举一般。

当然也可能出现部分节点上的对应进程没有启动成功,这个时候,你首先需要排查原因。如果是能正常启动的话。那么使用如下命令:

hadoop-daemon.sh start namenode # 启动
hadoop-daemon.sh stop namenode # 停止
hadoop-daemon.sh restart namenode # 重启

这里列举的是 namenode 进程,当然,datanode 进程,resourcemanager 等进程,也都是同样的道理。只是需要注意的一点就是:那个节点的什么进程没有启动,那就在对应的节点上执行启动命令单独启动。

在实际企业环境中,stop-dfs.sh 之类的命令不会轻易执行的。所以一般出现了哪个节点宕机,或者服务下线了,都是单独启动。

启动成功的话,有类似如下信息:

Starting namenodes on [bigdata02 bigdata03]
bigdata03: starting namenode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-namenode-bigdata03.out
bigdata02: starting namenode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-namenode-bigdata02.out
bigdata04: starting datanode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-datanode-bigdata04.out
bigdata05: starting datanode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-datanode-bigdata05.out
bigdata03: starting datanode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-datanode-bigdata03.out
bigdata02: starting datanode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-datanode-bigdata02.out
Starting journal nodes [bigdata02 bigdata03 bigdata04]
bigdata03: starting journalnode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-journalnode-bigdata03.out
bigdata04: starting journalnode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-journalnode-bigdata04.out
bigdata02: starting journalnode, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-journalnode-bigdata02.out
Starting ZK Failover Controllers on NN hosts [bigdata02 bigdata03]
bigdata03: starting zkfc, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-zkfc-bigdata03.out
bigdata02: starting zkfc, logging to /home/bigdata/apps/hadoop-2.7.7/logs/hadoop-bigdata-zkfc-bigdata02.out

13. 启动YARN集群

在 YARN 主节点启动 YARN,要求在YARN主节点进行启动,否则 ResourceManager 主进程会启动不成功,需要额外手动启动。

注:在哪个节点启动Yarn,那个节点就是主节点,也就是说会启动ResourceManager。

[bigdata@bigdata04 ~]$ start-yarn.sh
[bigdata@bigdata05 ~]$ yarn-daemon.sh start resourcemanager  # 备用RM不会自动启动

启动效果:

jps
在主节点启动了resourcemanager守护进程
在从节点启动了nodemanager守护进程

如果出现YARN集群的部分节点没有启动成功,也可以使用命令单独启动这些服务进程。

yarn-daemon.sh start resourcemanager
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh restart resourcemanager

14. 检查安装是否成功

14.1 首先看看各节点进程是否符合预设

[bigdata@bigdata02 data]$ jps
1618 QuorumPeerMain
3526 DataNode
4455 Jps
3912 DFSZKFailoverController
3753 JournalNode
3420 NameNode
4302 NodeManager
[bigdata@bigdata03 ~]$ jps
3811 Jps
3048 NameNode
3672 NodeManager
3337 DFSZKFailoverController
1564 QuorumPeerMain
3246 JournalNode
3119 DataNode
[bigdata@bigdata04 ~]$ jps
3012 NodeManager
1544 QuorumPeerMain
2904 ResourceManager
2505 DataNode
2604 JournalNode
3342 Jps
[bigdata@bigdata05 .ssh]$ jps
3584 Jps
1522 QuorumPeerMain
3538 ResourceManager
2659 DataNode
3383 NodeManager

14.2 HDFS 和 YARN集群测试

因为 Hadoop 集群,事实上,包含了 HDFS 和 YARN 两个集群,所以两个集群都分别做一次测试。 关于 HDFS:上传一个文件查看是否存在,再下载下来。

echo "I\'m Joe" > joe.log
hadoop fs -put joe.log /    # 上传一个文件student.txt到/目录下
hadoop fs -ls / # 查询HDFS集群上的文件信息
hadoop fs -get /joe.log ~/joe_copy.log  # 下载文件

关于 YARN:提交一个 mapreduce 例子程序。

hadoop fs -mkdir -p /wc/input/
hadoop fs -put wc.txt /wc/input/
cd ~/apps/hadoop-2.7.7/share/hadoop/mapreduce/

# 求pi
hadoop jar hadoop-mapreduce-examples-2.7.7.jar pi 5 100
# 运行过程中可以进入Yarn的web页面刷新查看

# 求wordcount
hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /wc/input /wc/output  

wc.txt文件的内容:

hadoop hello world
hello hadoop
hbase zookeeper

查看结果

[bigdata@bigdata02 mapreduce]$ hadoop fs -cat /wc/output/*
hadoop  2
hbase   1
hello   2
world   1
zookeeper       1

14.3 检测web ui启动是否成功

访问hdfs的web页面:http://bigdata02:50070 或者 http://bigdata03:50070
访问yarn的web页面:http://bigdata04:8088 或者 http://bigdata05:8088

14.4 启动历史服务器

在历史服务器节点bigdata05启动命令:

[bigdata@bigdata05 ~]$ mr-jobhistory-daemon.sh start historyserver
访问YARN任务历史服务器的web页面:http://bigdata05:19888

15. 查看集群的状态

查看所有节点状态:

hadoop dfsadmin -report
hdfs dfsadmin -report(推荐用这个)

查看 HDFS 集群的两个 namenode 的角色状态:

[bigdata@bigdata02 mapreduce]$ hdfs haadmin -getServiceState nn1
standby
[bigdata@bigdata02 mapreduce]$ hdfs haadmin -getServiceState nn2
active

查看YARN集群的两个resourcemanager的角色状态:

[bigdata@bigdata02 mapreduce]$ yarn rmadmin -getServiceState rm1
active
[bigdata@bigdata02 mapreduce]$ yarn rmadmin -getServiceState rm2
standby

16. 高可用集群测试

1、干掉active namenode, 看看集群有什么变化 (kill -9 pid)

2、在上传文件的时候干掉active namenode, 看看有什么变化

3、干掉active resourcemanager, 看看集群有什么变化

4、在执行任务的时候干掉active resourcemanager,看看集群有什么变化

可以使用-forcemanual参数强制切换主节点与备用主节点,但强制切换后集群的自动故障转移将会失效,需要重新格式化zkfc:hdfs zdfc -formatZK

hdfs haadmin -transitionToActive/transitionToStandby  -forcemanual  bigdata02

yarn rmadmin -transitionToActive/transitionToStandby  -forcemanual  bigdata04

17. 启动集群总结

17.1 启动 zookeeper 集群

[bigdata@bigdata02 ~]$ zkServer.sh start
[bigdata@bigdata03 ~]$ zkServer.sh start
[bigdata@bigdata04 ~]$ zkServer.sh start
[bigdata@bigdata05 ~]$ zkServer.sh start

zkServer.sh status

17.2 启动 journalnode (正常情况下不需要)

[bigdata@bigdata02 ~]$ hadoop-daemon.sh start journalnode
[bigdata@bigdata03 ~]$ hadoop-daemon.sh start journalnode
[bigdata@bigdata04 ~]$ hadoop-daemon.sh start journalnode

17.3 启动HDFS集群

[bigdata@bigdata02 ~]$ start-dfs.sh

单个节点启动

hadoop-daemon.sh start namenode # 启动
hadoop-daemon.sh stop namenode # 停止
hadoop-daemon.sh restart namenode # 重启

17.4 启动YARN集群

注:在哪个节点启动Yarn,那个节点就是主节点,也就是说会启动ResourceManager。另一个RM需要单独启动。

[bigdata@bigdata04 ~]$ start-yarn.sh
[bigdata@bigdata05 ~]$ yarn-daemon.sh start resourcemanager  # 备用RM不会自动启动

单个节点启动

yarn-daemon.sh start resourcemanager
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh restart resourcemanager

17.5 启动历史服务器

[bigdata@bigdata05 ~]$ mr-jobhistory-daemon.sh start historyserver

17.6 检测web ui启动是否成功

访问hdfs的web页面:http://bigdata02:50070 或者 http://bigdata03:50070
访问yarn的web页面:http://bigdata04:8088 或者 http://bigdata05:8088
访问YARN任务历史服务器的web页面:http://bigdata05:19888

17.7 查看集群的状态

hdfs dfsadmin -report

17.8 手动切换NM active节点

第一种:把两个 standby 的 namenode 都kill 掉, 然后单独启一个。 然后过段时间再启另外一个。
第二种:命令去手动切换 standby 的状态为 active :  hdfs haadmin -transitionToActive nn1 

18. 停止集群

停止HDFS集群和Yarn集群

[bigdata@bigdata02 mapreduce]$ stop-dfs.sh
[bigdata@bigdata02 mapreduce]$ stop-yarn.sh

单独停止ResourceManager

[bigdata@bigdata04 ~]$ yarn-daemon.sh stop resourcemanager
[bigdata@bigdata05 ~]$ yarn-daemon.sh stop resourcemanager

单独停止Zookeeper

[bigdata@bigdata02 mapreduce]$ zkServer.sh stop
[bigdata@bigdata03 mapreduce]$ zkServer.sh stop
[bigdata@bigdata04 mapreduce]$ zkServer.sh stop
[bigdata@bigdata05 mapreduce]$ zkServer.sh stop

单独停止历史服务器

[bigdata@bigdata05 ~]$ mr-jobhistory-daemon.sh stop historyserver

最后,使用jps命令查看各节点进程,确定有关进程是否停止成功。

四、Hadoop机架感知

集群网络拓扑图

机架感知配置演示 http://blog.csdn.net/zhongqi2513/article/details/73695229

五、Hadoop Fedaration

为什么要有 Federation 机制呢?

在Hadoop 2.0之前,HDFS的单NameNode设计带来很多问题,包括单点故障、内存受限,制约集群扩展性和缺乏隔离机制(不同业务使用同一个NameNode导致业务相互影响)等。为了解决这些问题,除了用基于共享存储的HA解决方案,我们还可以用HDFS的Federation机制来解决这个问题。

什么是Federation机制?

HDFS Federation是指HDFS集群可同时存在多个NameNode。这些NameNode分别管理一部分数据,且共享所有DataNode的存储资源。

这种设计可解决单NameNode存在的以下几个问题:

1、HDFS集群扩展性。多个NameNode分管一部分目录,使得一个集群可以扩展到更多节点,不再像1.0中 那样由于内存的限制制约文件存储数目。 2、性能更高效。多个NameNode管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐 率。 3、良好的隔离性。用户可根据需要将不同业务数据交由不同NameNode管理,这样不同业务之间影响很 小。

注意问题:HDFS Federation并不能解决单点故障问题,也就是说,每个NameNode都存在在单点故障问题,你需要为每个namenode部署一个backup namenode以应对NameNode挂掉对业务产生的影响。

六、开发环境搭建

1. Maven

新建系统变量

M2_HOME
D:\Work\Maven\apache-maven-3.6.3

PATH增加

%M2_HOME%\bin

检测一下

mvn -version

2. Java

新建系统变量

JAVA_HOME
D:\MyProgram\Java\jdk1.8.0_221

PATH增加

%JAVA_HOME%\bin

检测一下

java -version

3. IDEA配置

配置Maven环境参数

file - settings - Build - Build Tools - Maven
Maven home directory: 将其自带的Maven库改成我们安装的。
D:\Work\Maven\apache-maven-3.6.3

User settings file: 改成我们自己的settings.xml (Override)
D:\Work\Maven\apache-maven-3.6.3\conf\settings.xml

安装Scala

file - settings - Plugins
搜Scala安装
或
点击齿轮图标,选择Install Plugin from Disk...

字体大小设置

file - settings - Appearance & Behavior - Appearance
Use custom font

file - settings - Editor - General
Change font size(Zoom) with Ctrl+Mouse Wheel

file - settings - Editor - Font -Size

字符编码集

file - settings - Editor - File Encodings
将Global Encoding, Project Encoding, Default encoding for properties files 都改成UTF-8

补充:IntelliJ IDEA如何build path

File -> Project Structure -> Modules -> 选中要添加build path的项目 -> Dependencies -> 点击右边的小加号  -> 选择JARs or directories ->选择要添加的外部jar包

版权声明:本文为homecat原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/homecat/p/14885372.html