Hadoop问题汇总

1. mapreduce内存不足

<property>
  <name>mapred.map.child.java.opts</name>
  <value>$CHILD_MAP_OPTS</value>
</property>
<property>
  <name>mapred.reduce.child.java.opts</name>
  <value>$CHILD_REDUCE_OPTS</value>
</property>

instead of 
<property>
  <name>mapred.child.java.opts</name>
  <value>$CHILD_OPTS</value>
</property>

2. 指定Reduce任务的个数

可以在执行脚本中添加参数来实现:

 hadoop jar  LogAnalysis.jar loganalysis -D mapred.reduce.tasks=2  $inputPath $outputPath

3. Hadoop集群中磁盘空间不足

遇到这种情况,可以减少HDFS中备份的数量,在hdfs-site.xml中修改,

<property>
<name>dfs.replication</name>
<value>1</value>
</property>

这样的话,数据就只保存一份了,重要的数据话出问题就没法自动恢复了,所以还是要确保

磁盘空间充足,默认情况下这个参数是3.

hadoop fsck -locations命令可以查看数据备份情况。

4.hadoop命令集合

hadoop fs –put test.txt /user/sunlightcs
将本地文件系统的test.txt复制到HDFS文件系统的/user/sunlightcs目录下


hadoop fs –get /user/sunlightcs/test.txt .
将HDFS中的test.txt复制到本地文件系统中,与-put命令相反

hadoop fs –cat /user/sunlightcs/test.txt
查看HDFS文件系统里test.txt的内容


hadoop fs –tail /user/sunlightcs/test.txt
查看最后1KB的内容


hadoop fs –copyFromLocal test.txt /user/sunlightcs/test.txt
从本地文件系统复制文件到HDFS文件系统,等同于put命令

hadoop fs –copyToLocal /user/sunlightcs/test.txt test.txt
从HDFS文件系统复制文件到本地文件系统,等同于get命令

 hadoop fs –du PATH
显示该目录中每个文件或目录的大小

hadoop fs –dus PATH
类似于du,PATH为目录时,会显示该目录的总大小

5. 在mapper中获取当前正在处理的HDFS文件名/HDFS目录名

默认情况下,Hadoop是按行来对数据进行处理的,由于对每一行数据,map()函数会被调用一次,我们有时可以根据文件名/目录名来获取一些信息,从而把它们输出,例如,目录名中包含了日期,则我们可以取出来并输出到Reducer。

在map()函数中,我们可以这样取文件名:

     InputSplit inputSplit = context.getInputSplit();
     String fileName = ((FileSplit) inputSplit).getName();

假设当前正在处理的HDFS文件路径为:/user/hadoop/abc/myFile.txt,则上面的 fileName 取到的是“myFile.txt”这样的字符串。

但如果要获取其目录名“abc”,则可以这样做:

     InputSplit inputSplit = context.getInputSplit();
     String dirName = ((FileSplit) inputSplit).getPath().getParent().getName();

posted @ 2013-03-19 13:13  cstar(小乐)  阅读(347)  评论(0编辑  收藏  举报