MapReduce 是一种编程模子,"Map(映射)"和"Reduce(归约)",是它们的首要头脑,我们通过 Map 函数来漫衍式处理赏罚输入数据,然后通过 Reduce 汇总功效并输出。我们编写一个 MapReduce 措施的一样平常步调是:
- 编写 map 措施。
- 编写 reduce 措施。
- 编写措施驱动。
本章节的方针
本节中我们将行使 MapReduce 框架来编写一个简朴的例子,这个例子是用来统计 HDFS 指定目次下的文件中每个字符呈现的次数并将统计功效输出到 HDFS 的指定目次中。点击此处获取本章节源代码。
Map 措施
我们担任 Mapper 类并重写了其 map 要领。Map 阶段输入的数据是从 hdfs 中拿到的原数据,输入的 key 为某一行起始位置相对付文件起始位置的偏移量,value 为该行的文本。输出的内容同样也为键-值对,这个时辰输出数据的键值对的范例可以本身指定,在本例中 key 是 Text 范例的,value 是 LongWritable 范例的。输出的功效将会被发送到 reduce 函数进一步处理赏罚。
- public class CharCountMapper extends Mapper< LongWritable, Text, Text, LongWritable> {
- @Override
- protected void map(LongWritable key, Text value, Context context)
- throws IOException, InterruptedException {
- // 将这一行文本转为字符数组
- char[] chars = value.toString().toCharArray();
- for (char c : chars) {
- // 某个字符呈现一次,便输出其呈现 1 次。
- context.write(new Text(c + ""), new LongWritable(1));
- }
- }
- }
Reduce 措施
我们担任 Reducer 类并重写了其 reduce 要领。在本例中 Reduce 阶段的输入是 Map 阶段的输出,输出的功效可以作为最终的输出功效。信托你也留意到了,reduce 要领的第二个参数是一个 Iterable,MapReduce 会将 map 阶段中沟通字符的输出汇总到一路作为 reduce 的输入。
- public class CharCountReducer extends Reducer< Text, LongWritable, Text, LongWritable> {
- @Override
- protected void reduce(Text key, Iterable< LongWritable> values, Context context)
- throws IOException, InterruptedException {
- long count = 0;
- for (LongWritable value : values) {
- count += value.get();
- }
- context.write(key, new LongWritable(count));
- }
- }
驱动措施
到今朝为止,我们已经有了 map 措施和 reduce 措施,我们还必要一个驱动措施来运行整个功课。可以看到我们在这里初始化了一个 Job 工具。Job 工具指定整个 MapReduce 功课的执行类型。我们用它来节制整个功课的运作,在这里我们指定了 jar 包位置尚有我们的 Map 措施、Reduce 措施、Map 措施的输出范例、整个功课的输出范例尚有输入输出文件的地点。
- public class CharCountDriver {
- public static void main(String[] args) throws Exception {
- Configuration configuration = new Configuration();
- Job job = Job.getInstance(configuration);
- // Hadoop 会自动按照驱动措施的类路径来扫描该功课的 Jar 包。
- job.setJarByClass(cn.itweknow.mr.CharCountDriver.class);
- // 指定 mapper
- job.setMapperClass(CharCountMapper.class);
- // 指定 reducer
- job.setReducerClass(CharCountReducer.class);
- // map 措施的输出键-值对范例
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(LongWritable.class);
- // 输出键-值对范例
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(LongWritable.class);
- // 输入文件的路径
- FileInputFormat.setInputPaths(job, new Path(args[0]));
- // 输入文件路径
- FileOutputFormat.setOutputPath(job, new Path(args[1]));
- boolean res = job.waitForCompletion(true);
- System.exit(res?0:1);
- }
- }
执行 MapReduce 功课 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|