Hadoop2对HDFS的改进很大,支持HDFS(NameNode) 和ResourceManager高可用性,避免集群中单点故障造成整个集群不可用。那么,从本文开始将部署一套高可用Hadoop集群及家族中相关开源系统,具体根据下面规划来,本文只部署高可用Hadoop集群,后续很快更新其他软件部署及使用。 一、部署前准备 操作系统:CentOS7_x64 安装目录:/opt 1. 节点分配 HostName | IP | Hadoop | HBase | Zookeeper | Hive | HMaster0 | 192.168.18.215 | NameNode | HMaster | / | Hive | HMaster1 | 192.168.18.216 | NameNode | HMaster | / | Hive-client
| HSlave0 | 192.168.18.217 | DataNode | HRegionServer | QuorumPeerMain | / | HSlave1 | 192.168.18.218 | DataNode | HRegionServer | QuorumPeerMain | / | HSlave2 | 192.168.18.219 | DataNode | HRegionServer | QuorumPeerMain | / |
2. 版本及功能
软件名
| 版本号 | 功能 | Hadoop | hadoop-2.6.0.tar.gz | 为海量数据提供分布式存储(HDFS)和分布式计算(YARN)。 | HBase | hbase-1.0.1.1-src.tar.gz | 基于Hadoop的分布式、面向列的NoSQL数据库,适用于非结构化数据存储的数据库。 | Zookeeper | zookeeper-3.4.6.tar.gz | 一个分布式应用程序协调服务,为应用提供一致性服务,是Hadoop和Hbase的重要组件。 | Hive | apache-hive-1.2.0-bin.tar.gz | 基于Hadoop的一个数据仓库工具,将结构化的数据文件映射成一张表,并提供简单的SQL查询功能,将SQL语句转换为MapReduce任务运行处理。 | Phoenix
| phoenix-4.4.0-HBase-1.0-bin.tar.gz | Hbase的SQL驱动,Phoenix让Hbase支持以JDBC方式访问,并将SQL查询转换成Hbase的扫描和相应的操作。 | JDK | jdk-7u79-linux-x64.gz | JAVA运行环境 | Hadoop生态系统下载地址:http://www./dist/ JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html |
3. 逻辑结构图 
NameNode(NN) HA实现方式: 一种是将NN维护的元数据保存一份到NFS上,当NN故障,可以通过另一台NNe读取NFS目录中的元数据备份进行恢复工作,需要手动进行操作,并不是真正意义上的HA方案。 另一种是准备一台备用NN节点,通过定期下载NN的元数据和日志文件来备份,当NN故障时,可以通过这台进行恢复,由于主备节点元数据和日志并不是实时同步,所以会丢失一些数据。 前两种方案都不是很理想,社区提供一种更好的方案,基于QJM(Qurom Journal Manager)的共享日志方案。QJM的基本原理是NN(Active)把日志写本地和2N+1(奇数)台JournalNode上,当数据操作返回成功时才写入日志,这个日志叫做editlog,而元数据存在fsimage文件中,NN(Standby)定期从JournalNode上读取editlog到本地。在这手动切换的基础上有开发了基于Zookeeper的ZKFC(ZookeeperFailover Controller)自动切换机制,Active和Standby节点各有ZKFC进程监控NN监控状况,定期发送心跳,当Active节点故障时Standby会自动切换为ActiveNode,我们这次就用的此方案,如下图所示。 
ResourceManager(RM) HA实现方式: RM将状态信息存储在Zookeeper中,当Active故障,Standby切换为Active后,从ZK读取相应的作业信息,重新构建作业的内存信息,然后开始接受NodeManager心跳,并接受客户端提交作业的请求等。 二、搭建高可用Hadoop集群 1.基础环境配置 1.1 安装JDK(每台配置) 1 2 3 4 5 6 7 8 | # tar zxvf jdk-7u79-linux-x64.gz
# mv jdk1.7.0_79 /usr/local/jdk1.7
# vi /etc/profile
JAVA_HOME= /usr/local/jdk1 .7
PATH=$PATH:$JAVA_HOME /bin
CLASSPATH=$JAVA_HOME /lib :$JAVA_HOME /jre/lib
export JAVA_HOME PATH CLASSPATH
# source /etc/profile #使配置生效
|
1.2 修改主机名,并添加hosts文件(每台配置) 1 2 3 | # hostname HMaster0
# vi /etc/hostname
HMaster0
|
1 2 3 4 5 6 7 8 | # cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4localhost4.localdomain4
::1 localhost localhost.localdomainlocalhost6 localhost6.localdomain6
192.168.18.215 HMaster0
192.168.18.216 HMaster1
192.168.18.217 HSlave0
192.168.18.218 HSlave1
192.168.18.219 HSlave2
|
1.3 配置SSH无密码登陆(在HMaster1做同样的操作) 1 2 3 4 5 6 7 8 9 10 11 12 | # ssh-kegen #一直回车创建秘钥对
[root@HMaster0] # cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
[root@HMaster0] # scp /root/.ssh/authorized_keys root@HMaster0:/root/.ssh
[root@HMaster0] # scp /root/.ssh/authorized_keys root@HMaster1:/root/.ssh
[root@HMaster0] # scp /root/.ssh/authorized_keys root@HSlave0:/root/.ssh
[root@HMaster0] # scp /root/.ssh/authorized_keys root@HSlave1:/root/.ssh
[root@HMaster0] # scp /root/.ssh/authorized_keys root@HSlave2:/root/.ssh
[root@HMaster0] # ssh root@HMaster0 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0] # ssh root@HMaster1 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0] # ssh root@HSlave0 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0] # ssh root@HSlave1 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
[root@HMaster0] # ssh root@HSlave2 'chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh'
|
现在就可以不用密码登陆某一台了。 2. Zookeeper集群安装与配置(三台HSlave配置) 2.1 安装与配置 1 2 3 4 | # tar zxvf zookeeper-3.4.6.tar.gz
# mv zookeeper-3.4.6 /opt
# cd /opt/zookeeper-3.4.6/conf
# cp zoo_sample.cfg zoo.cfg
|
1 2 3 4 5 6 7 8 9 10 | # vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir= /home/zookeeper/data
dataLogDir= /home/zookeeper/logs
clientPort=2181
server.0=HSlave0:2888:3888
server.1=HSlave1:2888:3888
server.2=HSlave2:2888:3888
|
参数说明: tickTime:ZK服务器之间或客户端与服务器之间间隔多长时间发送一个心跳,单位毫秒 initLimit:ZK服务器集群中连接Leader的Follower服务器初始化连接时最长忍受多长心跳时间间隔(5*20000=10s) syncLimit:标识Leader与Follower同步消息,如果超过时间(5*2000=10s),未完成同步,将剔除这个节点,所有连接此Follower服务器的客户端将连接到另一个Foolower服务器上 dataDir:ZK保存数据的目录,默认情况下,ZK也会将日志文件保存在此目录 dataLogDir:指定日志文件目录 clientPort:客户端连接ZK服务器端口 server.0:第一个0代表第几号ZK服务器,HSlave0是这个服务器的主机名或IP,2888是这个ZK服务器与集群中Leader服务器交换信息的端口,3888是Leader服务器出现故障时,用这个端口通信重新选举,在选出一个新的Leader 2.2 创建目录和id文件(三台HSlave对应操作) # mkdir /home/zookeeper/data # mkdir /home/zookeeper/logs # vi /home/zookeeper/data/myid 0 #必须创建这个id,否则启动会报错。分别ZK集群节点创建myid号,myid一定对应好zoo.cfg中配置的server后面0、1和2这个ZK号 2.3 分别启动三个ZK节点(三台HSlave操作) # /opt/zookeeper-3.4.6/bin/zkServer.sh start 注意:每次都需要分别启动ZK节点,不能通过hadoop管理启动 2.4 检查是否启动成功 分别查看ZK每个节点状态可以看到有两个follower节点,一个leader节点: # /opt/zookeeper-3.4.6/bin/zkServer.sh status 1 2 3 4 5 6 | JMX enabled by default
Using config: /opt/zookeeper-3 .4.6 /bin/ .. /conf/zoo .cfg
Mode: follower
JMX enabled by default
Using config: /opt/zookeeper-3 .4.6 /bin/ .. /conf/zoo .cfg
Mode: leader
|
在集群任意一节点都会启动一个进程: # jps 1990 QuorumPeerMain 博客地址:http://lizhenliang.blog.51cto.com 3. Hadoop安装与配置(每台都同样配置) 3.1 安装与配置 # tar zxvf hadoop-2.6.0.tar.gz # mv hadoop-2.6.0 /opt # cd /opt/hadoop-2.6.0/etc/hadoop 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # vi core-site.xml
<configuration>
<!--HDFS路径逻辑名称-->
<property>
<name>fs.defaultFS< /name >
<value>hdfs: //hcluster < /value >
< /property >
<!--Hadoop存放临时文件位置-->
<property>
<name>hadoop.tmp. dir < /name >
<value> /home/hadoop/tmp < /value >
< /property >
<!--使用的zookeeper集群地址-->
<property>
<name>ha.zookeeper.quorum< /name >
<value>HSlave0:2181,HSlave1:2181,HSlave2:2181< /value >
< /property >
< /configuration >
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # vi hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices< /name >
<value>hcluster< /value >
< /property >
<!--NameNode地址集群标识(hcluster),最多两个-->
<property>
<name>dfs.ha.namenodes.hcluster< /name >
<value>HMaster0,HMaster1< /value >
< /property >
<!--HDFS文件系统数据存储位置,可以分别保存到不同硬盘,突破单硬盘性能瓶颈,多个位置以逗号隔开-->
<property>
<name>dfs.data. dir < /name >
<value> /home/hadoop/hdfs/data < /value >
< /property >
<!--数据副本数量,根据HDFS台数设置,默认3份-->
<property>
<name>dfs.replication< /name >
<value>3< /value >
< /property >
<property>
<name>dfs.namenode.rpc-address.hcluster.HMaster0< /name >
<value>HMaster0:9000< /value >
< /property >
<!--RPC端口-->
<property>
<name>dfs.namenode.rpc-address.hcluster.HMaster1< /name >
<value>HMaster1:9000< /value >
< /property >
<!--NameNode HTTP访问地址-->
<property>
<name>dfs.namenode.http-address.hcluster.HMaster0< /name >
<value>HMaster0:50070< /value >
< /property >
<property>
<name>dfs.namenode.http-address.hcluster.HMaster1< /name >
<value>HMaster1:50070< /value >
< /property >
<!--NN存放元数据和日志位置-->
<property>
<name>dfs.namenode.name. dir < /name >
<value> file : /home/hadoop/name < /value >
< /property >
<!--同时把NameNode元数据和日志存放在JournalNode上( /home/hadoop/journal/hcluster )-->
<property>
<name>dfs.namenode.shared.edits. dir < /name >
<value>qjournal: //HSlave0 :8485;HSlave1:8485;HSlave2:8485 /hcluster < /value >
< /property >
<!--JournalNode上元数据和日志存放位置-->
<property>
<name>dfs.journalnode.edits. dir < /name >
<value> /home/hadoop/journal < /value >
< /property >
<!--开启NameNode失败自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled< /name >
<value> true < /value >
< /property >
<!--NameNode失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.hcluster< /name >
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider< /value >
< /property >
<!--隔离机制方法,确保任何时间只有一个NameNode处于活动状态-->
<property>
<name>dfs.ha.fencing.methods< /name >
<value>sshfence(hdfs)
shell( /bin/true )< /value >
< /property >
<!--使用sshfence隔离机制要SSH免密码认证-->
<property>
<name>dfs.ha.fencing. ssh .private-key-files< /name >
<value> /root/ . ssh /id_rsa < /value >
< /property >
< /configuration >
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | # vi yarn-site.xml
<configuration>
<!--启用RM高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled< /name >
<value> true < /value >
< /property >
<!--RM集群标识符-->
<property>
<name>yarn.resourcemanager.cluster- id < /name >
<value> rm -cluster< /value >
< /property >
<property>
<!--指定两台RM主机名标识符-->
<name>yarn.resourcemanager.ha. rm -ids< /name >
<value>rm1,rm2< /value >
< /property >
<!--RM故障自动切换-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.recover.enabled< /name >
<value> true < /value >
< /property >
<!--RM故障自动恢复
<property>
<name>yarn.resourcemanager.recovery.enabled< /name >
<value> true < /value >
< /property > -->
<!--RM主机1-->
<property>
<name>yarn.resourcemanager. hostname .rm1< /name >
<value>HMaster0< /value >
< /property >
<!--RM主机2-->
<property>
<name>yarn.resourcemanager. hostname .rm2< /name >
<value>HMaster1< /value >
< /property >
<!--RM状态信息存储方式,一种基于内存(MemStore),另一种基于ZK(ZKStore)-->
<property>
<name>yarn.resourcemanager.store.class< /name >
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore< /value >
< /property >
<!--使用ZK集群保存状态信息-->
<property>
<name>yarn.resourcemanager.zk-address< /name >
<value>HSlave0:2181,HSlave1:2181,HSlave2:2181< /value >
< /property >
<!--向RM调度资源地址-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1< /name >
<value>HMaster0:8030< /value >
< /property >
<property>
<name>yarn.resourcemanager.scheduler.address.rm2< /name >
<value>HMaster1:8030< /value >
< /property >
<!--NodeManager通过该地址交换信息-->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1< /name >
<value>HMaster0:8031< /value >
< /property >
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2< /name >
<value>HMaster1:8031< /value >
< /property >
<!--客户端通过该地址向RM提交对应用程序操作-->
<property>
<name>yarn.resourcemanager.address.rm1< /name >
<value>HMaster0:8032< /value >
< /property >
<property>
<name>yarn.resourcemanager.address.rm2< /name >
<value>HMaster1:8032< /value >
< /property >
<!--管理员通过该地址向RM发送管理命令-->
<property>
<name>yarn.resourcemanager.admin.address.rm1< /name >
<value>HMaster0:8033< /value >
< /property >
<property>
<name>yarn.resourcemanager.admin.address.rm2< /name >
<value>HMaster1:8033< /value >
< /property >
<!--RM HTTP访问地址,查看集群信息-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1< /name >
<value>HMaster0:8088< /value >
< /property >
<property>
<name>yarn.resourcemanager.webapp.address.rm2< /name >
<value>HMaster1:8088< /value >
< /property >
< /configuration >
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # vi mapred-site.xml
<configuration>
<!--指定MR框架为YARN-->
<property>
<name>mapreduce.framework.name< /name >
<value>yarn< /value >
< /property >
<!-- 配置 MapReduce JobHistory Server地址 ,默认端口10020 -->
<property>
<name>mapreduce.jobhistory.address< /name >
<value>0.0.0.0:10020< /value >
< /property >
<!-- 配置 MapReduce JobHistory Server HTTP地址, 默认端口19888 -->
<property>
<name>mapreduce.jobhistory.webapp.address< /name >
<value>0.0.0.0:19888< /value >
< /property >
< /configuration >
|
1 2 | # vi hadoop-env.sh
将 export JAVA_HOME=${JAVA_HOME}修改为我们安装的JDK路径 export JAVA_HOME= /usr/local/jdk1 .7
|
1 2 3 4 | # vi slaves
HSlave0
HSlave1
HSlave2
|
# 配置变量,方便使用hadoop命令 1 2 3 4 5 | # vi /etc/profile
HADOOP_HOME= /opt/hadoop-2 .6.0
PATH=$PATH:$HADOOP_HOME /bin :$HADOOP_HOME /sbin
export HADOOP_HOME PATH
# source /etc/profile
|
3.1 对NameNode(HMaster0)节点进行格式化 # hadoop namenode -format 注意:格式化第二次有可能会造成DataNode无法启动,原因是NameSpaceID不一致造成,解决方法是找出不一致的VERSION修改NameSpaceID,也可以尝试删除hdfs/data目录。 3.2 启动HMaster0(active)节点NameNode # hadoop-daemon.sh start namenode 3.3 HMaster1节点上同步(HMaster0)元数据 # hdfs namenode -bootstrapStandby 3.4 在HMaster0格式化ZKFC # hdfs zkfc -formatZK 3.5 在HMaster0节点启动HDFS集群 # start-dfs.sh 3.6 在Master0节点启动YARN集群 # start-yarn.sh 3.7 在Master1节点启动RM # yarn-daemon.sh start resourcemanager 3.8 以后也可以通过start-all.sh与stop-all.sh启停Hadoop集群
3.9 验证Hadoop集群(HDFS和YARN)是否启动成功 # jps #在HMaster0节点可以看到 32040 DFSZKFailoverController #ZKFC用于监控NameNode active和standby节点状态,并故障切换 30187 ResourceManager #YARN资源管理进程 31934 NameNode #HDFS元数据进程 13607 Jps #运行jps命令时自身进程 # jps #在HSlave0节点可以看到 13229 DataNode 31215 NodeManager 1990 QuorumPeerMain 13314 JournalNode 31390 Jps # 通过访问Hadoop提供的WEB,查看是否正常    
从上图可以看出,NameNode分为active和standby,ResouceManager也分为active和standby,也就是说,NN和RM均成功实现HA,当你测试停止active节点上NN或者RM时,都会正常切换到standby节点,这时再访问WEB,状态已经改变。目前NN只支持两台做HA,RM HA支持多台。 4. HDFS 操作命令 # hadoop dfsadmin -report #查看DataNode节点信息,可以使用这个命令脚本监控DFS状况
# hadoop fs -ls hdfs://hcluster:9000/ #指定HDFS地址访问 # hadoop fs -ls / #列出HDFS文件系统目录下文件和目录 # hadoop fs -lsr / #递归列出目录 # hadoop fs -mkdir /test #创建test目录 # hadoop fs -put /root/test.txt /test/test.txt #上传文件到test目录 # hadoop fs -cat /test/test.txt #查看文件内容 # hadoop fs -du /test/test.txt #查看文件大小 # hadoop fs -rm /test/test.txt #删除文件 # hadoop fs -rmr /test #递归删除目录或文件
提醒:Hadoop配置较为复杂,往往会因为自己的一点点配置错误,造成服务无法启动,不要心急,这时你应该静下心来仔细看看安装目录中logs目录下以.log结尾的日志,可帮助你解决问题。祝你好运!
HBase1.0分布式NoSQL数据库部署及使用请点:http://lizhenliang.blog.51cto.com/7876557/1665130
|