Hadoop集群配制指南及问题总结

Hadoop配制流程在hadoop官方网站wiki上面写得很详细(http://wiki.apache.org/hadoop),可 惜是英文的,部 分人看起来蛮吃力,下面我结合前段维护Hadoop集群的经验,分享一个真正的hadoop集群搭建的整个流程,最后还分享一些我在维护过程中遇到的问题 以及解决办法。

一、前期规划及资源配制

用Hadoop集群无非是进行大数据存储和大数据处理相关的业务,数据量很大,服务器数量至少几十台甚至上万台,如何在集群搭建初期选择合适的服务 器数量 和服务器配制,这个需要在前期就统筹规划好,人个认为,就存储容量来说至少能存储一年的数据,如一天平均需要存储10G的数据,那么一年会产生10G * 365 * 3 = 10.95T(3是副本数目,个人觉得3已经够用了),考虑到高峰期以及扩展的数据存储需要,总存储空间12T基本能满足需求,对于CPU和内存的选择, 需要综合考虑基于Hadoop之上的应用对CPU和内存的需求,我拿A公司来说,Hadoop之上的应用有Hive,公司内部使用的数据同步系统,可能以 后还有Hbase,Hypertable,考虑到Hbase和Hypertable比较吃内存,所以A公司数据节点选择的配制相对比较高 (NameNode节点和备份节点配制一样,理论上Name Node应该配制要稍微高一些才对,随着数据量的增加,Meta data会越积越多,不像Data Node的数量可以线性增加,Name  Name仅有一台,所有这一点需要考虑到)

CPU:Intel(R) Xeon(R) CPU E5620  @ 2.40GHz  16核                                                       RAM:12G                                                                                                                        DISK:550G

最终集群的硬件配制单如下:
机器数:12
DataNode:10
NameNode: 1
SecondNameNode : 1
所有的机器配制一样(考虑到维护的便利性和经后M/R的性能,数据节点的配制最好保持一致)

二、环境准备

1、添加地址映射 修改hosts文件,在/etc/hosts文件末尾添加如下地址映射(所有节点上均需要添加)

#master
192.168.1.10    master
192.168.1.11    secondnamenode
#slave
192.168.1.20    datanode0
192.168.1.21    datanode1
192.168.1.22    datanode2
192.168.1.23    datanode3
192.168.1.24    datanode4
192.168.1.25    datanode5
192.168.1.26    datanode6
192.168.1.27    datanode7
192.168.1.28    datanode8
192.168.1.29    datanode9

2. 添加hadoop操作用户

useradd -d /home/hadoop -m hadoop -p hadoop

3. 配置ssh免密码登陆(在Namenode机器上用hadoop用户操作)

1)    创建ssh目录;

mkdir ~/.ssh
如果~/.ssh目录已经存在,则这一步可以跳过(如果以前用hadoop用户ssh登录过其它机器,则此目录会存在);

2)    cd ~/.ssh
3)    生成key文件

ssh-keygen2 -t rsa
回车后,提示Enter file in which to save the key,一直直接回画即可,默认为id_rsa,本步会生成id_rsa.pub文件;

4)    cat id_rsa.pub >> authorized_keys;

chmod 700 /home/hadoop/.ssh/
chmod 700 /home/hadoop
chmod 600 /home/hadoop/.ssh/authorized_keys

5)    将id_rsa.pub分别拷到其它所有节点:

scp ~/.ssh/id_dsa.pub hadoop@secondnamenode:/home/hadoop/.ssh
拷完以后,在各机器上面做如下操作
cd /home/hadoop/.ssh
cat id_rsa.pub >> authorized_keys
操作完后,在NameNode节点上面ssh登陆其它机器,验证是否需要输入密码。

4. 安装JDK

1)    下载Jdk1.6(hadoop只能运行在JDK1.5以上的版本)下载地址:https://cds.sun.com/is-bin /INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u21-oth-JPR@CDS-CDS_Developer
2)    下载Hadoop(hadoop-0.20.2-cdh3u1)

http://archive.cloudera.com/cdh/3/hadoop-0.20.2-cdh3u1.tar.gz

三、执行安装

1.在所有机器上安装jdk,默认安装目录为/usr/java/jdk1.6.0_27;
2.将hadoop安装包解压至/home/hadoop/hadoopcdh;(本操作在NameNode节点进行)
3.配制环境变量

通过vi打开/etc/profile,并在其后配制JAVA_HOME、HADOOP_HOME。
export JAVA_HOME=/usr/java/jdk1.6.0_27
export HADOOP_HOME=/home/hadoop/hadoopcdh
PATH=/hive/jdk1.6/bin:/home/hadoop/hive/bin:/home/hadoop/hadoopcdh/bin: $PATH
退出编辑在命令行里执行 source /etc/profile

4.修改hadoop-env.sh

该文件位于HADOOP_HOME/conf,用vi打开该文件,在其后添加
export JAVA_HOME=/usr/java/jdk1.6.0_27
export HADOOP_HOME=/home/hadoop/hadoopcdh
export HADOOP_SSH_OPTS=”-p 7710″    //如果ssh非默认时需要修改

5.    修改core-site.xml(参考附件)
6.    修改core-site.xml(参考附件)
7.    将配制好的hadoop整个目录分别拷到所有节点

#!/usr/bin/env bash
#addr=”0 1 2 3 4 5 6 7 8 9″
for tt in ${addr[*]}
do
scp -r -P22 /home/hadoop/hadoopcdh  hadoop@datanode${tt}:/home/hadoop/
done;
scp -r -P22 /home/hadoop/hadoopcdh  hadoop@secondnamenode:/home/hadoop/

 

配制完毕在NameNode执行如下操作

cd /home/hadoop/hadoopcdh

bin/hadoop fs namenode –format

bin/start-all.sh

四、常见问题总结

    问题1.Map/reduce job在做reduce计算时,报下面这个错误

Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.

解决办法:配制hadoop节点名称跟机器名称不一致,将机器名称和hadoop节点名称同时绑定到一个IP  即可。

问题2.hive打开多个shell时报错

解决办法:Hive默认的元数据存储在deby中,这种存储方式不允许多个实例访问hive,改成mysql即可解决此问题。

问题3. org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /home/hadoop/hadoopcdh/dfs/data: namenode namespaceID = 240012870; datanode namespaceID = 1462711424 .

解决办法:每次namenode format会重新创建一个namespaceID,而/home/hadoop/hadoopcdh/dfs/data下包含了上次format下的 id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,所以造成namenode节点上的namespaceID与 datanode节点上的namespaceID不一致。启动失败。解决方法一般有两种:
(1)       清空datanode下的数据,如果数据不重要可以采用本方法;
(2)       更新出现问题数据节点上的namespaceID,修改数据节点上面的namespaceID使之与namenode上的保持一致;修改的文件路径为<dfs.data.dir>/current/VERSION

问题4.org.apache.hadoop.dfs.SafeModeException: Cannot put /home/ /input. Name node is in safe mode

解决办法:HDFS文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删 除,直到 安全模式结束。安全模式未结束之前对HDFS进行操作就会报上面这种错误,可以等安全模式结束再操作,也可以通过如下命令来结束安全模式:
bin/hadoop dfsadmin -safemode leave

问题5. Hadoop如何动态添加删除节点

解决办法:从集群中移走节点,需要对移走节点的数据进行备份:在主节点的core-site.xml配置文件中添加如下内容:
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/excludes</value><property>
dfs.hosts.exclude:指要删除的节点,/etc/hadoop/conf/excludes:指定要被删除文件所在路径及名称,该处定义为excludes
执行bin/hadoop dfsadmin –refreshNodes更新节点,执行完成被删除节点datanode消失了,但是tasktracker还会存在,需要自己手动停掉。然后通过 bin/hadoop dfsadmin -report查看节点的移除情况。

问题5. Hadoop如何动态添加添加节点
解决办法:把新机器的增加到conf/slaves文件中,在新机器上进入hadoop安装目录执行下面命令:
$bin/hadoop-daemon.sh start datanode
$bin/hadoop-daemon.sh start tasktracker
然后在namenode上执行$bin/hadoop balancer

问题6. ERROR com.cloudera.flume.handlers.rolling.RollSink: Got a throwable that is not an exception! Bailing out!org.apache.hadoop.fs.FSError: java.io.IOException: No space left on device at org.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.write(RawLocalFileSystem.java:201) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java

问题7.hadoop namenode出问题,如何恢复呢?
解决办法:修改conf/core-site.xml
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
<description>The number of seconds between two periodic checkpoints.  </description>
</property>
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
<description>The size of the current edit log (in bytes) that triggers       a periodic checkpoint even if the fs.checkpoint.period hasn’t expired.  </description>
</property>
<property>
<name>fs.checkpoint.dir</name>   <value>/data/work/hdfs/namesecondary</value>     <description>Determines where on the local filesystem the DFS secondary      name node should store the temporary images to merge.      If this is a comma-delimited list of directories then the image is      replicated in all of the directories for redundancy.  </description>
</property>
fs.checkpoint.period表示多长时间记录一次hdfs的镜像。默认是1小时。
fs.checkpoint.size表示一次记录多大的size,默认64M
修改conf/hdfs-site.xml
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
<description>    The address and the base port where the dfs namenode web ui will listen on.    If the port is 0 then the server will start on a free port.  </description>
</property>
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
<description>    The address and the base port where the dfs namenode web ui will listen on.    If the port is 0 then the server will start on a free port.  </description>
</property>
0.0.0.0改为namenode的IP地址

重启hadoop,然后检查是否启动是否成功。

登录secondarynamenode所在的机器,输入jps查看secondarynamenode进程进入secondarynamenode的目录/data/work/hdfs/namesecondary,就能看到相应的备份文件。
还原
1.删除name目录下的所有内容,但是必须保证name这个目录是存在的;
2.从secondarynamenode远程拷贝namesecondary文件到namenode的namesecondary;
3.启动namenode hadoop namenode –importCheckpoint;
4.检查完整性 hadoop fsck /user命令检查文件Block的完整性;
5.停止namenode,使用crrl+C或者会话结束;
6.重启hadoop;

问题8.Hadoop HDFS Balancer的作用是什么?
Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加新的数据节点。当HDFS出现不平衡状况的时候,将 引发很多问题,比如MR程序无法很好地利用本地计算的优势,机器之间无法达到更好的网络带宽使用率,机器磁盘无法利用等等。可见,保证HDFS中的数据平 衡是非常重要的。在Hadoop中,包含一个Balancer程序,通过运行这个程序,可以使得HDFS集群达到一个平衡的状态,使用这个程序的命令如 下:
sh $HADOOP_HOME/bin/start-balancer.sh –t 10% 这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果机器与机器之间磁盘使用率偏差小于10%,那么我们就认为HDFS集群已经达到了平衡的状态。
Hadoop的开发人员在开发Balancer程序的时候,遵循了以下几点原则:
1.在执行数据重分布的过程中,必须保证数据不能出现丢失,不能改变数据的备份数,不能改变每一个rack中所具备的block数量;
2.系统管理员可以通过一条命令启动数据重分布程序或者停止数据重分布程序;
3. Block在移动的过程中,不能占用过多的资源,如网络带宽;
4.数据重分布程序在执行的过程中,不能影响name node的正常工作;
基于这些基本点,目前Hadoop数据重分布程序实现的逻辑流程如下图所示

posted @ 2016-12-25 21:04  371502685  阅读(289)  评论(0编辑  收藏  举报