阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Hadoop2.5.2+HA+Zookeeper3.4.6配置过程详解

150次阅读
没有评论

共计 20275 个字符,预计需要花费 51 分钟才能阅读完成。

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

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

前言

本文主要通过对 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 一起死掉,也不会影响整个集群的正常工作。

Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程  http://www.linuxidc.com/Linux/2015-02/113487.htm

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

集群节点任务安排:

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

6 台主机。

Hadoop2.5.2+HA+Zookeeper3.4.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 对应的编号。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-08/121349p2.htm

接下来开始启动集群
 
启动 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 是否应用正常。这就是接下来要做的事情了。

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121349.htm

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

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

前言

本文主要通过对 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 一起死掉,也不会影响整个集群的正常工作。

Ubuntu14.04 下 Hadoop2.4.1 单机 / 伪分布式安装配置教程  http://www.linuxidc.com/Linux/2015-02/113487.htm

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

集群节点任务安排:

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

6 台主机。

Hadoop2.5.2+HA+Zookeeper3.4.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 对应的编号。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-08/121349p2.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计20275字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中