Home > Database > Mysql Tutorial > body text

Hadoop2.6(NN/RM)高可用集群安装与部署

WBOY
Release: 2016-06-07 14:56:05
Original
1508 people have browsed it

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. 逻辑结构图

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,我们这次就用的此方案,如下图所示。

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   #使配置生效
Copy after login

1.2 修改主机名,并添加hosts文件(每台配置)

 # hostname HMaster0
 # vi /etc/hostname
 HMaster0
Copy after login
 # 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
Copy after login

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'
Copy after login

现在就可以不用密码登陆某一台了。

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
Copy after login
 # 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
Copy after login

参数说明:

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
Copy after login

在集群任意一节点都会启动一个进程:

# 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
<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>
Copy after login
# 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>
Copy after login
# 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>
Copy after login
# 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>
Copy after login
# vi hadoop-env.sh
将export JAVA_HOME=${JAVA_HOME}修改为我们安装的JDK路径 export JAVA_HOME=/usr/local/jdk1.7
Copy after login
# vi slaves 
HSlave0
HSlave1
HSlave2
Copy after login

 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,查看是否正常

wKioL1V6oWHjnOI_AAH-aNgOe1Y220.jpgwKioL1V6oWzRyCyxAAH9B0xphV8330.jpgwKioL1V6oXfCoiM9AARFO7qj3qk390.jpgwKiom1V6n9_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


source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template