参考网站:http://blog.csdn.net/inte_sleeper/article/details/6569990
下面的教程把它们合并至multi-nodecluster。
1. 合并single-node至multi-nodecluster
修改master的hadoop/conf/core-site.xml:
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop_tmp/hadoop_${user.name}</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:54310</value>
</property>
<property>
<name>io.sort.mb</name>
<value>1024</value>
</property>
修改conf/mapred-site.xml,在<configuration>节中添加如下内容:
<property>
<name>mapred.job.tracker</name>
<value>master:54311</value>
</property>
<property>
<name>mapred.map.child.java.opts</name>
<value>-Xmx4096m</value>
</property>
<property>
<name>mapred.reduce.child.java.opts</name>
<value>-Xmx4096m</value>
</property>
修改conf/hdfs-site.xml,在<configuration> 节中添加如下内容:
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
把这三个文件复制至slave1相应的目录hadoop/conf中(即master和slave1的内容完全一致)
修改所有节点的hadoop/conf/masters,把文件内容改成:master
修改所有节点的hadoop/conf/slaves,把文件内容改成:
master
slave1
分别删除master和slave1的dfs/data文件:
rm –rf /root/hadoop_tmp/hadoop_root/dfs/data
重新格式化namenode:
hadoop/bin/hadoop namenode-format
测试,在master上运行:
hadoop/bin/start-all.sh
在master上运行jps命令
此时输出应类似于:
11648TaskTracker
11166 NameNode
11433SecondaryNameNode
12552 Jps
11282 DataNode
11525 JobTracker
在slave1上运行jps
此时输出应包含(即至少有DataNode,否则即为出错):
3950 Jps
3121 TaskTracker
3044 DataNode
2. 测试一个JOB
首先升级python(可选,如果JOB是python写的):
cd/etc/yum.repos.d/
wgethttp://mirrors.geekymedia.com/centos/geekymedia.repo
yum makecache
yum -y install python26
升级python的教程,见另外一篇文档。如果已经通过以上方法安装了python2.6,那需要先卸载:
yum remove python26python26-devel
CentOS的yum依赖于python2.4,而/usr/bin中python程序即为python2.4。我们需要把它修改成python2.6。
cd /usr/bin/
编辑yum文件,把第一行的
#!/usr/bin/python à #!/usr/bin/python2.4
保存文件。
删除旧版本的python可执行文件(这个文件跟该目录下python2.4其实是一样的,所以可以直接删除)
rm -f python
让python指向python2.6的可执行程序。
ln -s python26python
3. Word count python版本
Map.py
#! /usr/bin/python
import sys;
for line insys.stdin:
line = line.strip();
words = line.split();
for word in words:
print '%s/t%s' % (word,1);
Reduce.py
#!/usr/bin/python
import sys;
wc = {};
for line insys.stdin:
line = line.strip();
word,count = line.split('/t',1);
try:
count = int(count);
except Error:
pass;
if wc.has_key(word):
wc[word] += count;
else: wc[word] = count;
for key inwc.keys():
print '%s/t%s' % (key, wc[key]);
本机测试:
echo "foo foo bar barfoo abc" | map.py
echo "foo foo bar barfoo abc" | map.py | sort | reduce.py
在hadoop中测试:
hadoop jar/usr/local/hadoop/contrib/streaming/hadoop-streaming-0.20.203.0.jar -filemapper.py -mapper mapper.py -file reducer.py -reducer reducer.py -input wc/*-output wc-out
Job成功后,会在HDFS中生成wc-out目录。
查看结果:
hadoop fs –ls wc-out
hadoop fs –catwc-out/part-00000
4. 集群增加新节点
a. 执行步骤1,2.
b. 修改hosts文件,将集群中的hosts加入本身/etc/hosts中。并修改集群中其他节点的hosts,将新节点加入。
c. master的conf/slaves文件中,添加新节点。
d. 启动datanode和task tracker。
hadoop-daemon.shstart datanode
hadoop-daemon.shstart tasktracker
5. Trouble-shooting
hadoop的日志在hadoop/logs中。
其中,logs根目录包含的是namenode, datanode, jobtracker, tasktracker等的日志。分别以hadoop-{username}-namenode/datanode/jobtracker/tasktracker-hostname.log命名。
userlogs目录里包含了具体的job日志,每个job有一个单独的目录,以job_YYYYmmddHHmm_xxxx命名。里面包含数个attempt_{jobname}_m_xxxxx或attempt_{jobname}_r_xxxx等数个目录。其中目录名中的m表示map任务的日志,r表示reduce任务的日志。因此,出错时,可以有针对性地查看特定的日志。
常见错误:
1. 出现类似:
ERRORorg.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException:Incompatible namespaceIDs …
的异常,是因为先格式化了namenode,后来又修改了配置导致。将dfs/data文件夹内容删除,再重新格式化namenode即可。
2. 出现类似:
INFOorg.apache.hadoop.ipc.Client: Retrying connect to server:…
的异常,首先确认name node是否启动。如果已经启动,有可能是master或slave1中的配置出错,集群配置参考步骤11。也有可能是防火墙问题,需添加以下例外:
50010端口用于数据传输,50020用于RPC调用,50030是WEB版的JOB状态监控,54311是job tracker,54310是与master通信的端口。
完整的端口列表见:
http://www.cloudera.com/blog/2009/08/hadoop-default-ports-quick-reference/
iptables -ARH-Firewall-1-INPUT -p tcp -m tcp --dport 50010 -j ACCEPT
iptables -ARH-Firewall-1-INPUT -p tcp -m tcp --dport 50020 -j ACCEPT
iptables -ARH-Firewall-1-INPUT -p tcp -m tcp --dport 50030 -j ACCEPT
iptables -ARH-Firewall-1-INPUT -p tcp -m tcp --dport 50060 -j ACCEPT
iptables -ARH-Firewall-1-INPUT -p tcp -m tcp --dport 54310 -j ACCEPT
iptables -ARH-Firewall-1-INPUT -p tcp -m tcp --dport 54311 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --dport 50010 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --dport 50020 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --sport 50010 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --sport 50020 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --dport 50030 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --sport 50030 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --dport 50060 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --sport 50060 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --dport 54310 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --sport 54310 -j ACCEPT
iptables -A OUTPUT-p tcp -m tcp --dport 54311 -j ACCEPT
iptables-A OUTPUT -p tcp -m tcp --sport 54311 -j ACCEPT
保存规则:
/etc/init.d/iptablessave
重启iptables服务:
serviceiptables restart
如果还是出现问题2的错误,那可能需要手工修改 /etc/sysconfig/iptables的规则。手动添加这些规则。若有”reject-withicmp-host-prohibited”的规则,需将规则加到它的前面。注意修改配置文件的时候,不需要带iptables命令。直接为类似于:
-A OUTPUT-p tcp -m tcp --sport 54311 -j ACCEPT
或关闭防火墙(建议,因为端口太多,要加的例外很多)
serviceiptables stop
3. 在/etc/hosts文件中,确保一个host只对应一个IP,否则会出错(如同时将slave1指向 127.0.0.1和 192.168.225.66),可能导致数据无法从一个节点复制至另一节点。
4. 出现类似:
FATAL org.apache.hadoop.mapred.TaskTracker:Error running child : java.lang.OutOfMemoryError: Java heap space…
的异常,是因为堆内存不够。有以下几个地方可以考虑配置:
a. conf/hadoop-env.sh中,exportHADOOP_HEAPSIZE=1000这一行,默认为注释掉,堆大小为1000M,可以取消注释,将这个值调大一些(对于16G的内存,可以调至8G)。
b. conf/mapred-site.xml中,添加mapred.map.child.java.opts属性,手动指定JAVA堆的参数值为-Xmx2048m或更大。这个值调整map任务的堆大小。即:
<property>
<name>mapred.map.child.java.opts</name>
<value>-Xmx2048m</value>
</property>
c. conf/mapred-site.xml中,添加mapred.reduce.child.java.opts属性,手动指定JAVA堆的参数值为-Xmx2048m或更大。这个值调整reduce任务的堆大小。即:
<property>
<name>mapred.reduce.child.java.opts</name>
<value>-Xmx2048m</value>
</property>
注意调整这些值之后,要重启namenode。
5. 出现类似:java.io.IOException: File /user/root/pv_product_110124could only be replicated to 0 nodes, instead of 1…
的异常,首先确保hadoop临时文件夹中有足够的空间,空间不够会导致这个错误。
如果空间没问题,那就尝试把临时文件夹中dfs/data目录删除,然后重新格式化name node:
hadoopnamenode -format
注意:此命令会删除hdfs上的文件
6. 出现类似:java.io.IOException: Broken pipe…
的异常,检查你的程序吧,没准输出了不该输出的信息,如调试信息等。