前言
部署的脚本网址:(http://git.oschina.net/snake1361222/hadoop_scripts)。
本文的所有部署都基于cloudera公司的CDH4,CDH4是cloudera公司包装好的hadoop生态圈一系列yum包,把CDH4放到自己的yum仓库中,能极大的提高hadoop环境部署的简易性。
本文的部署过程中涵盖了namenode的HA实现,hadoop管理的解决方案(hadoop配置文件的同步,快速部署脚本等)。
环境准备
一共用5台机器作为硬件环境,全都是centos 6.4
-
namenode & resourcemanager 主服务器: 192.168.1.1
-
namenode & resourcemanager 备服务器: 192.168.1.2
-
datanode & nodemanager 服务器: 192.168.1.100 192.168.1.101 192.168.1.102
-
zookeeper 服务器集群(用于namenode 高可用的自动切换): 192.168.1.100 192.168.1.101
-
jobhistory 服务器(用于记录mapreduce的日志): 192.168.1.1
-
用于namenode HA的NFS: 192.168.1.100
环境部署
一、加入CDH4的YUM仓库
1.最好的办法是把cdh4的包放到自建的yum仓库中,如何自建yum仓库请看 自建YUM仓库
2.如果不想自建yum仓库,在所有的hadoop机器执行以下操作加入cdn4的yum仓库
1
2
|
wget http:
//archive
.cloudera.com
/cdh4/one-click-install/redhat/6/x86_64/cloudera-cdh-4-0
.x86_64.rpm
sudo
yum --nogpgcheck localinstall cloudera-cdh-4-0.x86_64.rpm
|
二、创建用于namenode HA的NFS服务器
1.登录192.168.1.100,执行以下脚本 createNFS.sh
1
2
3
4
5
6
7
8
|
#!/bin/bash
yum -y
install
rpc-bind nfs-utils
mkdir
-p
/data/nn_ha/
echo
"/data/nn_ha *(rw,root_squash,all_squash,sync)"
>>
/etc/exports
/etc/init
.d
/rpcbind
start
/etc/init
.d
/nfs
start
chkconfig --level 234 rpcbind on
chkconfig -level 234 nfs on
|
三、Hadoop Namenode & resourcemanager 主服务器 环境部署
1.登录192.168.1.1,创建脚本目录,把脚本从git仓库复制下来
1
2
3
4
5
|
yum –y
install
git
mkdir
–p
/opt/
cd
/opt/
git clone http:
//git
.oschina.net
/snake1361222/hadoop_scripts
.git
/etc/init
.d
/iptables
stop
|
2.修改hostname
1
|
sh
/opt/hadoop_scripts/deploy/AddHostname
.sh
|
3.修改部署脚本的配置文件
1
2
3
4
5
|
vim
/opt/kingsoft/hadoop_scripts/deploy/config
master=
"192.168.1.1"
nfsserver=
"192.168.1.100"
|
4.编辑hosts文件(此文件会同步到hadoop集群所有机器)
1
2
3
4
5
6
7
8
|
vim
/opt/hadoop_scripts/share_data/resolv_host
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.1 nn.dg.hadoop.cn
192.168.1.2 nn2.dg.hadoop.cn
192.168.1.100 dn100.dg.hadoop.cn
192.168.1.101 dn101.dg.hadoop.cn
192.168.1.102 dn102.dg.hadoop.cn
|
5.执行部署脚本CreateNamenode.sh
1
|
sh
/opt/hadoop_scripts/deploy/CreateNamenode
.sh
|
6.搭建saltstack master
PS:类似于puppet的服务器管理开源工具,比较轻量,在这里用于管理hadoop集群,调度datanode,关于saltstack的详细请看 SaltStack部署与使用
a.安装
1
|
yum -y
install
salt salt-master
|
b.修改配置文件`/etc/salt/master`,下面标志的是需要修改的项
1
2
3
4
5
6
7
8
|
修改监听IP:
interface: 0.0.0.0
多线程池:
worker_threads: 5
开启任务缓存:(官方描叙开启缓存能承载5000minion)
job_cache
开启自动认证:
auto_accept: True
|
c.开启服务
1
2
|
/etc/init
.d
/salt-master
start
chkconfig salt-master on
|
7.部署过程中已经把我的sample配置复制过去了,所以只需要修改部分配置文件
a. /etc/hadoop/conf/hdfs-site.xml (其实就是按实际修改主机名地址)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<
property
>
<
name
>dfs.namenode.rpc-address.mycluster.ns1</
name
>
<
value
>nn.dg.hadoop.cn:8020</
value
>
<
description
>定义ns1的rpc地址</
description
>
</
property
>
<
property
>
<
name
>dfs.namenode.rpc-address.mycluster.ns2</
name
>
<
value
>nn2.dg.hadoop.cn:8020</
value
>
<
description
>定义ns2的rpc地址</
description
>
</
property
>
<
property
>
<
name
>ha.zookeeper.quorum</
name
>
<
value
>dn100.dg.hadoop.cn:2181,dn101.dg.hadoop.cn:2181,dn102.dg.hadoop.cn:2181,</
value
>
<
description
>指定用于HA的ZooKeeper集群机器列表</
description
>
</
property
>
|
b. mapred-site.xml
1
2
3
4
5
6
7
8
|
<
property
>
<
name
>mapreduce.jobhistory.address</
name
>
<
value
>nn.dg.hadoop.cn:10020</
value
>
</
property
>
<
property
>
<
name
>mapreduce.jobhistory.webapp.address</
name
>
<
value
>nn.dg.hadoop.cn:19888</
value
>
</
property
>
|
c. yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
property
>
<
name
>yarn.resourcemanager.resource-tracker.address</
name
>
<
value
>nn.dg.hadoop.cn:8031</
value
>
</
property
>
<
property
>
<
name
>yarn.resourcemanager.address</
name
>
<
value
>nn.dg.hadoop.cn:8032</
value
>
</
property
>
<
property
>
<
name
>yarn.resourcemanager.scheduler.address</
name
>
<
value
>nn.dg.hadoop.cn:8030</
value
>
</
property
>
<
property
>
<
name
>yarn.resourcemanager.admin.address</
name
>
<
value
>nn.dg.hadoop.cn:8033</
value
>
</
property
>
|
三、Hadoop Namenode & resourcemanager 备服务器 环境部署
1.登录192.168.1.2,创建脚本目录,从主服务器把脚本同步过来
1
2
3
|
/etc/init
.d
/iptables
stop
mkdir
–p
/opt/hadoop_scripts
rsync
–avz 192.168.1.1::hadoop_s
/opt/hadoop_scripts
|
2.执行部署脚本CreateNamenode.sh
1
|
sh
/opt/hadoop_scripts/deploy/CreateNamenode
.sh
|
3.同步hadoop配置文件
1
|
rsync
–avz 192.168.1.1::hadoop_conf
/etc/hadoop/conf
|
4.部署saltstack客户端
1
|
sh
/opt/hadoop_scripts/deploy/salt_minion
.sh
|
四、zookeeper服务器集群部署
zookeeper是一个开源分布式服务,在这里用于namenode 的auto fail over功能。
1.安装
1
|
yum
install
zookeeper zookeeper-server
|
2.修改配置文件/etc/zookeeper/conf/zoo.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
maxClientCnxns=50
tickTime=2000
initLimit=10
syncLimit=5
dataDir=
/var/lib/zookeeper
clientPort=2181
server.1=dn100.dg.hadoop.cn :2888:3888
server.2=dn101.dg.hadoop.cn:2888:3888
|
3.指定当前机器的id,并开启服务
1
2
3
4
5
6
7
|
echo
"1"
>
/var/lib/zookeeper/myid
chown
-R zookeeper.zookeeper
/var/lib/zookeeper/
service zookeeper-server init
/etc/init
.d
/zookeeper-server
start
chkconfig zookeeper-server on
|
五、datanode & nodemanager 服务器部署
1.登录datanode机器,创建脚本目录,从主服务器把脚本同步过来
1
2
3
|
/etc/init
.d
/iptables
stop
mkdir
–p
/opt/hadoop_scripts
rsync
–avz 192.168.1.1::hadoop_s
/opt/hadoop_scripts
|
2.修改hostname,执行部署脚本 CreateDatanode.sh
1
2
|
sh
/opt/hadoop_scripts/deploy/AddHostname
.sh
sh
/opt/hadoop_scripts/deploy/CreateDatanode
.sh
|
集群初始化
到这里,hadoop集群的环境已部署完毕,现在开始初始化集群
一、namenode的HA高可用初始化
1.在namenode主服务器(192.168.1.1)执行zookeeper的failover功能格式化
1
|
sudo
–u hdfs hdfs zkfc –formatZK
|
2.把zookeeper集群服务启动(192.168.1.100 192.168.1.101 )
1
|
/etc/init
.d
/zookeeper-server
start
|
3.把namenode主备服务器的zkfc服务起来(192.168.1.1 192.168.1.2)
1
|
/etc/init
.d
/hadoop-hdfs-zkfc
start
|
4.在namenode主服务器(192.168.1.1)格式化hdfs
1
2
|
sudo
-u hdfs hadoop namenode –
format
|
5.第一次搭建namenode高可用,需要把name.dir下面的数据复制到namenode备服务器(此坑花了好多时间)
a.在主服务器(192.168.1.1)执行
1
2
|
tar
-zcvPf
/tmp/namedir
.
tar
.gz
/data/hadoop/dfs/name/
nc -l 9999 <
/tmp/namedir
.
tar
.gz
|
b.在备服务器(192.168.1.2)执行
1
2
|
wget 192.168.1.1:9999 -O
/tmp/namedir
.
tar
.gz
tar
-zxvPf
/tmp/namedir
.
tar
.gz
|
6.主从服务都启动
1
2
|
/etc/init
.d
/hadoop-hdfs-namenode
start
/etc/init
.d
/hadoop-yarn-resourcemanager
start
|
7.查看hdfs的web界面
1
2
3
4
5
|
http:
//192
.168.1.1:9080
http:
//192
.168.1.2:9080
|
8.现在可以尝试关闭namenode主服务,看是否能主从切换
二、hdfs集群开启
到这里,所有hadoop部署已完成,现在开始把集群启动,验证效果
1.把所有datanode服务器启动
1
2
|
salt -
v
"dn*"
cmd.run
"/etc/init.d/hadoop-hdfs-datanode start"
|
2.查看hdfs web界面,看是否都成为live nodes
3.如果没有问题,现在可以尝试hdfs操作
1
2
3
4
5
6
7
8
9
10
|
sudo
-u hdfs hdfs dfs -
mkdir
/tmp
dd
if
=
/dev/zero
of=
/data/test_10G_file
bs=1G count=10
md5sum
/data/test_10G_file
sudo
-u hdfs hdfs dfs -put
/data/test_10G_file
/tmp
sudo
-u hdfs hdfs dfs -
ls
/tmp
sudo
-u hdfs hdfs dfs -get
/tmp/test_10G_file
/tmp/
md5sum
/tmp/test_10G_file
|
三、yarn集群开启
hadoop除了hdfs用于大数据的分布式存储,还有更重要的组件,分布式计算(mapreduce)。现在我们来把mapreducev2 yarn集群启动
1.在主服务器把resourcemanager服务起来(192.168.1.1)
1
|
/etc/init
.d
/hadoop-yarn-resourcemanager
start
|
2.把所有nodemanager服务启动
1
2
|
salt -
v
"dn*"
cmd.run
"/etc/init.d/hadoop-yarn-nodemanager start"
|
4.hadoop自带有基准测试的mapreduce实例,我们利用它来测试yarn环境是否正常
1
2
3
4
5
6
7
8
9
10
11
|
su
hdfs -
hadoop jar
/usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2
.0.0-cdh4.2.1-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 1000
hadoop jar
/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples
.jar randomwriter random-data
hadoop jar
/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples
.jar
sort
random-data sorted-data
hadoop jar
/usr/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2
.0.0-cdh4.2.1-tests.jar testmapredsort -sortInput random-data \
-sortOutput sorted-data
|
Hadoop集群的管理
一、datanode & nodemanager 节点加入
1.修改hosts表,譬如有节点192.168.1.103需要加入
1
2
3
4
5
6
7
8
9
|
vim
/opt/hadoop_scripts/share_data/resolv_host
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.1 nn.dg.hadoop.cn
192.168.1.2 nn2.dg.hadoop.cn
192.168.1.100 dn100.dg.hadoop.cn
192.168.1.101 dn101.dg.hadoop.cn
192.168.1.102 dn102.dg.hadoop.cn
192.168.1.103 dn103.dg.hadoop.cn
|
2.修改hostname,同步脚本目录,并执行部署
1
2
3
4
|
mkdir
–p
/opt/hadoop_scripts
rsync
–avz 192.168.1.1::hadoop_s
/opt/hadoop_scripts
sh
/opt/hadoop_scripts/deploy/CreateDatanode
.sh
sh
/opt/hadoop_scripts/deploy/AddHostname
.sh
|
3.开启服务
1
2
|
/etc/init
.d
/hadoop-hdfs-datanode
start
/etc/init
.d
/hadoop-yarn-nodemanager
start
|
二、修改hadoop配置文件
一般在一个hadoop集群中维护一份hadoop配置,这份hadoop配置需要分发到集群中各个成员。这里的做法是 salt + rsync
1
2
3
4
5
|
sync_h_conf
sync_h_script
|
三、监控
比较普遍的方案是,ganglia和nagios监控,ganglia收集大量度量,以图形化程序,nagios在某度量超出阀值后报警.ganglia监控以后补充一下文档
其实,hadoop自带有接口提供我们自己写监控程序,而且这个接口还是比较简单,通过这样便可以访问http://192.168.1.1:9080/jmx,返回值是JSON格式,其中的内容也非常详细。但是每次查询都返回一大串的JSON也是浪费,其实接口还提供更新详细的查询 譬如我只想查找系统信息,可以这样调用接口http://192.168.1.1:9080/jmx?qry=java.lang:type=OperatingSystem 。qry参考后跟的就是整个JSON的“name”这个key的值