知识点
相关文章
更多最近更新
更多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 -
我无法在独立模式下配置hadoop上执行map-reduce作业(I cannot execute a map-reduce job on hadoop configured in standalone mode)[2022-09-17]
它发生的默认选项取代了我的本地配置(我仍然不明白为什么)。 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必须继承自 ReducersetOutputKeyClass和setOutputValueClass设置作业输出的类型,即map和reduce。 如果要为映射器指定其他类型,则应使用方法setMapOutputKeyClass和setMapOutputValueClass 。 作为旁注,当您不希望输出中的真值时,为什么要从 ...