菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章
cheungmine, 2014-10-25
0 引言
在生产环境上安装Hadoop高可用集群一直是一个须要极度耐心和体力的仔细工作。
虽然有非常多文档教会大家怎么一步一步去完毕这样的工作,可是百密也有一疏。
现成的工具不是没有,可是对于我这个喜欢了解细节的人来说,用别人的东西,写的好还能够,写的不好,出了问题,查找错误难之又难。手工安装Hadoop集群须要对Linux有一定的使用经验。对于全然没有接触Linux的人来说。肯定是望而生畏的。因此本文写作的目的就是讲述怎样在真实的场景中安装部署最新版本号的Hadoop集群。同一时候也是我做Hadoop自己主动化安装脚本的过程全记录。
我不喜欢反复制造轮子,大多数情况下都是取用现成的东西。可是当我看到Hadoop集群以及服务端开发须要大量的人力去部署运维各种软件,我感觉这本应解放很多其它的劳动力。
首先明白的是,本文的HA集群环境是RHEL6.4虚拟机(KVM),每一个虚拟机配置全然同样。只在于IP/MAC/HOSTNAME不同。
虚拟机的主机(HOST)是我的笔记本电脑上的Ubuntu14.04 Desktop。我的笔记本具有8个CPU核心和16GB的内存。本文的方法对于真机(RHEL6.4,6.5)也应该适用。
1 准备工作
1.1 集群规划
首先是准备RHEL6.4的服务器。由于是面向生产环境。因此须要至少5台RHEL6.4,假设只为了測试的目的则至少3台。我这里演示5台的配置情况。关于怎样创建虚拟机请參考我的系列文章:
菜鸟玩云计算之十五:在Ubuntu上创建和管理Redhat虚拟机
菜鸟玩云计算之八:Ubuntu Server12.10 之KVM虚拟机
首先来点预备知识。
Hadoop中存放数据的节点叫做DataNode(DN), 而存放元数据的节点叫做NameNode(NN)。 NameNode中的元数据大体上包括两大部分,文件信息以及Block信息。文件文件夹和传统的 文件文件夹一样,包括文件名称,创建时间。ACL信息。 另外还包括了该文件全部的blockId。 而blockId映射则维护了blockId的复杂因子,当前备份数以及这些备份所在的data节点。 前一部分信息是client端进行操作的时候生成的,永久存储到本地磁盘中。而后一部分 信息则只存放在内存中。由datanode向namenode之间的心跳汇报自己的block信息而生 成。 DataNode有非常多个。而NameNode一般唯独一个。为了防止NameNode单点故障。保证HDFS 的高可用。须要将前面一部分数据同步备份。而承担这个standby的角色就是second namenode。正常情况下master会写磁盘的操作日志并在内存中维护相应的结构,当宕机 的时候就可以通过日志重放全然恢复内存镜像。 可是假如日志非常大的,恢复起来时间比 较长,会影响整个failover进展。因此隔一段时间须要将内存镜像刷写到磁盘上,下次 恢复的时候直接将镜像载入到内存中,然后回放最新的日志。 最简单的内存镜像是锁定内存。然后一条条写到磁盘中,可是这样可能会耗费较长时间 (尤其内存镜像较大的时候),这期间无法响应请求。 另一种方式是不进行加锁,将内 存镜像拷贝一份。原来的内存继续接受读写,新的慢慢向磁盘刷写。 这样不会阻碍Client 请求,可是会耗费一倍的内存使用。实际上由于热备状态下,second namenode和master namenode拥有同样的内存镜像。于是这样的checkpoint的操作就放在second namenode来进行。 当second namenode完毕checkpoint的工作,生成了新的fsimage之后。就会请求master namenode更新fsimage,并将老的edit日志删除。 眼下有两种高可用机制: 第一种是利用NFS。 master namenode在写自己的元数据日志时 同一时候也会向nfs写日志。这样当master namenode宕机之后。second namenode还能够从nfs 中找到元数据并提供服务。 这样的方式的长处是简单。nfs作为一个服务唯独单点写入。缺点 是namenode nfs的设备要求比較高,不能和集群中使用同样的机型配置,并且nfs还须要 额外进行配置。 另外一种是QJM。简单来说就是master namenode写日志的时候也向其它的namenode磁盘写数据。 另外一种方式没有第一种方案的异构设备的缺点,可是须要复杂的机制保证写入数据的一致。 这样的机制依据HDFS的自身的特性,实现了简版的Paxos协议来保证分布式日志的一致性。在 整个设计中存在两种角色: 1. JournalNode 实际写日志的节点,负责存储日志究竟层磁盘中。相当于paxos协议中的 acceptor。 2. QuorumJournalManager 执行在NameNode中,负责向全部的JournalNode发送写日志请求。 并执行写入Fencing以及日志同步功能,相当于paxos中的proposer。 我们的工作就是建立在另外一种机制QJM(Quorum Journal Manager)的基础上。
以下创建一个配置文件hacl.cfg。用来描写叙述全部可用的服务器节点(node)和我们要部署的软件:
################################################################################ # hacl.cfg # settings for hadoop cluster (hadoop 2.5.0). # based on work of cdh5.2: # -- http://www.cloudera.com/content/cloudera/en/downloads/cdh/cdh-5-2-0.html # copyright 2014-, [email protected], all rights reserved. ################################################################################ [hacl-global] username=root password=abc123 nodes=5 [hdfs-namenode] refer=1 [hdfs-secondarynamenode] refer=2 [hdfs-journalnode] refer=1,2,3 [zookeeper] refer=1,2,3 [yarn-resourcemanager] refer=1,2,3 [yarn-nodemanager] refer=1,2,3 # hacl nodes [node:1] ipv4addr=192.168.122.101 hostname=hacl-master.hgdb.net [node:2] ipv4addr=192.168.122.102 hostname=hacl-secondary.hgdb.net [node:3] ipv4addr=192.168.122.103 hostname=hacl-datanode1.hgdb.net [node:4] ipv4addr=192.168.122.104 hostname=hacl-datanode2.hgdb.net [node:5] ipv4addr=192.168.122.105 hostname=hacl-datanode3.hgdb.net
上面的配置文件按下表定义了HACL中每一个节点的角色:
IP |
hostname |
Name Node |
Journal Node |
Data Node |
Resource Manager |
Node Manager |
ZooKeeper |
192.168.122.101 |
JN1 ZK1 NN1 |
Active NN |
√ | √ | √ | √ | √ |
192.168.122.102 |
JN2 ZK2 NN2 |
StandbyNN |
√ | √ | √ | √ | √ |
192.168.122.103 |
JN3 ZK3 |
|
√ | √ | √ | √ | √ |
注:生产环境中DataNode和NodeManager共享一台机器,HA的NN1和NN2两台机器,JN[1-3]各占一台机器(或者其它两台和NN共用)。ZK[1-3]各占一台机器。猜想:NN和JN共用一台机器可能会性能稍高点,暂未空试验。
1.2 软件下载
将全部软件下载到本地,并配置为yum源。
我使用的是cloudera提供的cdh5.2,下载地址:
http://www.cloudera.com/content/cloudera/en/products-and-services/cdh.html
我是一股脑把全部RPM包都下载到本地。使用以下的命令(${project-dir}/bin/cdh5.2-downloads.sh):
#!/bin/bash # # @file # cdh5.2-downloads.sh # # @date # 2014-10-26 # # @author # [email protected] # # @version # 0.0.1pre # # download all RPMS from: # -- http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5.2.0/RPMS/x86_64/ # # TODO: # should parse above page and to download packages automatically. # ################################################################################ CDH5_2_URL_PREFIX="http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5.2.0/RPMS/x86_64/" DOWNLOADS_PREFIX="../downloads/cdh5.2-RPMS-x86_64" # download function # $1 - package name function dl() { # get dir of this shell bin_dir=$(cd "$(dirname "$0")"; pwd) # save packages to dir pkgs_dir=$bin_dir"/"$DOWNLOADS_PREFIX echo $pkgs_dir # only download new package (wget -N) echo "++++ downloading package: "$1 wget -N $CDH5_2_URL_PREFIX$1 -P $pkgs_dir } dl_pkgs="bigtop-jsvc-0.6.0+cdh5.2.0+572-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ bigtop-jsvc-debuginfo-0.6.0+cdh5.2.0+572-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ hadoop-0.20-conf-pseudo-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-0.20-mapreduce-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-0.20-mapreduce-jobtracker-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-0.20-mapreduce-jobtrackerha-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-0.20-mapreduce-tasktracker-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-0.20-mapreduce-zkfc-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-client-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-conf-pseudo-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-debuginfo-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-doc-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-datanode-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-fuse-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-journalnode-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-namenode-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-nfs3-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-secondarynamenode-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-hdfs-zkfc-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-httpfs-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-kms-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-kms-server-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-libhdfs-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-libhdfs-devel-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-mapreduce-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-mapreduce-historyserver-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-yarn-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-yarn-nodemanager-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-yarn-proxyserver-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hadoop-yarn-resourcemanager-2.5.0+cdh5.2.0+551-1.cdh5.2.0.p0.46.el6.x86_64.rpm/ hbase-0.98.6+cdh5.2.0+55-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ hbase-doc-0.98.6+cdh5.2.0+55-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ hbase-master-0.98.6+cdh5.2.0+55-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ hbase-regionserver-0.98.6+cdh5.2.0+55-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ hbase-rest-0.98.6+cdh5.2.0+55-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ hbase-thrift-0.98.6+cdh5.2.0+55-1.cdh5.2.0.p0.33.el6.x86_64.rpm/ hue-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-beeswax-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-common-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-doc-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-hbase-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-impala-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-pig-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-plugins-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-rdbms-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-search-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-security-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-server-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-spark-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-sqoop-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ hue-zookeeper-3.6.0+cdh5.2.0+509-1.cdh5.2.0.p0.37.el6.x86_64.rpm/ impala-2.0.0+cdh5.2.0+0-1.cdh5.2.0.p0.49.el6.x86_64.rpm/ impala-catalog-2.0.0+cdh5.2.0+0-1.cdh5.2.0.p0.49.el6.x86_64.rpm/ impala-debuginfo-2.0.0+cdh5.2.0+0-1.cdh5.2.0.p0.49.el6.x86_64.rpm/ impala-server-2.0.0+cdh5.2.0+0-1.cdh5.2.0.p0.49.el6.x86_64.rpm/ impala-shell-2.0.0+cdh5.2.0+0-1.cdh5.2.0.p0.49.el6.x86_64.rpm/ impala-state-store-2.0.0+cdh5.2.0+0-1.cdh5.2.0.p0.49.el6.x86_64.rpm/ impala-udf-devel-2.0.0+cdh5.2.0+0-1.cdh5.2.0.p0.49.el6.x86_64.rpm/ zookeeper-3.4.5+cdh5.2.0+82-1.cdh5.2.0.p0.40.el6.x86_64.rpm/ zookeeper-debuginfo-3.4.5+cdh5.2.0+82-1.cdh5.2.0.p0.40.el6.x86_64.rpm/ zookeeper-native-3.4.5+cdh5.2.0+82-1.cdh5.2.0.p0.40.el6.x86_64.rpm/ zookeeper-server-3.4.5+cdh5.2.0+82-1.cdh5.2.0.p0.40.el6.x86_64.rpm" dl_pkgs_array=($(echo $dl_pkgs | tr ‘/‘ ‘ ‘ | tr -s ‘ ‘)) dl_pkgs_num=${#dl_pkgs_array[@]} ######################################################################## echo "start downloading $dl_pkgs_num packages..." dl_num=0 for ((i=0; i<$dl_pkgs_num; i++)) do pkg=${dl_pkgs_array[$i]} echo $pkg dl $pkg ((dl_num++)) done echo "$dl_num packages downloaded successfully."
1.3 小结
到眼下为止,5台节点计算机RHEL6.4已经准备好了(正确设置IP地址和网络正常)。须要的软件也下载完毕了(cdh5.2)。
之所以没有使用apache版本号的hadoop。由于apache版本号的须要从源代码编译成64位的版本号,一切以省力为原则,因此使用cdh做好的RMP包。
接下来正式进入部署环节。在以下一章中我们会看到: