当前位置: > Linux集群 > Hadoop >

MapReduce提交作业常见问题

时间:2015-05-11 03:17来源:iteye.com 作者:cyu06206

1.从HDFS上传下载文件到
第一种错误:

 

  1. <span style="font-size: medium;">Exception inthread"main"java.lang.IllegalArgumentException:   
  2.   
  3. Wrong FS: hdfs://192.168.1.11:9000/usr/yujing/wordcount,   
  4.   
  5. expected: hdfs://master:9000</span>  

 
这个很多人都遇到过,不管是在ubuntu还是windows系统中,在连接集群的时候,不能直接使用hdfs://192.168.1.11:9000,要在hosts文件中添加192.168.1.11的映射,有人可能不知道windows下hosts文件在哪?C:\Windows\System32\drivers\etc\hosts(这个是隐藏文件你可以显示出来),在host文件中添加192.168.1.11 master就可以了。
第二种错误:

  1. <span style="font-size: medium;">org.apache.hadoop.ipc.RemoteException:   
  2.   
  3. org.apache.hadoop.hdfs.server.namenode.SafeModeException:   
  4.   
  5. Cannot create file/usr/yujing/wordcount. Name node is in   
  6.   
  7. safe mode.  
  8. The ratio of reported blocks 0.0000 has not reached the   
  9.   
  10. threshold 0.9990. Safe mode will be turned off   
  11.   
  12. automatically.</span>  

 
这个错误出现的原因是client对集群中HDFS的操作没有权限
解决办法:
(1)在代码中加上一行代码
conf.set("dfs.permissions","false");
(2)在集群配置文件hdfs-site.xml
property>
     <name>dfs.permissions</name>
    <value>false</value>
</property>
然后重启
1.对于hadoop提供的wordcount例子
第一种错误:

 

  1. <span style="font-size: medium;">12/02/10 14:24:59 INFO ipc.Client: Retrying connect to   
  2.   
  3. server: localhost/127.0.0.1:9000. Already tried 0 time(s).  
  4. 12/02/10 14:25:01 INFO ipc.Client: Retrying connect to  </span>  

 
当你在代码中明明写的是集群的IP,但是它连接就是localhost,这是因为mapreduce默认连接的是localhost
解决办法:
conf.set("fs.default.name", "hdfs://master:9000");
conf.set("hadoop.job.user", "yujing");
conf.set("mapred.job.tracker", "master:9001");
这样JobClient就会把Job任务提交到hadoop集群中
第二种错误:

  1. <span style="font-size: medium;">Exception in thread "main"   
  2.   
  3. org.apache.hadoop.mapreduce.lib.input.InvalidInputException  
  4.   
  5. : Input path does not exist:   
  6.   
  7. hdfs://master:9000/user/yujing/D:/qq.txt</span>  

 
这种错误是因为向集群中提交job任务是文件的输入路径必须要是HDFS上的文件路径,输出路径也要是HDFS上的文件
第三种错误:

  1. <span style="font-size: medium;">2/02/10 14:52:36 WARN mapred.JobClient: No job jar file   
  2.   
  3. set.  User classes may not be found. See JobConf(Class) or   
  4.   
  5. JobConf#setJar(String).  
  6. 12/02/10 14:52:36 INFO mapred.JobClient: Cleaning up the   
  7.   
  8. staging area hdfs://master:9000/tmp/hadoop-  
  9.   
  10. hadoop/mapred/staging/yujing/.staging/job_201202091335_0293</span>  

 
以上的错误是由于mapreduce的输出路径已存在,必须先删除掉那个文件
正确的运行结果:

  1. <span style="font-size: medium;">12/02/10 14:59:35 INFO input.FileInputFormat: Total input   
  2.   
  3. paths to process : 1  
  4. 12/02/10 14:59:35 INFO mapred.JobClient: Running job:   
  5.   
  6. job_201202091335_0299  
  7. 12/02/10 14:59:36 INFO mapred.JobClient:  map 0% reduce 0%  
  8. 12/02/10 14:59:48 INFO mapred.JobClient:  map 100% reduce   
  9.   
  10. 0%  
  11. 12/02/10 15:00:04 INFO mapred.JobClient:  map 100% reduce   
  12.   
  13. 100%  
  14. 12/02/10 15:00:09 INFO mapred.JobClient: Job complete:   
  15.   
  16. job_201202091335_0299  
  17. 12/02/10 15:00:09 INFO mapred.JobClient: Counters: 25</span>  

 
2.自己写的mapReduce程序
第一种错误:

  1. <span style="font-size: medium;">java.lang.RuntimeException:   
  2.   
  3. java.lang.ClassNotFoundException: cn.hadoop.InvertedIndex  
  4.   
  5. $InvertedIndexMapper  
  6.     at org.apache.hadoop.conf.Configuration.getClass  
  7.   
  8. (Configuration.java:866)  
  9.     at   
  10.   
  11. org.apache.hadoop.mapreduce.JobContext.getMapperClass  
  12.   
  13. (JobContext.java:195)</span>  

 
第一种解决方法:
这是由于及集群中没有我们提交的jar包,所以namenode不知道怎么执行我们的job任务,所以就会报空指针异常错误,所以要自己打jar提交给集群。
解决方法: 所以先给自己的程序打成jar包,然后放到工程的根目录下,然后在代码中添加JobConf conf=new JobConf
();conf.setJar("pr.jar");这样就可以了,这个错误困扰了我们很久。
第二种解决方法:
使用eclipse插件解决,有很多人刚刚开始的时候使用插件老是会出不来想要的结果,这个可能和eclipse或者是插件包的版本有关,有的版本的eclipse不兼容hadoop插件,还有就是hadoop-eclipse-plugin-0.20.203.0.jar的插件里面少了一些包,要自己进行手动修改,这个网上又怎么修改的方法,关于在eclipse安装插件就是要多试试就可以了,当插件完成后,然后点击run hadoop,插件内部会打包你的程序提交到集群上。


第三种解决方法:
自己在程序中打包自己的mapreduce程序,然后提交job任务,这方面这部分代码在eclipse插件中也是实现了的,我们这里就是要用代码实现插件的功能。
第二种错误:

  1. <span style="font-size: medium;">2/02/10 14:59:35 INFO input.FileInputFormat: Total input   
  2.   
  3. paths to process : 1  
  4. 12/02/10 14:59:35 INFO mapred.JobClient: Running job:   
  5.   
  6. job_201202091335_0299  
  7. 12/02/10 14:59:36 INFO mapred.JobClient:  map 0% reduce 0%  
  8. 12/02/10 14:59:48 INFO mapred.JobClient:  map 100% reduce   
  9.   
  10. 0%</span>  

 
这种错误出现的原因是mapreduce默认的reduce个数是1个,所以如果当map的个数很大时,reduce过程迟迟不会进行,解决方法是在代码中添加job.setNumReduceTasks(4);设置reduced的个数。

(责任编辑:IT)
------分隔线----------------------------