Hadoop - Map/Reduce 通过理解org.apache.hadoop.mapreduce.Job类来学习hadoop的执行逻辑

2019-03-28 13:06|来源: 网络

在我的上篇文章“Hadoop - Map/Reduce 通过WordCount例子的变化来了解新版hadoop接口的变化”中(见http://www.linuxidc.com/Linux/2013-04/82868.htm),已经跟大家提到,在Hadoop新的版本中,使用org.apache.hadoop.mapreduce.Job类替代了JobClient类。现在,我想通过对于了解Job来学习hadoop的调用逻辑。

首先,我们来回顾一下,在wordcount例子中,main函数通过创建Job类,并给Job实例设置相应的值,最终调用waitForCompletion函数来执行Job。

    Job job = new Job(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);

Job类本身是继承自JobContextImpl,并实现了JobContext接口。JobContextImpl是JobContext接口的一个简单实现,给Job类中的相关方法提供了一系列的默认实现。
 
Job类本身提供的构造函数如下:

Job()
Job(Configuration)
Job(Configuration, String)
Job(Cluster)
Job(Cluster, Configuration)
Job(Cluster, JobStatus, Configuration)

在前3个构造函数的实现中,最终会由configuration生成新的cluster类,从而调用第5个构造函数,而第4和第6个构造函数也会调用第5个构造函数,因此,第5个构造函数是实际上Job类构造的实现。Cluster类提供了访问map/reduce cluster的一系列方法。而Configuration类提供了对于配置信息的访问方法。

除了上面列出的构造函数,Job类还提供了一系列对应的工厂方法:

getInstance()
getInstance(Configuration)
getInstance(Configuration, String)
getInstance(Cluster)
getInstance(Cluster, Configuration)
getInstance(Cluster, JobStatus, Configuration)

相关问答

更多
  • 你是否期望每个reducer能够在完全相同的映射数据上工作? 但至少“钥匙”应该是不同的,因为它决定了哪个减速器要去。 您可以在mapper中多次输出输出,并将其输出为密钥(其中$ i代表第i个缩减器,$ key是您的原始密钥)。 您需要添加一个“分区程序”以确保这些记录是基于$ i分布在还原器中的。 然后使用“GroupingComparator”按原始$ key对记录进行分组。 有可能做到这一点,但不是在一个MR中以微不足道的方式。 Are you expecting every reducer to ...
  • 它们被分离出来,因为这两个包都代表2个不同的API。 org.apache.hadoop.mapred是旧的API, org.apache.hadoop.mapreduce是新的。 这样做是为了让程序员以更方便,更简单和复杂的方式编写MapReduce作业。 您可能会发现此演示文稿很有用,其中详细讨论了不同之处。 希望这回答你的问题。 They are separated out because both of these packages represent 2 different APIs. org.a ...
  • 您可以通过在hdfs-site.xml中将以下属性设置为false来禁用hdfs权限 dfs.permissions.enabled false 将此属性设置为false后,hdfs需要重新启动。 另外,这个hdfs_permissions_guide页面建议使用net group来管理组。 我想你可以用它来在nikhilbarar组中添加hive用户: see-net-group-usage。 you ...
  • 它发生的默认选项取代了我的本地配置(我仍然不明白为什么)。 export HADOOP_CLIENT_OPTS="-Xmx1024m" 解决了这个问题。 It happened that the default options were superseding my local configuration (I still don't understand why). export HADOOP_CLIENT_OPTS="-Xmx1024m" solved the problem.
  • 这是除了最佳之外的一切,因为地图输出必须始终复制到另一台服务器。 但您可以简单地修改服务器上的mapred-site.xml。 mapred.tasktracker.map.tasks.maximum 4 The maximum number of map tasks that will be run simultaneously by a task tracker.
  • 你需要打开jobtracker( http://localhost:50030/jobtracker.jsp ) - >完成的工作:job_201310311657_0006 - >它会告诉你工作细节。 单击“失败的地图”尝试。 (失败地图下的数字) - >单击taskId - >在那里记录您可以看到完整的堆栈跟踪。 搞清楚了。 给出了启动地图任务的作业,因此i / p文件可能存在一些问题。(猜测) 粘贴作业日志以获取更多帮助。 You need to open jobtracker(http://loca ...
  • 仅限地图的作业仍然需要指定的输出位置。 正如错误所述,你没有指定这个。 我认为你的意思是说你的工作完全没有产出。 Hadoop仍然希望你指定一个输出位置,尽管不需要写任何东西。 你想org.apache.hadoop.mapreduce.lib.output.NullOutputFormat而不是org.apache.hadoop.mapred.lib.NullOutputFormat ,这是第二个错误表明它是微妙的。 Map-only jobs still need an output location ...
  • 通常查看ResourceManager的日志可能会有所帮助。 在其日志中查找任何异常。 如果不存在异常,请查看NodeManager日志以获取任何异常。 告知这些可能的例外情况。 usually looking at ResourceManager's log can be helpful. look for any exception in its log. if no exception exists, look at NodeManager logs for any exception. inform ...
  • 我在以下位置找到了JAR: $HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar I found the JARs in the following locations: $HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar $HADOOP ...
  • mapper的输出键和值类型应该是reducer的输入类型,因此在你的情况下,reducer必须继承自 Reducer setOutputKeyClass和setOutputValueClass设置作业输出的类型,即map和reduce。 如果要为映射器指定其他类型,则应使用方法setMapOutputKeyClass和setMapOutputValueClass 。 作为旁注,当您不希望输出中的真值时,为什么要从 ...