HA集群搭建文档.................................................................................................. 2
1.2 高可用(HA)hadoop集群介绍..................................................................... 2
HA集群搭建文档
详细记录在本地Vmware虚拟机中搭建五节点的Hadoop HA集群过程
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]
因为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]