一、初始说明
- 系统:Fedora 15
- 机器:7台,NameNode 1+ SecondaryNameNode 1+ DataNode 5
- 单机配置:1G内存,2 core ,32位,35GB可用硬盘,此配置纯属用于简单实验
- Hadoop需要运行在oracle的hotspot JDK上,fedora自带的open-jdk似乎不行
- 使用默认的单机架结构,即所有机子在同一个机架
- 所有机子上,创建hadoop用户,为了方便密码也保持一致。
- 在NameNode机器上解压下载Hadoop到hadoop用户的主目录下,命令:tar -zxvf hadoop-*.tar.gz /home/hadoop/
- 在所有机器上安装JDK,双击或命令:rpm -ivh jdk*.rpm,需要root用户密码。
export JAVA_HOME="/usr/java/jdk1.7.0"
export JRE_HOME="/usr/java/jdk1.7.0/jre"
export HADOOP_HOME="/home/hadoop/hadoop-1.0.3"
export CLASSPATH=.:$JAVA_HOME/LIB:$JRE_HOME/lib:$HADOOP_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#每台机子上的/etc/profile文件都要修改哈~
五、配置hadoop环境变量:修改HADOOP_HOME/conf/下的hadoop-env.sh,fedora下javaJDK默认被安装到/usr/java下。
追加:
export JAVA_HOME="/usr/java/jdk1.7.0"
六、使用SSH令所有机器相互可无密码访问
只演示两台间A、B的操作,Fedora15默认已经安装SSH:
- 在A、B的主目录下创建.ssh文件夹:mkdir .ssh,并都修改其权限:chmod 700 .ssh (注意不可以更高,似乎这样SSH认为不安全)。
- 在A,进入.ssh目录:
1)ssh-keygen -t rsa
2)cat id_rsa.pud >> authorized_keys #请用cat,否则当机器很多的时候用cp可能覆盖原来的文件,而导致之前配置好的机器的配置失效。
3)chmod 600 authorized_keys
4)scp authorized_keys hadoop@B的IP:/home/hadoop/ #如果对ssh原理和scp命令不熟悉,建议你不要直接scp进入B的.ssh目录中,否则在多台机器时会出现覆盖
5)ssh B #需要密码
6)touch ~/.ssh/authorized_keys #如果authorized_keys文件不存在,创建之
7)chmod 600 authorized_keys
8)cat ~/authorized_keys >> ~/.ssh/authorized_keys #将前面复制过来的文件内容追加到.ssh目录下的authorized_keys中。
到此时,A可以无密码登录B - 在B,进入.ssh 目录:
1)ssh-keygen -t rsa
2)cat id_rsa.pub >> authorized_keys
3)scp authorized_keys hadoop@A的IP:/home/hadoop/
4)ssh A
6)cat ~/authorized_keys >> ~/.ssh/authorized_keys
到此时,B也可无密码登录A
其他机子两两间大致如上。
如果发现有的机子无法无密码访问,很可能是权限问题,检查.ssh目录权限和authorized_keys文件的权限,也可通过以下命令查看日志:
ssh -v localhost
tail /var/log/secure -n 20 #查看系统日志,需要root用户
七、修改每台机子的主机名,为了以后方便,修改方式:
- 命令:hostname newName
- 修改/etc/sysconfig/network:
NETWORKING=yesHOSTNAME=datanode6
3. 修改/etc/hosts文件,我尚没尝试使用同步工具,因此我是先修改namenode的配置再使用scp命令复制到其它机子上的。
192.168.0.113 posa
192.168.0.118 datanode6
192.168.0.119 secondarynamenode
192.168.0.111 datanode2
192.168.0.121 datanode13
192.168.0.125 datanode16
192.168.0.116 datanode21
每台机子修改后,要重启服务:/etc/init.d/network restart
此时如果使用命令hostname发现主机名没有成功改动,重启电脑即可。
八、配置hadoop
在NameNode:
- slaves文件,运行datanode和tasktracker守护进程,我下面使用主机名,因为已经配置好hosts文件
datanode2
datanode13
datanode6
datanode16
datanode21 - masters,运行secondaryNamenode守护进程
secondarynamenode - conf/core-site.xml文件
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://posa:8022/</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>65536</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>72000</value>
<description>回收站是用户级特性,当回收站被启用,每个用户都有独立的回收站目录。HDFS会自动删除回收站文件,但其他文件系统不会,而不许定期用hadoop fs -expunge来删除回收站中超过最小时间的文件</description>
</property>
</configuration>
- conf/hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.http.address</name>
<value>192.168.0.113:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>secondarynamenode:50090</value>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>300</value>
<description>The number of seconds between two periodic checkpoints</description>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>/home/hadoop/hdfs/namesecondary</value>
</property>
</configuration> - mapred-site.xml文件
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>posa:8021</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/mapred/local</value>
</property>
<property>
<name>mapred.system.dir</name>
<value>/tmp/hadoop/mapred/system</value>
</property>
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>4</value>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>4</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx400m</value>
</property>
</configuration>
如复制到B:
scp -r hadoop-1.0.3 hadoop@B的主机名或IP:/home/hadoop/
十、在NameNode启动hadoop
start-all.sh
如果你发现要在HADOOP_HOME/bin/下使用./start-all 命令才能成功,那么检查你的/etc/profile文件的配置是否正确。
十一、看系统是否正常工作
1、hadoop dfsadmin -report
如果出现乱码,则说明没正常工作,检查NameNode及各个节点的自己查看错误原因,很可能是以上配置出错。
2、使用浏览器,localhost:50070,看是否出现正常页面。
3、hadoop dfsadmin -put 文件名 /user 是否成功执行
4、jps查看守护进程是否正常启动。
常见错误(以下的错误仅是可能的原因,是我犯过的错误):
一般的纠错总结成一句话:查看日志。
- SecondaryNameNode没起来,查看日志说:文件夹CheckPoint.dir不存在,原因可能是hdfs-site.xml配置错误。
- 在关闭hadoop前format了,造成format后hdfs不可用:ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs ……: namenode namespaceID = A; datanode namespaceID = B,则可能需要删除所有机子上的数据文件,包括/tmp下的。如果你对我这种暴力的做法不满意,请参考 。
- balancer.Balancer:Error moving block……没有到主机的路由。原因:防火墙[没关]。
- 新增datanode节点,启动Hadoop发现新datanode没启动,查看其上日志发现:datanodeName:未知的名称或服务。原因:hosts配置有误。
- 运行Job时发现,有一个task被Killed了两次,在TaskLogs[在hostname:50030中查看]看到抛出org.apache.hadoop.mapred.ReduceTask:java net.unknownHostException:datanode;原因:复制数据时节点间交流出问题,因hosts在所有节点中没有保持一致造成。