HA集群搭建

Hadoop

HA集群搭建文档.................................................................................................. 2

1、 概述................................................................................................................... 2

1.1 安装环境...................................................................................................... 2

1.2 高可用(HA)hadoop集群介绍..................................................................... 2

1.3 集群规划...................................................................................................... 3

2、Hadoop集群搭建.................................................................................................. 4

2.1 集群基础环境配置........................................................................................ 5

2.2 集群搭建.................................................................................................... 12


Hadoop

HA集群搭建文档


详细记录在本地Vmware虚拟机中搭建五节点的Hadoop HA集群过程

[if !supportLists]1、[endif]概述

1.1 安装环境

本机系统:win10 16GB内存

虚拟机系统:CentOS6.8 64位

虚拟机软件:VMWare14.1.1

JDK版本:JDK1.8.0.92

Hadoop版本:2.6.5

Zookeeper版本:3.4.10


1.2 高可用(HA)hadoop集群介绍

1)HDFS高可用


在 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 监听该系统,一旦发现有新数据写入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode 保持基本一致,如此这般,在紧急情况下 standby 便可快速切为 active namenode。HDFS NameNode 的高可用整体架构如下图所示:[if !vml]

[endif]

2)YARN高可用


对于ResourceManger也存在单点故障问题,ResourceManager(RM)负责跟踪群集中的资源,并调度应用程序(例如MapReduce作业)。在Hadoop 2.4之前,ResourceManager是YARN集群中的单点故障。高可用性功能以活动/待机资源管理器对的形式添加冗余,以消除此单一故障点。

ResourceManger高可用架构图如下:

[if !vml]

[endif]



1.3 集群规划

这里是一个五节点的Hadoop HA集群,集群规划如下:


节点(IP)角色

Hadoop01(192.168.1.11)namenode,datanode,nodemanager,zookeeper, journalnode

Hadoop02(192.168.1.12)secondaryNamenode,datanode,nodemanager,zookeeper, journalnode

Hadoop03(192.168.1.13)datanode,nodemanager,zookeeper, journalnode

Hadoop04(192.168.1.14)datanode,nodemanager,zookeeper, resourcemanager, journalnode

Hadoop05(192.168.1.15)datanode,nodemanager,zookeeper, resourcemanager, journalnode



2、Hadoop集群搭建

注意:没特殊说明,都是使用hadoop用户进行操作,需要使用root用户进行操作的时候,会特别指出;


首先做一下说明,统一将软件安装到/app目录下,方便管理,安装软件的时候,需要切换到普通hadoop用户;


切换到root用户,在根目录下创建一个/app目录,并修改权限:

[if !vml]

[endif]


2.1 集群基础环境配置

2.1.1 添加hadoop用户

如果hadoop01~hadoop05节点没有hadoop用户,请创建一个hadoop用户;

2.1.2 防火墙配置

在这里直接关闭了防火墙和SELINUX,实际生产环境中不能直接关闭,需要添加修改防火墙规则;

2.1.3 网络设置

在进行以下操作的前提是:五台节点之间的网络互通,参考:“海工所_VMWware安装虚拟机文档_大数据_郑智”文档中的网络配置部分;

2.1.4 SSH免密登录配置(重难点)


1)为什么需要配置SSH免密?


在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作。例如,某个脚本能够终止并重启集群中的所有守护进程。所以,需要安装2 SSH,但是,SSH远程登陆的时候,需要密码验证,集群中数千台计算机,数千台计算机都需要手工输入密码,这是不太现实的,所以,就需要配置SSH无密码登录。


例如,如果主机上安装了ssh服务,但是没有做任何配置,也可以使用ssh登录到远程主机,但是需要输入密码,如下所示:

[if !vml]

[endif]

即使ssh 本机,也需要输入密码;


2)SSH免密登录原理


客户机用户拥有自己的一对公钥私钥对,它将公钥分发给需要远程登录的主机上,然后在客户机需要ssh登录远程主机时,客户机会发送一个请求给远程主机,远程主机用客户机的公钥加密一段信息,然后发送给客户机,客户机使用私钥进行解密后,将原始的信息再发送给远程主机,远程主机经过验证后,来判断这个客户机的身份;



现在配置五台节点之间,hadoop用户的免密SSH登录;


3)生成公钥密钥对


下面,以节点hadoop01为例,介绍下如下在hadoop用户下生成rsa公钥密钥对


首先,切换到hadoop用户,运行命令:ssh-keygen -t rsa #(生成的是rsa类型的密钥),出现需要输入的地方,直接按“Enter”键;


[if !vml]

[endif]


运行完成后看,会在hadoop用户目录的.ssh目录下生成一个公钥文件和私钥文件,id_rsa为私钥文件,id_rsa.pub为公钥文件,如下图:


[if !vml]

[endif]


分别在其他四个节点上执行相同的操作,生成公钥私钥对;


4)传送公钥文件到远程主机


然后,以节点hadoop01作为客户机,hadoop01、hadoop02、hadoop03、hadoop04、hadoop05作为需要远程登录的主机,介绍如何实现从客户机上免密ssh登录远程主机的步骤:


首先,在客户机hadoop1上运行命令:ssh-copy-id user@host,将其公钥传送到需要远程登录的主机host上面,例如,运行命令:ssh-copy-id hadoop@hadoop02

[if !vml]

[endif]


在节点hadoop02上查看hadoop用户主目录下的.ssh/authorized_keys内容:

[if !vml]

[endif]


可以看到这条记录是hadoop01节点下hadoop用户目录下.ssh/id_rsa.pub公钥文件内容:

[if !vml]

[endif]


所以,实际上,ssh-copy-id user@host这条命令的作用是:将客户机用户的公钥内容添加到远程主机的user用户主目录下的./ssh/authorized_keys文件中;


再来验证一下,以hadoop01同时作为客户机和远程主机,运行命令:ssh-copy-id hadoop@hadoop01:

[if !vml]

[endif]


同样的,依次运行命令:ssh-copy-id hadoop@hadoop03、ssh-copy-id

hadoop@hadoop04、ssh-copy-id hadoop@hadoop05:

[if !vml]

[endif]


现在,以hadoop01作为客户机,验证下ssh登录其他节点,可以免密直接ssh登录,如下图:


[if !vml]

[endif]


至此,实现了从客户机节点hadoop01,ssh免密登录远程主机hadoop01~hadoop05,回顾一下过程,本质是将hadoop01客户机的hadoop用户公钥文件内容分发追加到hadoop01~hadoop05主机的hadoop用户主目录下的./ssh/authorized_keys文件中;那么,如果将节点hadoop01作为主机,节点hadoop01~hadoop05作为客户机并可以免密SSH登录到主机hadoop01,则hadoop01节点的hadoop用户需要拥有hadoop01~hadoop05五个节点hadoop用户的公钥,所以就需要将节点hadoop01~hadoop05五个节点的hadoop用户的公钥文件分发传送到hadoop01节点上,这样就实现了hadoop01~hadoop5五个节点的hadoop用户免密ssh登录到主机hadoop01上;由于现在hadoop01节点hadoop用户主目录下的./ssh/authorized_keys文件中包含了五个节点的公钥,所以只需要将这个文件分发给其他四个节点hadoop02~hadoop05,就可以实现五个节点之间,互相以hadoop用户免密SSH登录。


5)五节点hadoop用户相互免密SSH登录


在节点hadoop02、hadoop03、hadoop04和hadoop05上分别运行命令:ssh-copy-id hadoop@hadoop01,将各节点上hadoop用户的公钥追加到hadoop01节点hadoop用户主目录下,的.ssh/authorized_keys文件中:


[if !vml]

[endif]


然后,将hadoop01节点hadoop用户主目录的./ssh/authorized_keys文件分发给其余四个节点hadoop02、hadoop03、hadoop04以及hadoop05;

[if !vml]

[endif]


在节点hadoop02上验证一下用户主目录下.ssh/authorized_keys文件中的内容,确实保存着五个节点hadoop用户的公钥,如下图所示:

[if !vml]

[endif]


并将hadoop01节点hadoop用户主目录下的.ssh/known_hosts文件(因为在第4)步以hadoop01作为客户机,分别ssh登录haoop01~hadoop05这五个节点后,known_host文件就保存了可信赖的远程服务器的信息)分发给其余四个节点hadoop02、hadoop03、hadoop04以及hadoop05,文件中保存的内容如下图,

[if !vml]

[endif]


具体作用是让客户端对服务器进行身份验证;known_hosts文件和authorized_keys文件的区别简单概括就是:known_hosts文件允许客户端对服务器进行身份验证, authorized_keys文件允许服务器对用户进行身份验证。


如果不分发,在客户机节点用户主目录的./ssh/known_hosts文件中没有远程主机的信息,那么会出来一个确认:


[if !vml]

[endif]


运行命令:scp .ssh/known_hosts user@host:/home/hadoop/.ssh/:

[if !vml]

[endif]


至此,五个节点之间的hadoop用户免密互相远程登录完成,可以随机选择某个节点作为客户机,另外某个节点作为主机,然后进行验证;


2.1.5 集群时间同步配置

参考文档“海工所_CentOS6.8集群时间同步配置_大数据_郑智”,这里不做赘述。

2.1.6 JDK安装配置

以节点hadoop01为例,将jdk安装解压到/app目录下:

[if !vml]

[endif]


然后,切换到root用户下,编辑/etc/prifile文件,命令为:vim /etc/profile,在文件末尾添加如下文本:


JAVA_HOME=/app/jdk1.8.0_92

CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME CLASSPATH PATH


输入完成后,按“Esc”键退出编辑模式,然后输入“:wq”,保存退出;

使用命令:source /etc/prifile更新profiel文件,并输入命令:java –versionl来验证下java安装是否成功,如果输出版本信息,那么就代表安装配置成功,如下图所示:


[if !vml]

[endif]


按照上面的步骤,在其他几个节点hadoop02~hadoop04做相同的操作,安装JDK;或者直接使用scp命令,将JDK的安装目录拷贝过去,然后修改profile文件即可;


例如:从hadoop01节点上将jdk安装目录拷贝到hadoop02上的/app目录下,命令为:

scp –r /app/jdk1.8.0_92/hadoop@hadoop02:/app/;

[if !vml]

[endif]


然后在hadoop02节点上,切换到root用户下,修改profile文件,配置JDK环境变量;

[if !vml]

[endif]



使得配置生效,并检查:

[if !vml]

[endif]

2.2 集群搭建

2.2.1 Zookeeper集群安装     

2.2.1.1简单介绍

Zookeeper集群为分布式系统提供协调服务,比如hadoop集群依靠Zookeeper来实现HDFS

NameNode的自动故障转移,以及YARN ResourceManager的高可用;以及构建在hadoop之上的分布式数据库HBase,它也使用Zookeeper来实现区域服务器的主选举(master selection)、租赁管理以及区域服务器之间的其他通信;


ZooKeeper 遵循一个简单的客户端-服务器模型,其中客户端是使用服务的节点(即机器),而服务器是提供服务的节点。ZooKeeper 服务器的集合形成了一个 ZooKeeper 集合体(ensemble)。在任何给定的时间内,一个 ZooKeeper 客户端可连接到一个 ZooKeeper 服务器。每个 ZooKeeper 服务器都可以同时处理大量客户端连接,如下图所示:


[if !vml]

[endif]


在分布式系统中,各节点将是 ZooKeeper 集合体的客户端,每个 ZooKeeper 服务器都能够以可扩展的方式处理大量客户端。例如,HBase依赖于 ZooKeeper 实现区域,服务器的领导者选举和租赁管理。可以利用一个相对较少(比如说,五个)节点的 ZooKeeper 集合体运行有 50 个节点的大型 HBase 集群。


当客户端请求读取特定 znode 的内容时,读取操作是在客户端所连接的服务器上进行的。因此,由于只涉及集合体中的一个服务器,所以读取是快速和可扩展的。然而,为了成功完成写入操作,要求 ZooKeeper 集合体的严格意义上的多数节点都是可用的。在启动 ZooKeeper 服务时,集合体中的某个节点被选举为领导者。当客户端发出一个写入请求时,所连接的服务器会将请求传递给领导者。此领导者对集合体的所有节点发出相同的写入请求。如果严格意义上的多数节点(也被称为法定数量(quorum))成功响应该写入请求,那么写入请求被视为已成功完成。然后,一个成功的返回代码会返回给发起写入请求的客户端。如果集合体中的可用节点数量未达到法定数量,那么 ZooKeeper 服务将不起作用。


法定数量是通过严格意义上的多数节点来表示的。在集合体中,可以包含一个节点,但它不是一个高可用和可靠的系统。如果在集合体中有两个节点,那么这两个节点都必须已经启动并让服务正常运行,因为两个节点中的一个并不是严格意义上的多数。如果在集合体中有三个节点,即使其中一个停机了,您仍然可以获得正常运行的服务(三个中的两个是严格意义上的多数)。出于这个原因,ZooKeeper 的集合体中通常包含奇数数量的节点,因为就容错而言,与三个节点相比,四个节点并不占优势,因为只要有两个节点停机,ZooKeeper 服务就会停止。在有五个节点的集群上,需要三个节点停机才会导致 ZooKeeper 服务停止运作。


在这里有五个节点,按照前面的集群规划,会搭建五节点的Zookeeper集群,下面以hadoop01节点为例,介绍安装配置zookeeper,然后其他节点通过scp命令直接将hadoop01上配置好的zookeeper安装目录拷贝过去就行;

2.2.1.2 解压安装

切换到zookeeper安装包所在的目录,然后运行命令:tar -zxvf zookeeper-3.4.10.tar.gz -C /app/;将zookeeper解压安装到目录/app下,如下图所示:

[if !vml]

[endif]


切换到/app/下的zookeeper安装目录,查看下zookeeper目录结构:

[if !vml]

[endif]


在zookeeper安装目录下,创建一个data目录,用于保存zookeeper快照日志,如下图所示:

[if !vml]

[endif]

然后在data目录下,创建一个datalog文件夹,用于存储zookeeper事务日志,如下图:

[if !vml]

[endif]


2.2.1.3 配置Zookeeper运行配置文件zoo.cfg

Zookeeper的配置文件存放在zookeeper安装目录/app/zookeeper-3.4.10/下的conf文件夹下:

[if !vml]

[endif]


其中,zoo_sample.cfg是管理配置zookeeper的配置文件;log4j.proeprties是zookeeper运行时日志配置文件;


将zoo_sample.conf重命名为zoo.cfg,并编辑,将内容更改为如下:


# The number of milliseconds of each tick

tickTime=2000


# The number of ticks that the initial synchronizationphase can take

initLimit=10


# The number of ticks that can pass betweensending a request and getting an acknowledgement

syncLimit=5


# 存储内存数据库快照日志.

dataDir=/app/zookeeper-3.4.10/data


# 存储事务日志

dataLogDir=/app/zookeeper-3.4.10/data/datalog


# 监听客户端连接的端口

clientPort=2181


# the maximum number of client connections.

# increase this if you need to handle moreclients

#maxClientCnxns=60


# The number of snapshots to retain indataDir

#autopurge.snapRetainCount=3

# Purge task interval in hours

# Set to "0" to disable autopurge feature

#autopurge.purgeInterval=1


# zookeeper集群服务器列表信息,格式为:server.id=hostName:心跳端口:选举端口

server.1=hadoop01:2888:3888

server.2=hadoop02:2888:3888

server.3=hadoop03:2888:3888

server.4=hadoop04:2888:3888

server.5=hadoop05:2888:3888


配置参数解析:

tickTime:基本时间单元,以毫秒为单位。它用来控制心跳和超时,默认情况下最小的会话超时时间为两倍的 tickTime。


initLimit :此配置表示,允许 follower (相对于 leader 而言的“客户端”)连接并同步到 leader 的初始化连接时间,它以 tickTime 的倍数来表示。当超过设置倍数的 tickTime 时间,则连接失败。


syncLimit :此配置表示, leader 与 follower 之间发送消息,请求和应答时间长度。如果 follower 在设置的时间内不能与 leader 进行通信,那么此 follower 将被丢弃。


dataDir :存储内存中数据库快照的位置;注意:如果需要保留zookeeper事务日志信息,那么可以考虑配置 dataLogDir 的位置。通常情况下数据库快照日志和zookeeper事务日志是分开存储的,并且应该谨慎地选择日志存放的位置,使用专用的日志存储设备能够大大地提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会在很大程度上影响系统的性能。


clientPort :监听客户端连接的端口,默认是 2181,最好不要修改


最后再增加 ZooKeeper 的服务器列表信息,格式为: server.id=主机名:心跳端口:选举端口

例子:server.1=hadoop01:2888:3888

其中 id 虽然可以随便写,但是有两点要求,第一不能重复,第二范围是 1-255,并且对应服务器列表上还得存在对应的 id 文件,具体看下面操作


2.2.1.4 配置Zookeeper运行时日志

log4j用于记录zookeeper集群服务器运行日志,该日志的配置地址在conf/目录下的log4j.properties文件中,该文件中有一个配置项为“zookeeper.log.dir=.”,表示log4j日志文件在与执行程序(zkServer.sh)在同一目录下。当执行zkServer.sh 时,在该文件夹下会产生zookeeper.out日志文件。


Zookeeper运行日志配置地址:

[if !vml]

[endif]


Zookeeper运行日志保存位置:

[if !vml]

[endif]


这里就保留默认运行时日志输出配置;


2.2.1.5配置环境变量

切换到root用户下,编辑/etc/profile文件,在文件末尾添加如下两行:


export ZOOKEEPER_HOME=/app/zookeeper-3.4.10

export PATH=$PATH:$ZOOKEEPER_HOME/bin


2.2.1.6分发zookeeper安装目录到其他服务器节点上

命令为:

scp -r zookeeper-3.4.10/hadoop@hadoop02:/app/

scp -r zookeeper-3.4.10/ hadoop@hadoop03:/app/

scp -r zookeeper-3.4.10/hadoop@hadoop04:/app/

scp -r zookeeper-3.4.10/hadoop@hadoop05:/app/


2.2.1.7创建myid文件,保存节点id

这一步骤,需要在各个节点上单独进行操作,应为每个节点的myid文件保存的内容不一样,在/app/zookeeper-3.4.10/data目录下创建一个名叫myid的文件,用于保存该节点的id,比如:server.1=hadoop01:2888:3888,则haddoop01的节点id就是1,对应的其他四个服务器节点都应该做类似的操作,现拿节点hadoop01为例:


[if !vml]

[endif]


2.2.1.8启动集群

Zookeeper的可执行脚本存放在zookeeper安装目录下的bin目录下,如下图:

[if !vml]

[endif]


切换到bin目录,运行zkserver.sh脚本启动集群,命令为:./zkServer.sh start

[if !vml]

[endif]


查看进程:

[if !vml]

[endif]


2.2.1.9 查看集群状态

使用命令:./zkServer.sh status查看服务器角色(leader or followe):

[if !vml]

[endif]


出现错误“contacting service. It is probably not running”


先停止zookeeper,命令为:./zkServer.sh stop

[if !vml]

[endif]


重新使用命令:./zkServer.sh start-foreground来启动zookeeper,这个命令是在前台运行zookeeper,会输出启动日志:

[if !vml]

[endif]


日志报错:”Cannot open channel to 3 at election address

hadoop03/192.168.1.13:3888”,但是可以从hadoop01节点上ping通hadoop03:

[if !vml]

[endif]


猜测是防火墙的问题,查看hadoop01节点的防火墙状态未开启:

[if !vml]

[endif]


查看hadoop03节点的防火墙状态,发现是开启状态;

[if !vml]

[endif]


关闭hadoop03节点的防火墙,并检查其余几个节点的防火墙状态是否关闭,然后重启Zookeeper集群(注意:虽然我们在配置文件中写明了服务器的列表信息,但是还是需要去每一台服务器去启动,不是一键启动集群模式)


重启成功后,使用命令:./zkServer.sh status查看服务器角色(leader or followe):

Hadoop01节点上:

[if !vml]

[endif]


Hadoop02节点上:

[if !vml]

[endif]

Hadoop03节点上:

[if !vml]

[endif]


Hadoop04节点上:

[if !vml]

[endif]

Hadoop05节点上:

[if !vml]

[endif]



至此,zookeeper集群搭建完毕


2.2.2 Hadoop集群安装

下面以配置节点hadoop01为例,其余节点可以通过使用scp命令拷贝hadoop01的hadoop安装目录以及其他配置进行安装;

2.2.2.1解压安装

命令为:tar -zxvf hadoop-2.6.5.tar.gz -C /app/


解压后的目录结构如下:

[if !vml]

[endif]



2.2.2.2配置环境变量

切换到root用户下,修改/etc/profile文件,添加如下内容:

export HADOOP_HOME=/app/hadoop-2.6.5/

exportLD_LIBRARY_PATH=$HADOOP_HOME/lib/native

exportPATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH


2.2.2.3修改配置文件

1、配置hadoop-env.sh,配置JDK安装路径:

# The java implementation to use.

export JAVA_HOME=/app/jdk1.8.0_92


2、配置core-site.xml,修改内容如下:


       

               fs.defaultFS

                hdfs://HadoopHACluster




       

               hadoop.tmp.dir

               /app/hadoop-2.6.5/data/tmpdir



       

               io.file.buffer.size

                4096




       

               ha.zookeeper.quorum            hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181




       

         fs.trash.interval

         1440

         Number ofminutes between trash checkpoints. If zero, the trash feature isdisabled.




3、配置hdfs-site.xml文件,配置内容如下:



       

                dfs.namenode.name.dir

                file:/app/hadoop-2.6.5/data/dfs/name




       

                dfs.datanode.data.dir

                 file:/app/hadoop-2.6.5/data/dfs/data




       

               dfs.namenode.checkpoint.dir

               file:/app/hadoop-2.6.5/data/dfs/namesecondary

                secondarynamenode data dir

                true




       

               dfs.replication

                2

                hdfs datacopy number




       

                dfs.nameservices

                 HadoopHACluster




       

                dfs.ha.namenodes.HadoopHACluster

                 hadoop01,hadoop02




       

                dfs.namenode.rpc-address.HadoopHACluster.hadoop01

                hadoop01:9000


       

                dfs.namenode.rpc-address.HadoopHACluster.hadoop02

                hadoop02:9000




       

               dfs.namenode.http-address.HadoopHACluster.hadoop01

               hadoop01:50070


       

               dfs.namenode.http-address.HadoopHACluster.hadoop02

               hadoop02:50070




       

               dfs.namenode.shared.edits.dir

               qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485;hadoop04:8485;hadoop05:8485/HadoopHACluster




       

                dfs.journalnode.edits.dir

                /app/hadoop-2.6.5/data/journal



       

                dfs.journalnode.rpc-address

                0.0.0.0:8485

                 journalnode的rpc地址




       

               dfs.ha.automatic-failover.enabled

                true




       

               dfs.client.failover.proxy.provider.HadoopHACluster

               org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

                指定hdfs client来识别HadoopHACluster命名空间并在namenode切换期间识别namnode的proxy类




       

               dfs.ha.fencing.methods

               sshfence




       

                dfs.ha.fencing.ssh.private-key-files

               /home/hadoop/.ssh/id_rsa



       

               ha.failover-controller.cli-check.rpc-timeout.ms

               60000

               getServiceState timout



       

               ipc.client.connect.timeout

               60000



       

                dfs.client.read.shortcircuit.buffer.size

                4096



       

               dfs.image.transfer.bandwidthPerSec

               4194304

                用于图片传输的带宽




       

               dfs.permissions

               false

                offpermission check




       

               dfs.support.append

                true

                允许追加文件



       

                dfs.datanode.max.xcievers

                4096

                datanode的文件句柄数限制



4、配置mapred-site.xml文件,配置内容如下:




   

       mapreduce.framework.name

       yarn



   

       mapred.system.dir

       file:/app/hadoop-2.6.5/data/mapred/system

       true



   

       mapred.local.dir

       file:/app/hadoop-2.6.5/data/mapred/local

       true



   

       mapreduce.map.memory.mb

       1024

        每个MapReduce作业的map任务可以申请的内存资源数量



   

       mapreduce.map.cpu.vcores

       1

       每个MapReduce作业的map任务可以申请的虚拟CPU资源的数量



   

       mapreduce.reduce.memory.mb

       1024

       每个MapReduce作业的reduce任务可以申请的内存资源数量




   

       mapreduce.jobhistory.address

       hadoop01:10020




   

       mapreduce.jobhistory.webapp.address

       hadoop01:19888




5、配置yarn-site.xml文件,内容如下:




   

       yarn.nodemanager.aux-services

       mapreduce_shuffle

       shuffle service that needs to be set for Map Reduceto run





   

       yarn.resourcemanager.ha.enabled

       true




  

       yarn.resourcemanager.ha.automatic-failover.enabled

       true




  

        yarn.resourcemanager.cluster-id

        yarncluster




  

        yarn.resourcemanager.ha.rm-ids

        rm1,rm2




  

       yarn.resourcemanager.hostname.rm1

       hadoop04


  

       yarn.resourcemanager.hostname.rm2

       hadoop05




  

        yarn.resourcemanager.webapp.address.rm1

        hadoop04:8088


  

        yarn.resourcemanager.webapp.address.rm2

        hadoop05:8088




  

       yarn.resourcemanager.zk-address

       hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181


6、配置slaves文件,内容如下:

HAhadoop01

HAhadoop02

HAhadoop03

HAhadoop04

HAhadoop05

如下图:

[if !vml]

[endif]


7、创建配置文件中涉及的目录

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/tmpdir

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/dfs/name

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/dfs/data

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/dfs/namesecondary

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/journal

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/mapred/system

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/mapred/local

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/yarn/rmlogs

mkdir -p /home/hadoop/app/hadoop-2.6.5/data/yarn/rmstore


如下图:

[if !vml]

[endif]


2.2.2.4 分发hadoop安装目录以及配置文件profile


1)将hadoop安装目录同步到集群其它节点

scp -r hadoop-2.6.5/ hadoop@hadoop02:/app

scp -r hadoop-2.6.5/ hadoop@hadoop03:/app

scp -r hadoop-2.6.5/ hadoop@hadoop04:/app

scp -r hadoop-2.6.5/ hadoop@hadoop05:/app


2)分发配置文件/etc/profile

scp -r /etc/profile root@hadoop02:/etc

scp -r /etc/profile root@hadoop03:/etc

scp -r /etc/profile root@hadoop04:/etc

scp -r /etc/profile root@hadoop05:/etc


拷贝过去之后,记得使用source命令使profile中配置的生效,命令是:source /etc/profile。

2.2.2.4 集群初始化操作

1)启动zookeeper集群

若没有启动zookeeper集群,则分别在节点hadoop01~hadoop05上运行命令:zkServer.sh start来启动集群;


2)格式化ZKFC(在master节点上执行)

命令为:hdfs zkfc –formatZK


这里在hadoop01上:

[if !vml]

[endif]


3)启动journalnode

分别在hadoop01~hadoop05上执行,命令为:hadoop-daemon.sh start journalnode


比如在hadoop01上:

[if !vml]

[endif]


在其他几个节点上执行相同的操作,使用jps命令,若出现JournalNode,则表明JournalNode启动成功;


4)格式化HDFS(在master节点上执行)

这里在hadoop01节点上进行,命令为:hdfs namenode –format

[if !vml]

[endif]

[if !vml]

[endif]


格式化后会在hadoop工作目录的元数据存储目录中生成一些数据

[if !vml]

[endif]


5)将格式化后hadoop01节点hadoop工作目录中的元数据目录复制到hadoop02节点上相应的目录下:

命令为:scp -r /app/hadoop-2.6.5/data/dfs/name/*hadoop@hadoop02:/app/hadoop-2.6.5/data/dfs/name/


如下图:

[if !vml]

[endif]


到此为止。hadoop集群的初始化就OK 了。以上的初始化在成功了之后,就坚决不能再做了。


2.2.2.5 启动集群

1)、启动Zookeeper集群;


2)、启动HDFS ,命令为:start-dfs.sh;不管在哪个节点执行都可以[if !vml]

[endif]


分别在hadoop01~hadoop05节点上查看启动的进程;

Hadoop01节点上:

[if !vml]

[endif]

Hadoop02节点上:

[if !vml]

[endif]


Hadoop03节点上:

[if !vml]

[endif]


Hadoop04节点上:

[if !vml]

[endif]


Hadoop05节点上:

[if !vml]

[endif]


3)启动YARN集群:start-yarn.sh;最好在YARN的主节点上执行,(在配置文件中设置yarn主节点在hadoop04上)


在节点hadoop04上:

[if !vml]

[endif]


查看进程:

[if !vml]

[endif]


另外一个resourcemanager必须手动启动,yarn-daemon.sh start resourcemanager(hadoop05是规划当中resourcemanager的备份节点)


在hadoop05节点上:

[if !vml]

[endif]



各节点所有进程全部启动之后各自的进程状态如下:

Hadoop01:

[if !vml]

[endif]


Hadoop02:

[if !vml]

[endif]

Hdooop03:

[if !vml]

[endif]


Haodop04:

[if !vml]

[endif]


Hadoop05:

[if !vml]

[endif]



4)通过web界面查看集群状态


1、查看hdfs

访问地址:http://192.168.1.11:50070

[if !vml]

[endif]

访问地址:http://192.168.1.12:50070

secondary namenode:

[if !vml]

[endif]


2、查看yarn节点启动情况:


访问地址:http://192.168.1.14:8088


[if !vml]

[endif]


查看yarn集群节点:

[if !vml]

[endif]


访问地址:http://192.168.1.15:8088

因为hadoop05是stanby resourcemanager,会自动跳转到hadoop04节点上:

[if !vml]

[endif]


5)查看集群HA状态

Hdfs:

hdfs haadmin -getServiceState hadoop01

hdfs haadmin -getServiceState hadoop02


[if !vml]

[endif]


YARN:

yarn rmadmin -getServiceState rm1

yarn rmadmin -getServiceState rm2

[if !vml]

[endif]


2.2.2.6 集群测试


[if !supportLists]1、  [endif]测试hdfs HA


在上文中,根据命令hdfs haadmin -getServiceState hadoop01,可知hadoop01是active namenode节点,在节点hadoop01上kill掉namenode进程后:

[if !vml]

[endif]

可以看到,hadoop02变成了active namenode节点;


再把hadoop01节点的namenode进程启动起来,然后查看节点状态:

[if !vml]

[endif]

可以看到hadoop01节点是standby,hadoop02节点是active;


[if !supportLists]2、  [endif]测试YARN HA


在节点hadoop04上:

[if !vml]

[endif]


再把hadoop04节点上的resourceManager进程启动起来:             


[if !vml]

[endif]