分享

eclipse中运行wordcount任务后在hadoop2.X监控页面没有显示该job的问题及解决方案

本帖最后由 howtodown 于 2014-4-29 12:17 编辑
问题导读:
1.如何判断程序是运行在本地还是在集群?
2.eclipse运行程序需要注意什么问题?





eclipse中运行wordcount任务后在hadoop监控页面没有显示该job,并且查看集群资源的使用情况,集群计算节点cpu和内存基本没用,而装有eclipse的电脑cpu和内存使用量却达到了100%,wordcount程序是在自己电脑的eclipse里面写的,请问这是怎么回事,难道mapreduce程序没有在集群上跑,而在自己电脑上跑吗?谢谢!

wordcount代码如下:

  1. import java.io.IOException;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.StringTokenizer;
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.fs.Path;
  7. import org.apache.hadoop.io.IntWritable;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapreduce.Job;
  10. import org.apache.hadoop.mapreduce.Mapper;
  11. import org.apache.hadoop.mapreduce.Reducer;
  12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  13. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  14. import org.apache.hadoop.util.GenericOptionsParser;
  15. public class WordCount {
  16.   public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{
  17.     private final static IntWritable one = new IntWritable(1);
  18.     private Text word = new Text();
  19.     public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  20.       StringTokenizer itr = new StringTokenizer(value.toString());
  21.       System.out.println(value.toString());
  22.       while (itr.hasMoreTokens()) {
  23.         word.set(itr.nextToken());//获取下个字段的值并写入文件
  24.         context.write( word, one );
  25. //        System.out.println("itr.hasMoreTokens(): "+itr.hasMoreTokens()+" itr.nextToken(): "+itr.nextToken());
  26.               }
  27.      }
  28.   }
  29.   public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
  30.     private IntWritable result = new IntWritable();
  31.     public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  32.       int sum = 0;
  33.       for (IntWritable val : values) {
  34.               sum += val.get();
  35.               }
  36.       result.set(sum);
  37.       context.write(key, result);
  38.     }
  39.   }
  40.   public static void main(String[] args) throws Exception {
  41. //    System.setProperty("hadoop.home.dir", "F:/ hadoop/hadoop -2.3.0");
  42.     Configuration conf = new Configuration();
  43. //         conf.set("mapred.job.tracker", "192.168.1.181:9001");
  44. //         conf.set("yarn.resourcemanager.address", "192.168.1.181:9001");
  45.     String[] otherArgs = new String[2];
  46.     otherArgs[0] = "hdfs://192.168.1.181/data/sortin1" ;
  47.     otherArgs[1] = "hdfs://192.168.1.181:9000/data/meanout/";
  48.     Job job = new Job(conf, "word count");
  49.     job.setJarByClass(WordCount. class);
  50.    
  51. //    job.setMaxMapAttempts(10);//设置最大试图产生底map数量,该命令不一定会设置该任务运行过车中的map数量
  52. //    job.setNumReduceTasks(5);//设置reduce数量,即最后生成文件的数量
  53. //    job.monitorAndPrintJob();
  54.     job.setMapperClass(TokenizerMapper .class);//执行用户自定义map函数
  55.     job.setCombinerClass(IntSumReducer. class);//对用户自定义map函数的数据处理结果进行合并,可以减少带宽消耗
  56.     job.setReducerClass(IntSumReducer. class);//执行用户自定义reduce函数
  57.    
  58.     job.setOutputKeyClass(Text. class);
  59.     job.setOutputValueClass(IntWritable. class);
  60.     System.out.println("Job start!");
  61.     FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  62.    
  63.     FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
  64.    
  65.     if(job.waitForCompletion(true)){
  66.             System.out.println("ok!");
  67.     }else{
  68.             System.out.println("error!");
  69.             System.exit(0);
  70.      }
  71. //    System.exit(job.waitForCompletion(true) ? 0 : 1);
  72. //    job.waitForCompletion(true);
  73.   }
  74. }
复制代码

2 hadoop版本为hadoop2.3.0,使用yarn框架

mapred-site.xml如下:

  1. <configuration>
  2.    <property>
  3.     <name>mapreduce.framework.name</name>
  4.     <value>yarn</value>
  5.    </property>
  6.    <property>
  7.       <name>mapreduce.jobtracker.address</name>
  8.       <value>192.168.1.181:9001</value>
  9.    </property>
  10.    <property>
  11.         <name>mapreduce.jobhistory.address</name>
  12.         <value>192.168.1.181:10020</value>
  13.    </property>
  14.    <property>
  15.         <name>mapreduce.jobhistory.webapp.address</name>
  16.         <value>192.168.1.181:19888</value>
  17.    </property>
  18.    <property>
  19.      <name>mapred.local.dir</name>
  20.      <value>file:///data1/hdfs1/mapred/local</value>
  21.    </property>
  22.    <property>
  23.      <name>mapred.system.dir</name>
  24.      <value>file:///data1/hdfs1/mapred/system</value>
  25.    </property>
  26. </configuration>
复制代码

yarn-site.xml如下:

  1. <configuration>
  2. <property>
  3.   <name>yarn.resourcemanager.hostname</name>
  4.   <value>192.168.1.181</value>
  5. </property>
  6. <property>
  7. <name>yarn.resourcemanager.address</name>
  8. <value>192.168.1.181:8032</value>
  9. </property>
  10. <property>
  11. <name>yarn.resourcemanager.scheduler.address</name>
  12. <value>192.168.1.181:8030</value>
  13. </property>
  14. <property>
  15. <name>yarn.resourcemanager.resource-tracker.address</name>
  16. <value>192.168.1.181:8031</value>
  17. </property>
  18. <property>
  19. <name>yarn.resourcemanager.admin.address</name>
  20. <value>192.168.1.181:8033</value>
  21. </property>
  22. <property>
  23. <name>yarn.resourcemanager.webapp.address</name>
  24. <value>192.168.1.181:8088</value>
  25. </property>
  26. <property>
  27. <name>yarn.nodemanager.aux-services</name>
  28. <value>mapreduce_shuffle</value>
  29. </property>
  30. <property>
  31.    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  32.    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  33. </property>
  34. </configuration>
复制代码




解决方案:
研究对比后发现,按上面代码直接运行是运行在本地的,就是安装有eclipse的机器,我在这台机器上也部署了和集群一样的hadoop配置,因为当时用eclipse连接部署hadoop的mapreduce就在本地搭建了一个相同的环境,本地环境搭建好后mapreduce可以正常运行了,但这种运行是在本地运行的,要真正在集群中运行,在本地是不需要搭建和集群一样的hadoop配置的。而是要在java代码中添加hadoop集群配置:


conf.set("fs.default.name", "hdfs://192.168.1.181:9000");   
    conf.set("hadoop.job.user","hadoop");   
    conf.set("mapreduce.framework.name","yarn");
//    conf.set("mapred.job.tracker","192.168.1.187:9001"); 用下面的设置而不用该设置,该设置是旧版本的设置,自己用的是hadoop2.3.0,查看官方配置文档后发现里面用的是下面mapreduce.jobtracker.address的配置地址
    conf.set("mapreduce.jobtracker.address","192.168.1.187:9001");
     conf.set("yarn.resourcemanager.hostname", "192.168.1.187");
     conf.set("yarn.resourcemanager.admin.address", "192.168.1.187:8033");
     conf.set("yarn.resourcemanager.address", "192.168.1.187:8032");
     conf.set("yarn.resourcemanager.resource-tracker.address", "192.168.1.187:8036");
     conf.set("yarn.resourcemanager.scheduler.address", "192.168.1.187:8030");









本帖被以下淘专辑推荐:

已有(4)人评论

跳转到指定楼层
chuyuan_zhou 发表于 2014-12-22 14:10:47
飘过,关注哈!
回复

使用道具 举报

lancijk 发表于 2015-7-23 11:00:39
回复

使用道具 举报

zxsz4084 发表于 2015-11-27 00:18:13
求版主帮忙啊。我照着弄了 没有反应啊 一直挂起啊,结束不了啊。。。。按照我服务器上配置文件的端口号配的。
System.setProperty("HADOOP_USER_NAME", "hadoop");
   
    //conf.set("mapreduce.job.queuename", "test");
    //conf.set("fs.default.name", "hdfs://n1:8020");   
    conf.set("fs.defaultFS", "hdfs://n1:8020");
    conf.set("hadoop.job.user","hadoop");
   
    conf.set("mapreduce.framework.name","yarn");
    conf.set("mapreduce.jobtracker.address","n1:9001");
   
    conf.set("yarn.resourcemanager.hostname", "n1");
    conf.set("yarn.resourcemanager.scheduler.address", "n1:8030");
    conf.set("yarn.resourcemanager.resource-tracker.address", "n1:8031");
    conf.set("yarn.resourcemanager.address", "n1:8032"); //
    conf.set("yarn.resourcemanager.admin.address", "n1:8033");

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条