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();