前言
我们使用hadoop2.6.0版本配置Hadoop集群,同时配置NameNode+HA、ResourceManager+HA,并使用zookeeper来管理Hadoop集群。
(一)HDFS概述
基础架构
1、NameNode(Master)
1)命名空间管理:命名空间支持对HDFS中的目录、文件和块做类似文件系统的创建、修改、删除、列表文件和目录等基本操作。
2)块存储管理。
HA架构
从上面的架构图可以看出,使用Active NameNode,Standby NameNode 两个节点可以解决单点问题,两个节点通过JounalNode共享状态,通过ZKFC 选举Active ,监控状态,自动备份。
1、Active NameNode
接受client的RPC请求并处理,同时写自己的Editlog和共享存储上的Editlog,接收DataNode的Block report, block location updates和heartbeat。
2、Standby NameNode
同样会接到来自DataNode的Block report, block location updates和heartbeat,同时会从共享存储的Editlog上读取并执行这些log操作,保持自己NameNode中的元数据(Namespcae information + Block locations map)和Active NameNode中的元数据是同步的。所以说Standby模式的NameNode是一个热备(Hot Standby NameNode),一旦切换成Active模式,马上就可以提供NameNode服务。
3、JounalNode
用于Active NameNode , Standby NameNode 同步数据,本身由一组JounnalNode节点组成,该组节点奇数个。
4、ZKFC
监控NameNode进程,自动备份。
(二)YARN概述
基础架构
1、ResourceManager(RM)
接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM)。
2、NodeManager
节点上的资源管理,启动Container运行task计算,上报资源、container情况汇报给RM和任务处理情况汇报给AM。
3、ApplicationMaster
单个Application(Job)的task管理和调度,向RM进行资源的申请,向NM发出launch Container指令,接收NM的task处理状态信息。
4、Web Application Proxy
用于防止Yarn遭受Web攻击,本身是ResourceManager的一部分,可通过配置独立进程。ResourceManager Web的访问基于守信用户,当Application Master运行于一个非受信用户,其提供给ResourceManager的可能是非受信连接,Web Application Proxy可以阻止这种连接提供给RM。
5、Job History Server
NodeManager在启动的时候会初始化LogAggregationService服务, 该服务会在把本机执行的container log (在container结束的时候)收集并存放到hdfs指定的目录下. ApplicationMaster会把jobhistory信息写到hdfs的jobhistory临时目录下, 并在结束的时候把jobhisoty移动到最终目录, 这样就同时支持了job的recovery.History会启动web和RPC服务, 用户可以通过网页或RPC方式获取作业的信息。
HA架构
ResourceManager HA 由一对Active,Standby结点构成,通过RMStateStore存储内部数据和主要应用的数据及标记。目前支持的可替代的RMStateStore实现有:基于内存的MemoryRMStateStore,基于文件系统的FileSystemRMStateStore,及基于zookeeper的ZKRMStateStore。 ResourceManager HA的架构模式同NameNode HA的架构模式基本一致,数据共享由RMStateStore,而ZKFC成为 ResourceManager进程的一个服务,非独立存在。
(三)规划
主机规划
这里我们使用5 台主机来配置Hadoop集群。
master | slave1 | slave2 | |
---|---|---|---|
namenode | 是 | 是 | 否 |
datanode | 是 | 是 | 是 |
resourcemanager | 是 | 是 | 否 |
journalnode | 是 | 是 | 是 |
zookeeper | 是 | 是 | 是 |
Journalnode和ZooKeeper保持奇数个,这点大家要有个概念,最少不少于 3 个节点。
软件规划
软件 | 版本 | 位数 | 说明 |
---|---|---|---|
jdk | jdk1.7 | 64位 | 最新稳定版本 |
centos | centos6.5 | 64位 | |
zookeeper | Apache zookeeper3.4.6 | 稳定版本 | |
hadoop | Apache hadoop2.6.0 | 稳定版本 |
用户规划
每个节点的hadoop用户组和用户需要大家自己创建
(四)集群安装前的环境检查
时钟同步
所有节点的系统时间要与当前时间保持一致。
查看当前系统时间
date Tue Nov 3 06:06:04 CST 2015
如果系统时间与当前时间不一致,进行以下操作。
1 [root@master~]# cd /usr/share/zoneinfo/ 2 [root@master zoneinfo]# ls //找到Asia 3 [root@master zoneinfo]# cd Asia/ //进入Asia目录 4 [root@master Asia]# ls //找到Shanghai 5 [root@master Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime //当前时区替换为上海
我们可以同步当前系统时间和日期与NTP(网络时间协议)一致。
host文件检查
禁用防火墙
所有节点的防火墙都要关闭
(五)配置SSH免密码通信
使用命令:
ssh-keygen -t rsa
cat id_rsa.pub >> authorized_keys
所有节点都要执行以上操作
将所有节点的authorized_keys合并
大家通过ssh 相互访问,如果都能无密码访问,代表ssh配置成功。
(六)脚本工具的使用
runRemoteCmd.sh 用于统一执行命令
deploy.sh远程复制文件脚本
(七)jdk安装
略 ,每个节点都要安装
(八)Zookeeper安装
修改Zookeeper中的配置文件。
[hadoop@master app]$ cd /home/hadoop/app/zookeeper/conf/ [hadoop@master conf]$ ls configuration.xsl log4j.properties zoo_sample.cfg [hadoop@master conf]$ cp zoo_sample.cfg zoo.cfg //复制一个zoo.cfg文件 [hadoop@master conf]$ vi zoo.cfg dataDir=/home/hadoop/data/zookeeper/zkdata //数据文件目录 dataLogDir=/home/hadoop/data/zookeeper/zkdatalog //日志目录 # the port at which the clients will connect clientPort=2181 //默认端口号 #server.服务编号=主机名称:Zookeeper不同节点之间同步和通信的端口:选举端口(选举leader) server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888
通过远程命令deploy.sh将Zookeeper安装目录拷贝到其他节点上面。
在所有节点上创建目录
/home/hadoop/data/zookeeper/zkdata
/home/hadoop/data/zookeeper/zkdatalog
分别在所有节点上创建myid
进入zkdata目录下,创建文件myid,里面的内容分别填充为:1、2、3
配置zookeeper环境变量
检查是否安装成功
/home/hadoop/app/zookeeper/bin/zkServer.sh start
(九)hadoop集群环境搭建
解压
修改配置文件 切换到/home/hadoop/app/hadoop/etc/hadoop/目录下。
配置HDFS
配置hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
配置core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://cluster1</value> </property> < 这里的值指的是默认的HDFS路径 ,取名为cluster1> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/data/tmp</value> </property> < hadoop的临时目录,如果需要配置多个目录,需要逗号隔开,data目录需要我们自己创建> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> < 配置Zookeeper 管理HDFS> </configuration>
配置hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> < 数据块副本数为3> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> < 权限默认配置为false> <property> <name>dfs.nameservices</name> <value>cluster1</value> </property> < 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口> <property> <name>dfs.ha.namenodes.cluster1</name> <value>djt11,djt12</value> </property> < 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可> <property> <name>dfs.namenode.rpc-address.cluster1.master</name> <value>master:9000</value> </property> < djt11 rpc地址> <property> <name>dfs.namenode.http-address.cluster1.master</name> <value>master:50070</value> </property> < djt11 http地址> <property> <name>dfs.namenode.rpc-address.cluster1.slave1</name> <value>slave1:9000</value> </property> < djt12 rpc地址> <property> <name>dfs.namenode.http-address.cluster1.slave1</name> <value>slave1:50070</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> < 启动故障自动恢复> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/cluster1</value> </property> < 指定journal> <property> <name>dfs.client.failover.proxy.provider.cluster1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> < 指定 cluster1 出故障时,哪个实现类负责执行故障切换> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/data/journaldata/jn</value> </property> < 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 > <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>10000</value> </property> < 脑裂默认配置> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property> </configuration>
配置 slave
[hadoop@masterhadoop]$ vi slaves
master
slave1
slave2
然后将配置好的hadoop分发到所有节点
hdfs配置完毕后启动顺序
1、启动所有节点上面的Zookeeper进程
/home/hadoop/app/zookeeper/bin/zkServer.sh start
2、启动所有节点上面的journalnode进程
"/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all
与此同时,需要在备节点(比如,slave1)上执行数据同步
bin/hdfs namenode -bootstrapStandby //同步主节点和备节点之间的元数据
如果上面操作没有问题,我们可以一键启动hdfs所有相关进程
[hadoop@masterhadoop]$ sbin/start-dfs.sh
7、验证是否启动成功
通过web界面查看namenode启动情况。
http://master:50070
YARN安装配置
配置mapred-site.xml
配置yarn-site.xml
启动YARN
1、在master节点上执行。
[hadoop@masterhadoop]$ sbin/start-yarn.sh
2、在slave1节点上面执行。
[hadoop@slave1 hadoop]$ sbin/yarn-daemon.sh start resourcemanager
如果上面执行没有异常,说明YARN安装成功。
至此,hadoop 分布式集群搭建完毕。