菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章
菜鸟玩云计算之十八: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-, cheungmine@hgdb.net, 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
|
|
√ | √ | √ | √ | √ |
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
# cheungmine@hgdb.net
#
# @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包。
接下来正式进入部署环节。在下面一章中我们会看到:
2 部署Hadoop HA 集群
2.1 节点计算机预处理
2.2 ssh免密码登录
2.3 安装jdk
菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章的更多相关文章
- 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章
菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...
- Hadoop(HDFS,YARN)的HA集群安装
搭建Hadoop的HDFS HA及YARN HA集群,基于2.7.1版本安装. 安装规划 角色规划 IP/机器名 安装软件 运行进程 namenode1 zdh-240 hadoop NameNode ...
- CentOS 6+Hadoop 2.6.0分布式集群安装
1.角色分配 IP Role Hostname 192.168.18.37 Master/NameNode/JobTracker HDP1 192.168.18.35 Slave/DataNode/T ...
- 菜鸟玩云计算之十六:Ubuntu14.04上创建的虚拟机迁移到RHEL6.4
菜鸟玩云计算之十六:Ubuntu14.04上创建的RHEL6.4虚拟机迁移到RHEL6.4主机上 RHEL6.4 Server作为虚拟机的HOST,执行以下的命令检查配置和安装相关软件: # egre ...
- 菜鸟玩云计算之十二:KVM虚拟机更改大小
菜鸟玩云计算之十二:KVM虚拟机更改大小 参考: http://www.missionfamilybank.org/expanding-resizing-your-qcow2-virtual-mach ...
- 菜鸟玩云计算之十四:克隆虚拟机及ssh登录的问题
菜鸟玩云计算之十四:克隆虚拟机及ssh登录的问题 今天早上,我的Ubuntu12.04.3LTS Desktop提示升级,升级. 从vm-ubuntu12.04克隆出虚拟机vm-thrift: $ s ...
- 菜鸟玩云计算之十五:在Ubuntu上创建和管理Redhat虚拟机
菜鸟玩云计算之十五:在Ubuntu上创建和管理Redhat虚拟机 chedou@hgdb.net 虚拟机给工作带来巨大的便利,不仅仅体现在资源的按需使用,而且配置的迁移特别方便.本文将使用Ubuntu ...
- 基于zookeeper的高可用Hadoop HA集群安装
(1)hadoop2.7.1源码编译 http://aperise.iteye.com/blog/2246856 (2)hadoop2.7.1安装准备 http://aperise.iteye.com ...
- Hadoop 2.7.3 分布式集群安装
1. 集群规划: 192.168.1.252 palo252 Namenode+Datanode 192.168.1.253 palo253 YarnManager+Datanode+Secondar ...
随机推荐
- html5全解析
htm是软件开发中非常基础的知识,也是很重要的知识,在web中是很重要的知识点,在此梳理一下主要内容: 1.HTML是什么? 全称为HyperText Markup Language,超文本标记语言, ...
- 多线程之Java线程阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java ...
- Android开发中StackOverflowError
Android开发中StackOverflowError错误实例分析 一.概述 我在一个复杂的layout嵌套较多的android界面,碰到了java.lang.StackOverflowError这 ...
- quartz 时间设置(定时任务scheduler)
quartz用来设置定时任务的作业调度程序.在linux的crontab中用到. 格式为: * * * * * * * 其从左到右顺序代表 :[秒] [分] [小时] [日] [月] [周] [年] ...
- 查看LOV对应查询语句的研究
一.获取当前会话id 1.方法一 tools: Help > About 2.方法二 打开个性化定义界面(如果没有权限,到系统配置文件设置中,查看是否是"隐藏诊断菜单"被设置 ...
- android PakageManagerService启动流程分析
PakageManagerService的启动流程图 1.PakageManagerService概述 PakageManagerService是android系统中一个核心的服务,它负责系统中Pac ...
- UNIX网络编程——fcntl函数
fcntl函数提供了与网络编程相关的如下特性: 非阻塞式I/O. 通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型. 信号驱动式I/O. 通过使用F ...
- GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割
One cut in grabcut(grabcut算法的非迭代实现?) 本文针对交互式图像分割中的图割算法,主要想翻译一篇英文文献.不足之处请大家指正. 这是博主近期看到的效果最好,实现最简单 ...
- Xcode中Groups和Folder的区别
以前一直没有在意这个问题,今天"中奖"了 ;( 在Xcode文件夹视图中会发现2种颜色的文件夹图标:黄色和蓝色. 黄色表示组(groups),蓝色表示文件夹(folder). 组只 ...
- 给你的流添加缓冲装置——字节块ByteChunk
这是一个很重要的一个字节数组处理缓冲工具,它封装了字节缓冲器及对字节缓冲区的操作,包括对缓冲区的写入.读取.扩展缓冲区大小等等,另外还提供相应字符编码的转码操作.此工具让缓冲操作变得更加方便,除了缓冲 ...