记录一下hadoop集群的搭建过程,一共3台机器,操作系统都是debian 6,hadoop版本是1.0.3,jre是源里的openjdk-6。hadoop官网的说明挺详细,就是不能快速搭建出一个能跑的环境。在网上找到一篇文章(见参考资料[1]),虽然文章中用的是0.20版本,但是在1.0.3上也适用。
这里使用master,slave1和slave2分别作为三台机器的主机名。为了操作方便,每台机器上都有一个用户hadoop,密码都一样。以下的配置操作都在master上进行。
hadoop的配置
把下载到的hadoop-1.0.3.tar.gz解压到hadoop的家目录下,建立一个软链接hadoop指向解压得到的目录hadoop-1.0.3,这样以后更新只需重新建立软链接指向新版本即可。
进入解压后的目录,根据实际情况修改conf/hadoop-env.sh中的JAVA_HOME,使其指向jdk的安装目录:
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk在1.0.3版本中不需要HADOOP_HOME这个环境变量,如果设置了这个变量执行命令的时候会提示”Warning: $HADOOP_HOME is deprecated.”。
然后修改conf/core-site.xml:
|
|
修改conf/hdfs-site.xml:
|
|
修改conf/mapred-site.xml:
|
|
最后在conf/masters中添加master机器的ip或主机名:
master
在conf/slaves中添加所有salves,一行一个:
slave1
slave2
其它的配置项使用默认的即可,以上选项具体作用可以参考官网说明和参考资料[1]。
然后把配置好的hadoop-1.0.3整个目录分别复制到每台slave机器的hadoop的家目录下,并且建立软链接hadoop。至此hadoop的配置就完成了。
ssh的配置
因为master需要ssh登录到slave上进行某些操作,因此使用公钥认证的方式,避免手动输入密码。
使用命令
ssh-keygen -t rsa在$HOME/.ssh下生成两个文件:id_rsa和id_rsa.pub。把id_rsa.pub的内容添加到authorized_keys中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys把authorized_keys复制到每个slave上的~/.ssh目录下。完成后在master测试一下ssh登录slave1和slave2,这时应该能直接登录而不用手动输入密码了。
启动和停止hadoop
以上配置完后就可以启动hadoop了。先格式化新的hdfs:
$HOME/hadoop/bin/hadoop namenode -format然后启动hdfs服务:
$HOME/hadoop/bin/start-dfs.sh最后启动map/reduce:
$HOME/hadoop/bin/start-mapred.sh停止hadoop时先停止map/reduce服务:
$HOME/hadoop/bin/stop-mapred.sh再停止hdfs服务:
$HOME/hadoop/bin/stop-dfs.sh另外也可以用$HOME/hadoop/bin下的start-all.sh和stop-all.sh来启动和停止。
一些问题和解决方法
从网上找到的答案,顺手做的笔记,没记下出处。
Q:执行hadoop -put 时报错:Name node is in safe mode.
A:hadoop dfsadmin -safemode leave
Q:reduce执行到16%或17%时停住不动,查看hadoop-{user}-jobtracker-{host}.log中有这样一条错误提示:Failed fetch notification #1 for map task:
A:在每台机器中的/etc/hosts中填写其它机器的ip和对应的主机名,不管在配置文件中写的是ip还是主机名。
Q:出现错误:File /user/hadoop/test could only be replicated to 0 nodes, instead of 1
A:停止hadoop,删除hdfs目录和/tmp/hadoop-{user}*和/tmp/hsperfdata_{user}/,重新格式化,然后重启hadoop服务。
Q:出现错误:org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for ttprivate/taskTracker/hadoop/jobcache/job_201207301453_0036/jobToken
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:381)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:146)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:127)
at org.apache.hadoop.mapred.TaskTracker.localizeJobTokenFile(TaskTracker.java:4271)
at org.apache.hadoop.mapred.TaskTracker.initializeJob(TaskTracker.java:1177)
at org.apache.hadoop.mapred.TaskTracker.localizeJob(TaskTracker.java:1118)
at org.apache.hadoop.mapred.TaskTracker$5.run(TaskTracker.java:2430)
at java.lang.Thread.run(Thread.java:636)
A:重启一下出问题的slave,不行的话同上操作
Q:Caused by: java.lang.OutOfMemoryError: Java heap space
A:修改conf/mapred-site.xml,修改mapred.child.java.opts的值为-Xmx512m或更大。
参考资料