hadoop2对hdfs的改进很大,支持hdfs(namenode) 和resourcemanager高可用性,避免集群中单点故障造成整个集群不可用。那么,从本文开始将部署一套高可用hadoop集群及家族中相关开源系统,具体 根据下面规划来,本文只部署高可用hadoop集群,后续 很快更新其他
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.apache.org/dist/
jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
3. 逻辑结构图
650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/1210414t4-0.jpg title=qq图片20150624171357.png alt=wkiom1wkdhdsyisyaamgpx45qys169.jpg>
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,我们这次就用的此方案,如下图所示。
650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/121041k46-1.jpg title=2014072621100511.png alt=wkiol1v6mekwamxfaafokorh5am212.jpg>
resourcemanager(rm) ha实现方式:
rm将状态信息存储在zookeeper中,当active故障,standby切换为active后,从zk读取相应的作业信息,重新构建作业的内存信息,然后开始接受nodemanager心跳,并接受客户端提交作业的请求等。
二、搭建高可用hadoop集群
1.基础环境配置
1.1 安装jdk(每台配置)
# 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文件(每台配置)
# hostname hmaster0 # vi /etc/hostname hmaster0
# 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做同样的操作)
# 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 安装与配置
# 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
# 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
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
# vi core-site.xml fs.defaultfs hdfs://hcluster hadoop.tmp.dir /home/hadoop/tmp ha.zookeeper.quorum hslave0:2181,hslave1:2181,hslave2:2181
# vi hdfs-site.xml dfs.nameservices hcluster dfs.ha.namenodes.hcluster hmaster0,hmaster1 dfs.data.dir /home/hadoop/hdfs/data dfs.replication 3 dfs.namenode.rpc-address.hcluster.hmaster0 hmaster0:9000 dfs.namenode.rpc-address.hcluster.hmaster1 hmaster1:9000 dfs.namenode.http-address.hcluster.hmaster0 hmaster0:50070 dfs.namenode.http-address.hcluster.hmaster1 hmaster1:50070 dfs.namenode.name.dir file:/home/hadoop/name dfs.namenode.shared.edits.dir qjournal://hslave0:8485;hslave1:8485;hslave2:8485/hcluster dfs.journalnode.edits.dir /home/hadoop/journal dfs.ha.automatic-failover.enabled true dfs.client.failover.proxy.provider.hcluster org.apache.hadoop.hdfs.server.namenode.ha.configuredfailoverproxyprovider dfs.ha.fencing.methods sshfence(hdfs) shell(/bin/true) dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa
# vi yarn-site.xml yarn.resourcemanager.ha.enabled true yarn.resourcemanager.cluster-id rm-cluster yarn.resourcemanager.ha.rm-ids rm1,rm2 yarn.resourcemanager.ha.automatic-failover.recover.enabled true yarn.resourcemanager.hostname.rm1 hmaster0 yarn.resourcemanager.hostname.rm2 hmaster1 yarn.resourcemanager.store.class org.apache.hadoop.yarn.server.resourcemanager.recovery.zkrmstatestore yarn.resourcemanager.zk-address hslave0:2181,hslave1:2181,hslave2:2181 yarn.resourcemanager.scheduler.address.rm1 hmaster0:8030 yarn.resourcemanager.scheduler.address.rm2 hmaster1:8030 yarn.resourcemanager.resource-tracker.address.rm1 hmaster0:8031 yarn.resourcemanager.resource-tracker.address.rm2 hmaster1:8031 yarn.resourcemanager.address.rm1 hmaster0:8032 yarn.resourcemanager.address.rm2 hmaster1:8032 yarn.resourcemanager.admin.address.rm1 hmaster0:8033 yarn.resourcemanager.admin.address.rm2 hmaster1:8033 yarn.resourcemanager.webapp.address.rm1 hmaster0:8088 yarn.resourcemanager.webapp.address.rm2 hmaster1:8088
# vi mapred-site.xml mapreduce.framework.name yarn mapreduce.jobhistory.address 0.0.0.0:10020 mapreduce.jobhistory.webapp.address 0.0.0.0:19888
# vi hadoop-env.sh将export java_home=${java_home}修改为我们安装的jdk路径 export java_home=/usr/local/jdk1.7
# vi slaves hslave0hslave1hslave2
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 启动hmaster1(standby)节点namenode
# hadoop-daemon.sh start namenode
3.5 在hmaster0格式化zkfc
# hdfs zkfc –formatzk
3.6 在hmaster0节点启动hdfs集群
# start-dfs.sh
3.7 分别在active节点启动resourcemanager
# yarn-start.sh #会分别启动其他三台nodemanager节点
3.8 在standby节点启动resourcemanager
# yarn-daemon.sh start resourcemanager
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,查看是否正常
650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/121041k20-2.jpg title=1.png alt=wkiol1v6owhjnoi_aah-angoe1y220.jpg>650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/121041f21-3.jpg title=2.png alt=wkiol1v6owzrycyxaah9b0xphv8330.jpg>650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/1210416224-4.jpg title=3.png alt=wkiol1v6oxfcoim9aarfo7qj3qk390.jpg>650) this.width=650; src=http://www.68idc.cn/help/uploads/allimg/151111/1210411102-5.jpg title=4.png alt=wkiom1v6n9_heyojaacrqgzol7u782.jpg>
从上图可以看出,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