接触Hadoop有两年的时间了,期间遇到不少的问题,既有经典的NameNode和JobTracker内存溢出故障,也有HDFS存储小文件问题,既有任务调度问题,也有MapReduce性能问题.遇到的这些问题有些是Hadoop自身的缺陷(短板),有些则是使用的不当。html
在解决问题的过程当中,有时须要翻源码,有时会向同事、网友请教,遇到复杂问题则会经过mail list向全球各地Hadoop使用者,包括Hadoop Committer(Hadoop开发者)求助。在得到不少人帮助后,本身将遇到问题和心得整理成文,但愿本文能够对那些焦头烂额的Hadoop新手们有所帮助,少走笔者的弯路。node
PS. 本文基于 Cloudera CDH 3u4(同Apache Hadoop 1.0)编写。相关推荐配置为官方推荐值或者笔者经验数值,它不是绝对的,可能会由于不一样的应用场景和硬件环境有所出入。ios
大多数管理员都是从Apache Hadoop开始学习。笔者最开始也使用Apache版本Hadoop进行开发和部署工做,但接触到Cloudera CDH后,我发现它可使管理员的工做更简单,不只能够得到最新的特性和Bug修复,有时也会带来使人惊喜的性能改善。apache
CDH为何更好?笔者罗列了如下几点:安全
推荐指数:★★★服务器
推荐理由:获取最新特性和最新Bug修复;安装维护方便,节省运维时间。网络
安装和维护Hadoop集群涉及大量的管理工做,包括软件安装,设备管理(crontab、iptables等)、配置分发等。架构
对于小型集群软件分发和节点管理可使用PDSH这款软件,它能够经过免密钥的SSH将文件分发到目标服务器,以及为一组目标设备发送命令并得到反馈。若是是大型集群或者硬件配置差异很大的集群,推荐使用puppet这样的工具帮助你维护配置文件,或者经过Cloudera Manager以GUI的方式的管理集群(注意:Clodera Manager不是开源软件,免费版最多支持50个节点)。框架
推荐指数:★★★运维
推荐理由:提升运维效率
SecondaryNameNode(下称SNN)的主要功能是工做是帮助NameNode(下称NN)合并编辑日志,而后将合并后的镜像文件copy回NN,以减小NN重启时合并编辑日志所需的时间。SNN不是NN的热备,可是经过如下步骤能够实现将SNN切换为NN的目的。首先,SNN节点上导入从NN Copy过来的镜像文件,而后修改SNN机器名和IP与NN一致,最后重启集群。
特别注意的是SNN的内存配置要与NN一致,由于合并编辑日志的工做须要将metadata加载到内存完成。另外,不只仅是SNN,任何保存NN镜像的节点均可以经过上面步骤变为NN,只是SNN更适合罢了。
推荐指数:★★★
推荐理由:减小NN重启致使集群服务中断时间;NN节点故障后,SNN充当NN角色
当运行一个大型mapreduce 做业时,咱们一般很是关心该做业对TaskTracker(下称TT)CPU、内存、磁盘,以及整个网络的带宽状况,这时候就须要Ganglia这个工具为咱们生成相关图表来诊断、分析问题。
Ganglia能够监控集群状态,但当你的服务器down机或者某个TT挂掉,它却没法通知到你,这时咱们可使用Nagios这款告警软件,它能够配置邮件告警和短息告警。经过编写plugins,能够实现本身的监控功能。咱们的集群目前作了以下监控:
推荐指数:★★★
推荐理由:Ganglia能够帮你记录集群状态,方便诊断问题;Nagios能够再遇到问题时第一时间通知你。
Hadoop集群安装完毕后,第一件事就是修改bin/hadoop-evn.sh文件设置内存。主流节点内存配置为32GB,典型场景内存设置以下
NN: 15-25 GB
JT:2-4GB
DN:1-4 GB
TT:1-2 GB,Child VM 1-2 GB
集群的使用场景不一样相关设置也有不一样,若是集群有大量小文件,则要求NN内存至少要20GB,DN内存至少2GB。
推荐指数:★★★★★
推荐理由:几个组件中NN对内存最为敏感,它有单点问题,直接影响到集群的可用性;JT一样是单点,若是JT内存溢出则全部MapReduce Job都没法正常执行。
Hadoop原生MapReduce须要Java语言编写,可是不会Java也没问题,经过Hadoop streaming框架管理员可使用Python,Shell,Perl等语言进行MapReduce开发,但更简单的办法是安装和使用Hive或者Pig。
推荐指数:★★★
推荐理由:减小运维时间,快速响应各类ad-hot需求和故障诊断。
前面已经说过,NN是整个集群可能出现的单点故障。
Hadoop经过在hdfs.site.xml文件的dfs.name.dir属性指定保持的metadata路径,若是但愿保持到多个路径,可使用逗号分割配置多个路径。
<property> <name>dfs.name.dir</name> <value>/data/cache1/dfs/nn,/data/cache2/dfs/nn</value> </property>
Hadoop官方推荐配置为metadata配置多个path,其中包含一个NFS的路径。但根据笔者一次集群严重故障经验,即便这样,仍是致使了全部镜像文件损坏,包括SNN上的镜像文件,因此按期备份一个可用的副本仍是颇有必要的。
推荐指数:★★★★★
推荐理由:Cloudera3uX和Apache1.0的NN单点问题是你们最头痛问题之一,多些准备,少量痛苦。
Hadoop的安全控制很是简单,只包含简单的权限,即只根据客户端用户名,决定使用权限。它的设计原则是:“避免好人作错事,但不阻止坏人作坏事”。
若是你知道某台NN的IP和端口,则能够很轻松获取HDFS目录结构,并经过修改本机机器用户名假装成HDFS文件所属owner,对该文件进行删除操做。
经过配置kerberos,能够实现身份验证。但不少管理员使用更简单有效的办法——经过防火墙对访问IP进行控制。
推荐指数:★★★★★
推荐理由:安全无小事,防范于未然。
我曾经犯下一个错误,在我加班很是累,大脑稍有混乱的时候,不当心删除执行了一个命令“hadoop fs -rmr /xxx/xxx”,没有删除提示,几TB的数据,一会儿就没有了。简直让我崩溃,后悔莫及。这时你多但愿有个时间机器可让HDFS恢复到删除前的状态。
trash功能就是这个时间机器, 它默认是关闭的,开启后,被你删除的数据将会mv到操做用户目录的".Trash"文件夹,能够配置超过多长时间,系统自动删除过时数据。这样一来,当操做失误的时候,能够把数据mv回来。开启垃圾箱步骤以下:
vi core-site.xml ,添加下面配置,value单位为分钟。
<property> <name>fs.trash.interval</name> <value>1440</value> </property>
笔者 在CDH3u4下不用重启Namenode就能够生效。开启垃圾箱后,若是但愿文件直接被删除,能够在使用删除命令时添加“–skipTrash” 参数,以下:
hadoop fs –rm –skipTrash /xxxx
推荐指数:★★★★★
推荐理由:想要时间机器吗?
Hadoop是一个很是优秀的开源项目,但它仍存有不少还没有解决的问题,诸如,NN,JT单点问题,JT挂死问题,Block在小文件下汇报效率低下等问题。此时能够经过以下渠道找到能够帮助你的人,笔者几回集群严重故障都是经过Cloudera公司的google user group直接得到几位 committer的帮助。一般前一天提问,次日就会有反馈。下面是两个可以帮助的你的社区,固然你也能够帮助其余人:
Apache hadoop的mail list :
http://hadoop.apache.org/mailing_lists.html
Cloudera CDH google group:
https://groups.google.com/a/cloudera.org/forum/#!forum/cdh-user
推荐指数:★★★★★
推荐理由:没有人比软件做者更熟悉Hadoop自己,去社区求助,帮你解决不少本身没法跨越的问题。
公司是一家Hadoop软件服务公司,提供免费软件CDH和Cloudera Manager Free Edition,同时提供Hadoop相关资讯、培训、技术支持等服务。Hadoop创始人Dong Cutting在该公司任架构师,同时该公司拥有多名Apache Committer。