心血之作,在熟悉hadoop2架构的过程耽误了太长时间,在搭建环境过程遇到一些问题,这些问题一直卡在那儿,不得以解决,耽误了时间。最后,千寻万寻,把问题解决,多谢在过程提供帮助的大侠。这篇文章中,我也会把自己遇到的问题给列出来,帮助后来者进一步的学习。

这篇文章结合自己实际测试过程,花费太多心血整理。

前言

本文主要通过对hadoop2.5.2集群配置的过程加以梳理,所有的步骤都是通过自己实际测试。文档的结构也是根据自己的实际情况而定,同时也会加入自己在实际过程遇到的问题。搭建环境过程不重要,重要点在于搭建过程中遇到的问题,解决问题的过程。

可能自己遇到的问题在一些由经验的老者手上都不是问题,但是这些问题着实让自己耽误了很长时间,最后问题解决也是费了太大心血。也通过这篇文档,表现出来,算是总结,为后者提供意见。

Hadoop2.5.2体系结构

要想理解本节内容,首先需要了解hadoop1的体系结构。这里不过多的介绍基于hadoop1的体系架构,早在之前,曾搭建hadoop1.2.1伪分布式集群,详细请看hadoop学习(一)hadoop-1.2.1伪分布式配置及遇到的问题。这里主要介绍hadoop2的体系架构。

hadoop1的核心组成是两部分,即HDFS和MapReduce。在hadoop2中变为HDFS和Yarn。

新的HDFS中的NameNode不再是只有一个了,可以有多个(目前只支持2个)。每一个都有相同的职能。

这两个NameNode的地位如何:一个是active状态的,一个是standby状态的。当 集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态 NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为 active状态的,就可以继续工作了。这就是高可靠。

当NameNode发生故障时,他们的数据如何保持一致:在这里,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,JournalNode集群或者NFS进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享。

如何实现NameNode的自动切换:这就需要使用ZooKeeper集群进行选择了。HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。

HDFS Federation(HDFS联盟):联盟的出现是有原因的。我们知道 NameNode是核心节点,维护着整个HDFS中的元数据信息,那么其容量是有限的,受制于服务器的内存空间。当NameNode服务器的内存装不下数据后,那么HDFS集群就装不下数据了,寿命也就到头了。因此其扩展性是受限的。HDFS联盟指的是有多个HDFS集群同时工作,那么其容量理论上就不受限了,夸张点说就是无限扩展。你可以理解成,一个总集群中,可以虚拟出两个或两个以上的单独的小集群,各个小集群之间数据是实时共享的。因为hadoop集群中已经不在单独存在namenode和datanode的概念。当一个其中一个小集群出故障,可以启动另一个小集群中的namenode节点,继续工作。因为数据是实时共享,即使namenode或datanode一起死掉,也不会影响整个集群的正常工作。

集群节点任务安排:

这点很重要,我们事先一定要先理解,节点之间任务是如何安排的。如果事先不理解为什么是这样,后面还会遇到更多的问题。这就需要,理解journalnode、zookeeper、datanode、namenode之间关系。自己也是在这上面耽误了很长时间,希望读者这点多注意下。

6台主机。

Journalnode和zookeeper保持奇数点,这点大家要有个概念,最少不少于3个节点。这里暂不讲解。

两个namenode上面已经说明,其实在hadoop2中几点之间namenode和datanode之间的划分已经不是那么明确了。这只是采用后4台机器作为namenode。这里也存在一个问题:如果把datanode和namenode放在一起,对数据的读取IO的效率肯定会有一定的影响,不同机器之间还是要通过网线和http请求完成数据之间的共享。实际中,两者是可以在一起。但是我不知道在一起和不在一起之间的主要区别在哪儿,上面的解释只是个人意见,如果读者有更好的意见可以留言,大家一起讨论。

下面就进入正式的集群的安装过程:

下面所有的过程都是在hadoop1机器上完成的,之后把文件复制到其他节点中。

Zookeeper安装过程:

1、下载解压zookeeper

下载地址:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/

解压到指定目录:这里目录:/home/tom/yarn/hadoop-2.5.2/app/

在hadoop目录中创建app目录。把文件解压到hadoop的app目录中,是为了以后整个项目可以整体移植。包括后面,我们会安装HBase、Hive等软件,都是解压到app的目录中。

2、修改配置文件

2.1进入zookeeper中conf目录:

拷贝命名zoo_sample.cfg 为zoo.cfg。我们一般不修改配置文件默认的示例文件,修改赋值其子文件。

编辑zoo.cfg

拷贝命名zoo_sample.cfg 为zoo.cfg。我们一般不修改配置文件默认的示例文件,修改赋值其子文件。

编辑zoo.cfg

       tickTime=2000
       initLimit=10
       syncLimit=5
       dataDir=/home/tom/yarn/hadoop-2.5.0/app/zookeeper-3.4.6/zkdata
       dataLogDir=/home/tom/yarn/hadoop-2.5.0/app/zookeeper-3.4.6/zkdatalog
       clientPort=2181
       server.1=hadoop1:2888:3888
       server.2=hadoop2:2888:3888 
       server.3=hadoop3:2888:3888
       server.4=hadoop4:2888:3888
       server.5=hadoop5:2888:3888

2.2创建zkdata和zkdatalog两个文件夹

在zookeeper的目录中,创建上述两个文件夹。进入zkdata文件夹,创建文件myid,填入1。这里写入的1,是在zoo.cfg文本中的server.1中的1。当我们把所有文件都配置完毕,我们把hadoop1中yarn目录复制到其它机器中,我们在修改每台机器中对应的myid文本,hadoop2中的myid写入2。其余节点,安照上面配置,依此写入相应的数字。Zkdatalog文件夹,是为了指定zookeeper产生日志指定相应的路径。

添加环境变量

本机环境变量添是在/etc/profile目录中添加的。也可以不用添加到环境变量

添加环境变量
       本机环境变量添是在/etc/profile目录中添加的。

添加ZOOKEEPER_HOME/bin目录可以在原有的PATH后面加入

:$ZOOKEEPER_HOME/bin

关于环境变量修改/etc目录下的profile文件,也可以在根目录下的.bashrc目录下添加环境变量。这两者有什么区别:.bashrc是对当前目录用户的环境变量,profile文件是对所有用户都开放的目录。当系统加载文件中,先从profile找相应的路劲,如果没有会在.bashrc文件中找对应的环境变量路径。这两者大家稍至了解。

然后 source /etc/profile

上面3个步骤就安装zookeeper完毕。然后就是测试zookeeper,这个放到后面等hadoop1上整体配置完毕,scp到其它主机上后,再一起测试。

Hadoop配置

1、下载解压hadoop2.5.0

路径:http://apache.dataguru.cn/hadoop/common/hadoop-2.5.2/

解压到:/home/tom/yarn/下。其实这一步应该在解压zookeeper之前。不再多讲。

2、修改配置文件

这里要修改配置文件一共包括6个,分别是在hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、 yarn-site.xml和slaves。

修改文件的目录地址:/home/tom/yarn/hadoop-2.5.2/etc/hadoop/

2.1文件hadoop-env.sh

添加jdk环境变量:

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45

2.2文件coer-site.xml

   <configuration>    
            <property>    
                <name>fs.defaultFS</name>    
                <value>hdfs://cluster1</value>    
            </property>
         【这里的值指的是默认的HDFS路径。这里只有一个HDFS集群,在这里指定!该值来自于hdfs-site.xml中的配置】    
            <property>    
                  <name>hadoop.tmp.dir</name>   
                  <value>/home/tom/yarn/yarn_data/tmp</value>   
            </property>
          【这里的路径默认是NameNode、DataNode、JournalNode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。这里的yarn_data/tmp目录与文件都是自己创建的】    
            <property>    
                 <name>ha.zookeeper.quorum</name>    
                 <value>hadoop1:2181,hadoop2:2181,hadoop3:2181,hadoop4:2181,hadoop5:2181</value>   
            </property>
          【这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点】    
        </configuration><span style="font-size:14px;"><span style="font-family:宋体;"></span></span>

2.3文件hdfs-site.xml

重点核心文件:
        <configuration>
          <property>
             <name>dfs.replication</name>
             <value>3</value>
          </property>
          【指定DataNode存储block的副本数量。默认值是3个,我们现在有4个DataNode,该值不大于4即可。】    
          <property>
             <name>dfs.permissions</name>
             <value>false</value>
          </property>
          【设置权限之后可以控制各用户之间的权限】  
          <property>
             <name>dfs.permissions.enabled</name>
             <value>false</value>
          </property>
          <property>    
             <name>dfs.nameservices</name>  
             <value>cluster1</value>    
          </property>
         【给hdfs集群起名字,这个名字必须和core-site中的统一,且下面也会用到该名字】
          <property>
            <name>dfs.ha.namenodes.cluster1</name>
            <value>hadoop1,hadoop2</value>
          </property>
        【指定NameService是cluster1时的namenode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可】  
         <property>
            <name>dfs.namenode.rpc-address.cluster1.hadoop1</name>
            <value>hadoop1:9000</value>
         </property>
        【指定hadoop101的RPC地址】 
         <property>    
           <name>dfs.namenode.http-address.cluster1.hadoop1</name>    
           <value>hadoop1:50070</value>    
         </property>
         【指定hadoop101的http地址】   
         <property>    
           <name>dfs.namenode.rpc-address.cluster1.hadoop2</name>    
           <value>hadoop2:9000</value>    
         </property>
         <property>    
           <name>dfs.namenode.http-address.cluster1.hadoop2</name>    
           <value>hadoop2:50070</value>   
         </property>
         <property>
           <name>dfs.namenode.servicerpc-address.cluster1.hadoop1</name>
           <value>hadoop1:53310</value>
         </property>
         <property>
           <name>dfs.namenode.servicerpc-address.cluster1.hadoop2</name>
           <value>hadoop2:53310</value>
         </property>
         <property>  
           <name>dfs.ha.automatic-failover.enabled.cluster1</name>  
           <value>true</value>  
         </property>   
     【指定cluster1是否启动自动故障恢复,即当NameNode出故障时,是否自动切换到另一台NameNode】
       <!--指定JournalNode -->
   <property>
       <name>dfs.namenode.shared.edits.dir</name>               <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485;hadoop4:8485;hadoop5:8485/cluster1</value>
   </property>
    【指定cluster1的两个NameNode共享edits文件目录时,使用的JournalNode集群信息】
       <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/tom/yarn/yarn_data/tmp/journal</value>    
     </property>
      【指定JournalNode集群在对NameNode的目录进行共享时,自己存储数据的磁盘路径。tmp路径是自己创建,journal是启动journalnode自动生成】    
       <property>    
          <name>dfs.ha.fencing.methods</name>    
          <value>sshfence</value>    
       </property>
      【一旦需要NameNode切换,使用ssh方式进行操作】 
      <property>    
           <name>dfs.ha.fencing.ssh.private-key-files</name>    
           <value>/home/tom/.ssh/id_rsa</value>    
       </property>
     【这里是使用ssh进行故障切换,所以需要配置无密码登录,使用ssh通信时用的密钥存储的位置】
       <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>

2.4文件mapred-site.xml

     <configuration>
       <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
      </property>
     </configuration>
    【指定运行mapreduce的环境是yarn,与hadoop1不同的地方】

2.5文件yarn-site.xml

    <configuration>
      <property>    
         <name>yarn.resourcemanager.hostname</name>    
         <value>hadoop1</value>    
      </property>
    【自定义ResourceManager的地址,还是单点】
      <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce.shuffle</value>
      </property>
   </configuration>

2.6文件slaves

添加:这里指定哪台机器是datanode,这里指定6台机器。把集群所有机器都当做datanode

       hadoop1
       hadoop2
       hadoop3
       hadoop4
       hadoop5
       hadoop6

复制到其它节点

在hadoop的的根目录下(即:/home/tom目录下):因为我们所有的环境都装载在hadoop1的tom目录下。

使用scp -r命令即可

注意点:

1、因为我们是把整个yarn目录复制到其他节点中,zookeeper也包含在内。事先我们定义zookeeper是在1-5台机器上部署。这里我们虽然把zookeeper拷贝到6机器中,但是我们再zookeeper配置文件中没有配置6机器的节点,在启动zookeeper的时候,6机器也不需要启动。

2、现在要做的是进入zookeeper目录下的zkdata目录,修改myid文件:各个myid内容对应zoo.cfg文件中server对应的编号。

接下来开始启动集群

启动zookeeper

在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5上zookeeper目录下分别执行命令:bin/zkServer.sh start

在每一台机器执行完上面的命令后,执行jps,会显示:这是初步认定启动没有问题

当所有机器执行上述命令完毕后,再在每台机器上执行:bin/zkServer.sh status 查看每台机器zookeeper的状态,正确的话,只有一台机器是leader,其余机器都是显示folower。1-5台机器都需要测试一下

3、验证格式化zookeeper

3.1执行zkCli.sh

在hadoop1机器上,hadoop目录,执行zkCli.sh 终端上会输出一连串的信息。最后结束的信息是

Welcome to ZooKeeper!
2015-07-08 16:44:40,028 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@966] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2015-07-08 16:44:40,033 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@849] - Socket connection established to localhost/127.0.0.1:2181, initiating session
JLine support is enabled
2015-07-08 16:44:40,094 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1207] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x145407bbc720004, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] 
[zk: localhost:2181(CONNECTED) 1]

这一步不是必要的,只是为了测试一下zookeeper是否能够通过客户端访问

3.2 格式化ZooKeeper集群

格式化zookeeper集群,目的是在ZooKeeper集群上建立HA的相应节点。

在hadoop1上的hadoop的目录执行:bin/hdfs zkfc –formatZK

4、启动JournalNode集群

在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5上分别hadoop目录

执行命令:sbin/hadoop-daemon.sh start journalnode

5、格式化集群的一个NameNode

从hadoop1和hadoop2中任选一个即可,这里选择的是hadoop1

在hadoop1上/home/tom/yarn/hadoop-2.5.2/目录下执行下面命令:

bin/hdfs namenode -format -clusterId c1

6.   启动ZooKeeperFailoverCotroller

在hadoop1、hadoop2、hadoop3、hadoop4、hadoop5、hadoop6上分别执行命令: sbin/hadoop-daemon.sh start zkfc

7、启动刚才格式化的namenode

在hadoop1上/home/tom/yarn/hadoop-2.5.2/目录下执行命令:/sbin/hadoop-daemon.sh start namenode

再hadoop2机器上,再使用/sbin/hadoop-daemon.sh start namenode   启动namenode

8.  启动所有的datanode

Datanode是在slaves文件中配置的。在hadoop1上执行:

sbin/hadoop-daemons.sh start datanode

9、启动Yarn

在hadoop1上执行命令:sbin/start-yarn.sh

所有集群启动完毕后,请通过web页面进行查看状态

10.验证HA的故障自动转移是否好用

在执行完第8步的时候,在页面可以观察到两个NameNode的状态,hadoop1的状态是standby,hadoop2的状态是active。原先两个namenode都是standby的状态。

在hadoop1上我们执行:kill -9 23558

23558 NameNode

然后jps:nemenode进程不存在了

然后刷新两个页面,可以看到,两台机器的状态置换了。原先的active变成standby,原先的standby变成active,这说明,HA故障自动转换是正常的,HDFS是高可用的。

等你顺利结束上面所有的步骤,都很顺利的话,说明,你集群搭建基本完成任务。说是基本,因为还有事情要做,就是,你要开始上传文件开始测试程序,看看hadoop是否应用正常。这就是接下来要做的事情了。

Hadoop2.5.2+HA+zookeeper3.4.6详细配置过程的更多相关文章

  1. Tomcat7.0.22在Windows下详细配置过程

    Tomcat7.0.22在Windows下详细配置过程 一.JDK1.7安装 1.下载jdk,下载地址:http://www.oracle.com/technetwork/java/javase/do ...

  2. 转载 - Struts2 拦截器详细配置过程

    出处:http://www.blogjava.net/zzzlyr/archive/2009/10/12/297998.html Struts2 拦截器详细配置过程 1:所有拦截器的超级接口Inter ...

  3. 转载 - Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)

    出处:http://www.cnblogs.com/ifantastic/p/3185665.html Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LT ...

  4. IDEA整合日志框架Log4j2+Slf4j详细配置过程

    日志框架这么多,他们之间到底是什么关系呢?笼统的讲就是slf4j是一系列的日志接口,而log4j2.logback是具体实现了接口功能的日志框架.现在的主流日志接口都使用slf4j,而日志的实现就见仁 ...

  5. 基于Hadoop2.6.5(HA)的HBase2.0.5配置

    1.配置 在CentOS7Three上配置,注意:一定要安装bin包,不能安装src包 /usr/local/hbase/hbase-2.0.5/conf 编辑hbase-env.sh,替换成如下配置 ...

  6. mysql-5.7.14-winx64免安装版在win10下的详细配置过程

    1.配置文件 如果使用mysql的默认配置,在使用的过程中会出现很多问题,如汉字是乱码等. 在mysql的根目录(如:D:\mysql\mysql-5.7.14-winx64\)下,新建配置文件my. ...

  7. (转)Vim的Python编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)

    为什么要用vim编辑py文件? 因为在Linux命令行中,缺少图形界面的IDE,vim是最佳的文本编辑器,而为了更好的编辑py文本,所以配置vim. 1. 安装完整版vim vi和vim的区别? 在L ...

  8. udacity/CarND-Path-Planning-Project 工程详细配置过程——吐血整理

    本人原创,转载请注明地址 学习udacity/CarND-Path-Planning-Project 工程过程 1.首先登陆 jeremy-shannon/CarND-Path-Planning-Pr ...

  9. MyEclipse + Maven开发Web工程的详细配置过程

    好久没做Web方面的开发,今天突然想弄弄SpringMVC,因为不久前又学了点Maven觉得非常好,所以在弄SpringMVC这个Web框架时想使用Maven来做,但是问题又来了,我一直是在Eclip ...

随机推荐

  1. github 上 机器学习 的库推荐列表

    awesome-machine-learning: https://github.com/josephmisiti/awesome-machine-learning

  2. mysql数据库补充知识3 查询数据库记录信息之多表查询

    一 介绍 准备表 company.employeecompany.department 复制代码 #建表 create table department( id int, name varchar(2 ...

  3. text_field text_tag 用法

    = f.text_field :tax_category_id, :value => @invoice.tax_category.name, :class => "form-co ...

  4. PHP面试题汇总一

    1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与cookie的区别? 答 ...

  5. 单文件夹下的C程序如何编写Makefile文件

    通过学习已经学会了GCC的一些基础的命令,以及如何将C语言源代码编译成可执行文件. 我们已经知道在linux环境下编译源码时,常会有以下三个步骤: ./configure make make clea ...

  6. juniper常用命令

    Juniper防火墙基本命令 get interface ethernet0/0  查看 端口 常用查看命令 Get int 查看接口配置信息 Get int ethx/x 查看指定接口配置信息  G ...

  7. 通用Mapper(Mybatis)

    1.Mapper的简单介绍 2.Mapper的作用 通用Mapper可以通过Mybatis的拦截器原理,动态的帮我们实现单表的增删改查功能,大大降低了我们的开发成本,减少了我们的工作量. 3.Mapp ...

  8. Centos7 docker容器 搭建

    Dockerfile 文件如下: # # MAINTAINER Carson,C.J.Zeong <zcy@nicescale.com> # DOCKER-VERSION # # Dock ...

  9. YARN中的失败分析

    YARN中的失败分析 对于在YARN中运行的MapReduce程序,需要考虑以下几种实体的失败任务.application master.节点管理器.资源管理器 1. 任务运行失败 任务运行失败类似于 ...

  10. HDFS存档

    Hadoop存档 每个文件均按块方式存储,每个块的元数据存储在namenode的内存中,因此Hadoop存储小文件会非常低效.因为大量的小文件会耗尽namenode中的大部分内存.存储小文件所需的磁盘 ...