第4课 Hadoop 安装教程 - HA方式 (2台服务器)

声明

  • 本文基于Centos 6.x + CDH 5.x 
  • 官方英文安装教程 http://www.cloudera.com/content/cloudera/en/documentation/cdh5/v5-0-0/CDH5-Installation-Guide/cdh5ig_cdh5_install.html 本文并不是简单翻译,而是再整理
  • 如果没有yum源请参考http://blog.csdn.net/nsrainbow/article/details/36629339#t2

架构图

hadoop各个组件的关系是这样的


  • namenode 总数就2个,不能多也不能少,一个是active状态,一个是standby状态,只有active状态的在工作,另一个只是备份,当active状态的挂了之后,standby的会切换为active状态。但是这个动作其实不是天生自动的,配合上zookeeper才能实现自动化切换。
  • journalNode 用于存储active状态的namenode所做的所有改变,并同步到standby的namenode,以保证在standby转换为active之后不会漏掉操作
  • namenode管理着datanode,namenode负责存储地址空间,datanode负责真正的存储数据

本次部署之后的架构图是这样的

  • 为了降低部署的难度,我就虚拟了两台机子,其实真正部署的时候至少要有3台(保持奇数个)
  • zookeeper是负责在active的namenode挂掉之后自动把standby状态的namenode切换成active的
这幅图则解释了zookeeper在整个hadoop集群中的作用

  • zookeeper是游离于hadoop集群之外的组件
  • hadoop利用 zkfc (zookeeperFC) 来跟 zookeeper进行协作,其实目的很简单,就是在一个namenode挂掉的时候,自动切换成另一个namenode为active状态

准备工作

  1. 用vmware开出两台虚拟机,安装上Centos6。 我弄了两个host,分别是 host1(192.168.199.126)  和host2(192.168.199.128)
  2. 开始前请按照 Alex 的 Hadoop 菜鸟教程: 第2课 hadoop 安装教程 (CentOS6 CDH分支 yum方式) 里面的方式添加yum源

安装

安装Zookeeper

注意:我这人比较懒,所以基本都是用root在安装,所以以下命令,如果你们无法执行,请再前面加一个 sudo 。或者想我一样直接用root玩

在两台机都执行
[plain]  view plain  copy
  1. yum install zookeeper -y  

都安装 zookeeper-server

[plain]  view plain  copy
  1. sudo yum install zookeeper-server -y  



在  host1 上启动zookeeper

[plain]  view plain  copy
  1. $ sudo service zookeeper-server init --myid=1  
  2. $ sudo service zookeeper-server start  
  3. JMX enabled by default  
  4. Using config: /etc/zookeeper/conf/zoo.cfg  
  5. Starting zookeeper ... STARTED  

注意:这个 --myid=1 标定了zookeeper的id,会在  /var/lib/zookeeper 下建立一个 myid 文件

在 host2 上启动zookeeper

[plain]  view plain  copy
  1. $ sudo service zookeeper-server init --myid=2  
  2. $ sudo service zookeeper-server start  
  3. JMX enabled by default  
  4. Using config: /etc/zookeeper/conf/zoo.cfg  
  5. Starting zookeeper ... STARTED  

检查下是否在2181端口监听

[html]  view plain  copy
  1. $ netstat -tpnl | grep 2181  
  2. cp        0      0 :::2181                     :::*                        LISTEN      5477/java  

用client端测试一下

[plain]  view plain  copy
  1. zookeeper-client -server host1:2181  

配置zookeeper

在两台机子上都编辑 /etc/zookeeper/conf/zoo.cfg 文件

[plain]  view plain  copy
  1. tickTime=2000  
  2. dataDir=/var/lib/zookeeper/  
  3. clientPort=2181  
  4. initLimit=5  
  5. syncLimit=2  
  6. server.1=host1:2888:3888  
  7. server.2=host2:2888:3888  

改完记得重启zookeeper

注意:其实zookeeper的服务器最小的安装数量是3台机器,但是现在只有2台,只能凑合了。因为zookeeper是根据超过半数出问题来关停系统的,所以2台就无法正确的判断了,不过我们只是做例子所以没关系。

hadoop在启动的时候会自动去找zookeeper的2181端口,如果没有就启动不起来


安装Resource Manager

你需要在两台机子中挑选一台作为resource manager,在这里我挑选  host1(192.168.199.126) 安装
在 host1 上执行
[plain]  view plain  copy
  1. yum install hadoop-yarn-resourcemanager -y  

安装Name Node

两台机子上都安装name node
[plain]  view plain  copy
  1. sudo yum install hadoop-hdfs-namenode -y  

安装Date Node 等

官方文档说在除了Resource Manager 以外的所有机器上安装以下几个包,不过你要是非在有Resource Manager的机器上装这些也不会出错,只是生产环境肯定不能这么干了。既然我们只有两台机子而且都装datanode,那肯定是只能两台机都要安装了
[plain]  view plain  copy
  1. yum install hadoop-yarn-nodemanager hadoop-hdfs-datanode hadoop-mapreduce -y  


官方文档说在其中一台机子上安装以下软件,随便挑一台,就挑 host2
[plain]  view plain  copy
  1. yum install hadoop-mapreduce-historyserver hadoop-yarn-proxyserver -y  

在随便一台机器上安装client,选 host1安装吧
[plain]  view plain  copy
  1. yum install hadoop-client -y  

配置

配置网络

hadoop官方强烈建议,大家不要用ip,而是用host的名字来进行配置,所以我们要先配置host文件
在host1上运行该命令设置机器名字
[plain]  view plain  copy
  1. sudo hostname host1  

在host2 上
[plain]  view plain  copy
  1. sudo hostname host2  

这样定义的名字只保持在下次重启之前

在两台机的 /etc/hosts 文件里面都插入这段
[plain]  view plain  copy
  1. 192.168.199.126 host1.localdomain host1  
  2. 192.168.199.128 host2.localdomain host2  

那个localdomain代表的是本地的域名,相当于localhost一样的东西

修改 /etc/sysconfig/network 确保里面的 HOSTNAME 是 host1.localdomain 或者 host2.localdomain
用uname -a 可以检查是否正确的设置了主机名
[plain]  view plain  copy
  1. [root@localhost conf]# uname -a  
  2. Linux host1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux  


配置HDFS

host1
到 /etc/hadoop/conf 文件夹下,编辑
core-site.xml 在 <configuration> 中增加
[plain]  view plain  copy
  1. <property>  
  2.   <name>fs.defaultFS</name>  
  3.   <value>hdfs://host1.localdomain:8020</value>  
  4. </property>  

打开 hdfs-site.xml 添加
[plain]  view plain  copy
  1. <property>  
  2.  <name>dfs.permissions.superusergroup</name>  
  3.  <value>hadoop</value>  
  4. </property>  

在hdfs-site.xml里面修改一下 namanode 的实际存储位置为更大的磁盘
[plain]  view plain  copy
  1. <configuration>  
  2.   <property>  
  3.      <name>dfs.namenode.name.dir</name>  
  4.      <value>file:///data/hdfs/1/dfs/nn</value>  
  5.   </property>  
  6.   <property>  
  7.    <name>dfs.permissions.superusergroup</name>  
  8.     <value>hadoop</value>  
  9.     </property>  
  10. </configuration>  

官方文档说在 每一个datanode节点上的hdfs-site.xml里面都配置相同的文件夹来存储数据,比如我就建三个文件夹来存储datanode数据
[html]  view plain  copy
  1. <property>  
  2.   <name>dfs.datanode.data.dir</name>  
  3.   <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>  
  4. </property>  

所以最后hdfs-site.xml 是这样的
[html]  view plain  copy
  1. <?xml version="1.0"?>  
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  3.   
  4. <configuration>  
  5.   <property>  
  6.      <name>dfs.namenode.name.dir</name>  
  7.      <value>file:///data/hdfs/1/dfs/nn</value>  
  8.   </property>  
  9.   <property>  
  10.     <name>dfs.permissions.superusergroup</name>  
  11.     <value>hadoop</value>  
  12.   </property>  
  13.   <property>  
  14.     <name>dfs.datanode.data.dir</name>  
  15.     <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>  
  16.   </property>  
  17. </configuration>  

PS:默认情况下只要有一台datanode挂了,整个集群就停了然后启动的时候会自动修复数据,如果要提高容错机制,就设置 dfs.datanode.failed.volumes.tolerated ,如果设置为3,那就只有4台挂了才会停止

把 
  • /data/hdfs/1/dfs/nn
  • /data/hdfs/1/dfs/dn
  • /data/hdfs/2/dfs/dn
  • /data/hdfs/3/dfs/dn
全都建立出来,并统一把用户改成 hdfs.hdfs
[sql]  view plain  copy
  1. chown -R hdfs.hdfs hdfs  




host2 
core-site.xml
[html]  view plain  copy
  1. <configuration>  
  2.      <property>  
  3.        <name>fs.defaultFS</name>  
  4.        <value>hdfs://host2.localdomain:8020</value>  
  5.      </property>  
  6. </configuration>  

hdfs-site.xml
[html]  view plain  copy
  1. <?xml version="1.0"?>  
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
  3.   
  4. <configuration>  
  5.   <property>  
  6.      <name>dfs.namenode.name.dir</name>  
  7.      <value>file:///data/hdfs/1/dfs/nn</value>  
  8.   </property>  
  9.   <property>  
  10.      <name>dfs.permissions.superusergroup</name>  
  11.      <value>hadoop</value>  
  12.   </property>  
  13.   <property>  
  14.     <name>dfs.datanode.data.dir</name>  
  15.     <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>  
  16.   </property>  
  17. </configuration>  


把需要的文件夹也都建立出来,并分配权限
[plain]  view plain  copy
  1. chown -R hdfs.hdfs hdfs  


格式化namenode

在两台机子上都使用hdfs来格式化namenode
[plain]  view plain  copy
  1. sudo -u hdfs hdfs namenode -format  

启动HDFS

在两台机器上都运行
[plain]  view plain  copy
  1. for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done  

建立/tmp文件夹

在host1 上运行
[plain]  view plain  copy
  1. $ sudo -u hdfs hadoop fs -mkdir /tmp  
  2. $ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp  
这样会在hdfs集群上建立 /tmp 文件夹。

注意:这里的 /tmp 并不是某一台机器上的 /tmp 文件夹,是hdfs这个分布式文件系统上的 tmp 文件夹,这是一个高于真实物理机器环境的一个文件环境,host1 和 host2 共同组成了它
可以用 
[plain]  view plain  copy
  1. sudo -u hdfs hadoop fs -ls /  
来看下hdfs上根目录下有什么文件夹

检查是否启动成功

启动完后可以用jps 命令 检查是否启动成功

host1 
[plain]  view plain  copy
  1. [root@host1 ~]# jps  
  2. 12044 Jps  
  3. 2207 ResourceManager  
  4. 11857 NameNode  

host2 
[plain]  view plain  copy
  1. [root@host2 ~]# jps  
  2. 10735 NameNode  
  3. 10855 Jps  
  4. 10644 DataNode  
  5. 2272 JobHistoryServer  



客户端测试


打开你的浏览器输入 http://<hadoop server ip>:50070
如果看到
Overview 'host1.localdomain:8020' (active)
这样的字样就成功进入了hadoop的命令控制台

提示:但是此时你会发现host1 跟 host2 之间其实没有什么关联,通过控制台只能查到各自的datanode信息,接下来我们说下怎么样把两个host组成一个集群

设置HA

最早的时候一个hadoop集群只能有一个namenode如果这个namenode挂了,整个集群就挂了,后来hadoop结合zookeeper发展出新的部署模式,就是HA(High Availability)模式。在这种模式下
  • 一个集群可以有多个namenode
  • 只有一个namenode处于活跃状态,其他namenode处于备选状态
  • 活跃状态的namenode跟备选状态的namenode之间有一定的时间差
  • 采用journalNode来记录namenode的所有改动,在活跃namenode到备选namenode切换过程中保证不漏掉操作步骤

配置HA

先从修改core-site.xml 开始
接下来的配置是 两台机器都一样的,所以我就只写一份
[html]  view plain  copy
  1. <configuration>  
  2.   <property>  
  3.     <name>fs.defaultFS</name>  
  4.     <value>hdfs://mycluster</value>  
  5.   </property>  
  6.   <property>  
  7.      <name>hadoop.tmp.dir</name>              
  8.      <value>/data/hdfs/tmp</value>                                           
  9.   </property>  
  10.   <property>         
  11.      <name>ha.zookeeper.quorum</name>                    
  12.      <value>host1:2181,host2:2181</value>                                                                                  
  13.   </property>  
  14. </configuration>  

建立对应的文件夹并分配权限
[plain]  view plain  copy
  1. cd /data/hdfs  
  2. mkdir tmp  
  3. chown -R hdfs.hdfs tmp  

参数解释:
  • fs.defaultFS 用一个统一的名字来标定集群的名字
  • hadoop.tmp.dir 是yarn使用的临时文件夹
  • ha.zookeeper.quorum 设定所有zookeeper server的地址,理论上一定要是奇数个,但是现在条件所迫就设置成2个吧
接下来是hdfs-site.xml
[html]  view plain  copy
  1. <configuration>  
  2.   <property>    
  3.      <name>dfs.replication</name>    
  4.      <value>2</value>    
  5.   </property>  
  6.   <property>    
  7.     <name>dfs.permissions</name>    
  8.     <value>false</value>    
  9.   </property>  
  10.   <property>        
  11.     <name>dfs.nameservices</name>      
  12.     <value>mycluster</value>        
  13.   </property>  
  14.   <property>    
  15.     <name>dfs.ha.namenodes.mycluster</name>    
  16.     <value>host1,host2</value>    
  17.   </property>  
  18.   <property>    
  19.     <name>dfs.namenode.rpc-address.mycluster.host1</name>    
  20.     <value>host1:8020</value>    
  21.   </property>    
  22.   <property>        
  23.     <name>dfs.namenode.http-address.mycluster.host1</name>        
  24.     <value>host1:50070</value>        
  25.   </property>     
  26.   <property>        
  27.     <name>dfs.namenode.rpc-address.mycluster.host2</name>        
  28.     <value>host2:8020</value>        
  29.   </property>    
  30.   <property>        
  31.     <name>dfs.namenode.http-address.mycluster.host2</name>        
  32.     <value>host2:50070</value>       
  33.   </property>    
  34.   <property>      
  35.     <name>dfs.ha.automatic-failover.enabled</name>      
  36.     <value>false</value>      
  37.   </property>       
  38.   <property>    
  39.     <name>dfs.namenode.shared.edits.dir</name>  
  40.     <value>qjournal://host1:8485;host2:8485/mycluster</value>    
  41.   </property>  
  42.   <property>    
  43.     <name>dfs.client.failover.proxy.provider.mycluster</name>  
  44.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>    
  45.   </property>  
  46.   <property>        
  47.     <name>dfs.journalnode.edits.dir</name>        
  48.     <value>/data/yarn/tmp/journal</value>        
  49.   </property>         
  50.   <property>        
  51.     <name>dfs.ha.fencing.methods</name>        
  52.     <value>sshfence</value>        
  53.   </property>    
  54.   <property>        
  55.        <name>dfs.ha.fencing.ssh.private-key-files</name>        
  56.        <value>/var/lib/hadoop-hdfs/.ssh/id_rsa</value>        
  57.    </property>    
  58.    <property>    
  59.        <name>dfs.ha.fencing.ssh.connect-timeout</name>    
  60.        <value>10000</value>    
  61.    </property>    
  62.    <property>    
  63.        <name>dfs.namenode.handler.count</name>    
  64.        <value>100</value>    
  65.   </property>  
  66. <property>  
  67.      <name>dfs.namenode.name.dir</name>  
  68.      <value>file:///data/hdfs/1/dfs/nn</value>  
  69.   </property>  
  70.   <property>  
  71.     <name>dfs.permissions.superusergroup</name>  
  72.     <value>hadoop</value>  
  73.   </property>  
  74.   <property>  
  75.     <name>dfs.datanode.data.dir</name>  
  76.     <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn</value>  
  77.   </property>  
  78. </configuration>  

配置解释

  • dfs.replication 数据的复制份数
  • dfs.nameservices serviceid 接下来的配置参数中会用到,也就是一个集群的名字
  • dfs.ha.namenodes.mycluster 这个mycluster就是之前定义的serviceid,这边列出所属的namenode,也就是namenode的host名字
  • dfs.namenode.rpc-address.mycluster.host1 各个namenode的 rpc通讯地址
  • dfs.namenode.http-address.mycluster.host1 各个namenode的http状态页面地址
  • dfs.ha.automatic-failover.enabled 是否启用故障自动处理?就是故障的时候会自动启用备选的namenode,暂时设定为false
  • dfs.namenode.shared.edits.dir 定义了集群的日志节点,采用统一格式  "qjournal://host1:port1;host2:port2;host3:port3/journalId" ,日志节点是由active状态的namenode写入,由standby(备选)状态节点读出
  • dfs.ha.fencing.methods 处于故障状态的时候hadoop要防止脑裂问题,所以在standby机器切换到active后,hadoop还会试图通过内部网络的ssh连过去,并把namenode的相关进程给kill掉,一般是sshfence 就是ssh方式,后面的 dfs.ha.fencing.ssh.private-key-files 则配置了 ssh用的 key 的位置

建立文件夹,并分配权限

[plain]  view plain  copy
  1. sudo mkdir -p /data/yarn/tmp/journal  
  2. sudo chown -R hdfs:hdfs /data/yarn  

删除之前建立的dn文件夹,重新建立新的dn文件夹
[plain]  view plain  copy
  1. # rm -rf /data/hdfs/3  
  2. # rm -rf /data/hdfs/1/dfs/dn  
  3. # rm -rf /data/hdfs/2/dfs/dn  
  4. # mkdir /data/hdfs/1/dfs/dn  
  5. # chown -R hdfs.hdfs /data/hdfs/1/dfs/dn/  
  6. # mkdir /data/hdfs/2/dfs/dn  
  7. # chown -R hdfs.hdfs /data/hdfs/2/dfs/dn/  


为 dfs.ha.fencing.ssh.private-key-files 建立sshkey

step1
在host1 上切换到root用户创建id_rsa文件

[plain]  view plain  copy
  1. [root@host1 ~]# sudo su -  
  2. [root@host1 ~]# ssh-keygen -t rsa  
  3. Generating public/private rsa key pair.  
  4. Enter file in which to save the key (/root/.ssh/id_rsa):   
  5. Enter passphrase (empty for no passphrase):   
  6. Enter same passphrase again:   
  7. Your identification has been saved in /root/.ssh/id_rsa.  
  8. Your public key has been saved in /root/.ssh/id_rsa.pub.  

中间过程问的问题全部回车解决
Step2
把生成的 /root/.ssh/id_rsa.pub 拷贝到 host2 上,然后到host2上用root 权限执行
[plain]  view plain  copy
  1. [root@host2 .ssh]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys  

Step3
回到 host1 ,把 /root/.ssh/id_rsa 拷贝到 hdfs 的 .ssh  目录,并且修改用户为hdfs
[plain]  view plain  copy
  1. [root@host1 .ssh]# cp /root/.ssh/id_rsa /var/lib/hadoop-hdfs/.ssh/  
  2. [root@host1 .ssh]# chown hdfs.hdfs /var/lib/hadoop-hdfs/.ssh/id_rsa   

Step4
在host1上用hdfs测试一下看能不能用root身份ssh连上host2
[plain]  view plain  copy
  1. [root@host2 .ssh]# sudo su hdfs  
  2. bash-4.1$ ssh root@host2  
  3. The authenticity of host 'host2' can't be established.  
  4. RSA key fingerprint is dd:91:6c:c2:df:65:20:68:e7:e4:fc:5b:a8:4f:c6:8c.  
  5. Are you sure you want to continue connecting (yes/no)? yes  
  6. Warning: Permanently added 'host2' (RSA) to the list of known hosts.  
  7. Last login: Tue Dec 30 20:34:00 2014 from 10.172.252.22  
  8. [root@host2 ~]# ll  

Step5
在host2上重复以上4步

修改mapred-site.xml

[html]  view plain  copy
  1. <configuration>  
  2.   <property>    
  3.        <name>mapreduce.framework.name</name>    
  4.        <value>yarn</value>    
  5.   </property>  
  6. </configuration>  

修改yarn-site.xml ,在 <configuration/> 节点里面插入一个属性
[html]  view plain  copy
  1. <property>        
  2.       <name>yarn.resourcemanager.hostname</name>        
  3.       <value>host1</value>        
  4.   </property>  

修改文件slave

[plain]  view plain  copy
  1. host1  
  2. host2  

把 core-site.xml , hdfs-site.xml, mapred-site.xml, yarn-site.xml, slaves 复制到host2上
重启两台机器上的hadoop, 顺序无所谓

[plain]  view plain  copy
  1. for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x stop; done  
  2. for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done  


注意:如果你启动有错,不要慌,去 /var/log/hadoop-hdfs 看下日志,看具体错在哪里再想解决方案


这个时候你可以访问 host1:50070 或者 host2:50070 会看到两个namenode都处在standby状态,是不能对外服务的


接下来我们来看下如何部署HA

部署HA

安装并启动JournalNodes

两台机器上都执行
[plain]  view plain  copy
  1. yum install hadoop-hdfs-journalnode -y  

在两台机器上都启动服务
[plain]  view plain  copy
  1. service hadoop-hdfs-journalnode start  

格式化

在两台机器上格式化namenode
[plain]  view plain  copy
  1. sudo -u hdfs hdfs namenode -format -clusterId mycluster  

在两台机器上停止namenode
[plain]  view plain  copy
  1. service hadoop-hdfs-namenode stop  

host1上初始化journalnode
[plain]  view plain  copy
  1. hdfs namenode -initializeSharedEdits  

启动namenode

再启动 第一个namenode就是你要作为主要的namenode的那个,这里我把host1作为主要的
在host1上执行
[plain]  view plain  copy
  1. service hadoop-hdfs-namenode start  

接下来启动备用namenode,这里我把host2作为备用的namenode
[plain]  view plain  copy
  1. sudo -u hdfs hdfs namenode -bootstrapStandby  
可能会问你是否要格式化,记得选Y

启动备用namenode
[plain]  view plain  copy
  1. service hadoop-hdfs-namenode start  

我解释一下,当你用 -bootstrapStandby 启动备选的namenode的时候,它会将内容从主namenode上复制过来(包括命名空间信息和最近修改信息)存储的位置就是你在 dfs.namenode.name.dir 和 dfs.namenode.edits.dir里面配置的,在本教程中就是 file:///data/hdfs/1/dfs/nn

启动 datanode

请大家记住hadoop的基本启动顺序
  1. 最先启动的是所有机器上的 journalnode
  2. 再启动主机上的namenode
  3. 启动备选机上的namenode(还需要用 -bootstrapStandby 拉取镜像)
  4. 启动所有机器上的datanode

设置host1为active状态

现在我们用浏览器访问 http://host1:50070 和 http://host2:50070 你会发现两个namenode 都还是standby状态。这时你需要把其中一个转化为active状态才行。不过前提是你得先把 dfs.ha.automatic-failover.enabled 设置成false,所以前面我设置的时候设置成了false 。
现在我们来设置host1 为active状态
[plain]  view plain  copy
  1. hdfs haadmin -failover host2 host1  

成功后再去看 http://host1:50070 会看到 'host1:8020' (active) 字样,标志着 host1终于处在活跃状态,集群终于可以工作了!
其实haadmin 有一个transitionToActive命令,但是最好不要用这个命令,因为主备切换的时候最大的问题就是 脑裂问题,说具体了就是,有可能一不小心把俩namenode都弄成active状态,并且还都同时工作,造成数据写入的不一致,后果不堪设想。所以用failover的好处就是会检查另外一个namenode,如果是active就会设置成standby,如果已经是standby就什么也不做,这样比较安全。

设置自动failover

部署还没有结束,我们之前用的是手动failover,其实是不够的,如果每次出问题都要手动解决,这个集群等于是不稳定的。所以要设置自动failover。自动failover用的是zookeeper 的 ZooKeeper FailoverController (ZKFC) 
安装zkfc
两台机器都运行
[plain]  view plain  copy
  1. yum install hadoop-hdfs-zkfc -y  

先去把 hdfs-site.xml 里面的 dfs.ha.automatic-failover.enabled 弄成true,然后重启namenode
[html]  view plain  copy
  1. <property>  
  2.   <name>dfs.ha.automatic-failover.enabled</name>  
  3.   <value>true</value>  
  4. </property>  

格式化zookeeper

在host1 上执行 
[plain]  view plain  copy
  1. hdfs zkfc -formatZK  

这一步会在zookeeper根目录下建立 /hadoop-ha/mycluster 这个目录。
建立完后我们去验证一下用 zookeeper-client 连接上zookeeper
[plain]  view plain  copy
  1. # zookeeper-client -server host1:2181  
  2. [zk: host1:2181(CONNECTED) 0] ls /  
  3. [hadoop-ha, zookeeper]  

在两台机器上都启动 zkfc

[plain]  view plain  copy
  1. service hadoop-hdfs-zkfc start  

官方说明了几点:
  • zkfc跟zookeeper关系密切,要是zookeeper挂了,zkfc也就失效了
  • 最好监控着zkfc进程,防止zkfc退出了,造成无法自动切换
  • zkfc跟namenode的启动顺序是无所谓的

验证namenode状态

打开浏览器访问 host1:50070 会发现 这个 namenode 变成了active 状态,再看看 host2:50070 会发现是 standby 状态。并且datanode下有两个datanode节点出现

恭喜你!配置完成!

参考资料

  • http://blog.csdn.net/yczws1/article/details/23566383 这篇教程建议大家也去看下,可以对大于2台机器的安装有些概念上的认识
  • http://pan.baidu.com/share/link?shareid=3918641874&uk=2248644272 这篇文章写的相当不错,对概念的解释很到位
  • http://www.sizeofvoid.net/hadoop-2-0-namenode-ha-federation-practice-zh/ 对更进一步的 HDFS联盟感兴趣的可以看下这篇文章
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Hadoop安装教程-单机-伪分布式配置-Hadoop2.6.0-Ubuntu14.04详细教程教学: 1. 安装Java Hadoop是基于Java开发的,因此需要先安装Java。可以在终端中输入以下命令进行安装: ```bash sudo apt-get update sudo apt-get install default-jdk ``` 2. 下载Hadoop 可以在Hadoop官网下载Hadoop压缩包,也可以在终端中输入以下命令进行下载: ```bash wget https://archive.apache.org/dist/hadoop/core/hadoop-2.6.0/hadoop-2.6.0.tar.gz ``` 3. 解压Hadoop 在终端中输入以下命令解压Hadoop压缩包: ```bash tar -xzvf hadoop-2.6.0.tar.gz ``` 4. 配置Hadoop环境变量 打开终端中的/etc/environment文件,并在其中添加以下内容: ```bash export HADOOP_HOME=/path/to/hadoop export PATH=$PATH:$HADOOP_HOME/bin ``` 其中,/path/to/hadoopHadoop所在的路径。保存文件后,输入以下命令使配置生效: ```bash source /etc/environment ``` 5. 配置Hadoop 进入Hadoop目录,编辑etc/hadoop/hadoop-env.sh文件。找到以下行: ```bash export JAVA_HOME=${JAVA_HOME} ``` 将其修改为: ```bash export JAVA_HOME=/usr/lib/jvm/default-java ``` 保存文件并关闭。 6. 配置HDFS 进入etc/hadoop目录,编辑hdfs-site.xml文件。添加以下内容: ```xml <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/path/to/hadoop/data/dfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/path/to/hadoop/data/dfs/datanode</value> </property> </configuration> ``` 其中,/path/to/hadoop/data为Hadoop数据存储路径。 7. 配置YARN 进入etc/hadoop目录,编辑yarn-site.xml文件。添加以下内容: ```xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration> ``` 8. 配置MapReduce 进入etc/hadoop目录,编辑mapred-site.xml文件。添加以下内容: ```xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> ``` 9. 格式化HDFS 在终端中输入以下命令格式化HDFS: ```bash hdfs namenode -format ``` 10. 启动Hadoop 在终端中输入以下命令启动Hadoop: ```bash start-all.sh ``` 11. 验证Hadoop 在浏览器中输入http://localhost:50070,即可访问Hadoop Web UI。在该页面中可以查看HDFS的状态、数据块、节点等信息。 以上就是Hadoop安装教程-单机-伪分布式配置-Hadoop2.6.0-Ubuntu14.04详细教程教学。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值