CentOS的Hadoop集群配置(二)

参考网站:http://blog.csdn.net/inte_sleeper/article/details/6569990

下面的教程把它们合并至multi-nodecluster。

 

1.    合并single-nodemulti-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…

的异常,检查你的程序吧,没准输出了不该输出的信息,如调试信息等。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值