加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

从HDFS和MapReduce两方面了解Hadoop

发布时间:2019-03-21 23:52:20 所属栏目:教程 来源:佚名
导读:简介 Hadoop 是一个能够对大量数据进行分布式处理的软件框架,框架最核心的设计就是:HDFS 和 MapReduce。HDFS 为海量的数据提供了存储,而 MapReduce 则为海量的数据提供了计算。这篇文章就主要从 HDFS 和 MapReuce 两个大的方面展开对 Hadoop 讲解,当然

MapReduce 是一种编程模型,"Map(映射)"和"Reduce(归约)",是它们的主要思想,我们通过 Map 函数来分布式处理输入数据,然后通过 Reduce 汇总结果并输出。我们编写一个 MapReduce 程序的一般步骤是:

  1. 编写 map 程序。
  2. 编写 reduce 程序。
  3. 编写程序驱动。

本章节的目标

本节中我们将使用 MapReduce 框架来编写一个简单的例子,这个例子是用来统计 HDFS 指定目录下的文件中每个字符出现的次数并将统计结果输出到 HDFS 的指定目录中。点击此处获取本章节源代码。

Map 程序

我们继承 Mapper 类并重写了其 map 方法。Map 阶段输入的数据是从 hdfs 中拿到的原数据,输入的 key 为某一行起始位置相对于文件起始位置的偏移量,value 为该行的文本。​​输出的内容同样也为键-值对,这个时候输出数据的键值对的类型可以自己指定,在本例中 key 是 Text 类型的,value 是 LongWritable 类型的。输出的结果将会被发送到 reduce 函数进一步处理。

  • 清单 14. Map 程序
  1. public class CharCountMapper extends Mapper< LongWritable, Text, Text, LongWritable> { 
  2.   @Override 
  3.   protected void map(LongWritable key, Text value, Context context) 
  4.   throws IOException, InterruptedException { 
  5.   // 将这一行文本转为字符数组 
  6.   char[] chars = value.toString().toCharArray(); 
  7.   for (char c : chars) { 
  8.   // 某个字符出现一次,便输出其出现 1 次。 
  9.   context.write(new Text(c + ""), new LongWritable(1)); 
  10.   } 
  11.   } 
  12.   } 

Reduce 程序

我们继承 Reducer 类并重写了其 reduce 方法。在本例中 Reduce 阶段的输入是 Map 阶段的输出,输出的结果可以作为最终的输出结果。相信你也注意到了,reduce 方法的第二个参数是一个 Iterable,MapReduce 会将 map 阶段中相同字符的输出汇总到一起作为 reduce 的输入。

  • 清单 15. Reduce 程序
  1. public class CharCountReducer extends Reducer< Text, LongWritable, Text, LongWritable> { 
  2.     @Override 
  3.     protected void reduce(Text key, Iterable< LongWritable> values, Context context) 
  4.             throws IOException, InterruptedException { 
  5.         long count = 0; 
  6.         for (LongWritable value : values) { 
  7.             count += value.get(); 
  8.         } 
  9.         context.write(key, new LongWritable(count)); 
  10.     } 

驱动程序

到目前为止,我们已经有了 map 程序和 reduce 程序,我们还需要一个驱动程序来运行整个作业。可以看到我们在这里初始化了一个 Job 对象。Job 对象指定整个 MapReduce 作业的执行规范。我们用它来控制整个作业的运作,在这里我们指定了 jar 包位置还有我们的 Map 程序、Reduce 程序、Map 程序的输出类型、整个作业的输出类型还有输入输出文件的地址。

  • 清单 16. 驱动程序
  1. public class CharCountDriver { 
  2.           public static void main(String[] args) throws Exception { 
  3.           Configuration configuration = new Configuration(); 
  4.           Job job = Job.getInstance(configuration); 
  5.           // Hadoop 会自动根据驱动程序的类路径来扫描该作业的 Jar 包。 
  6.           job.setJarByClass(cn.itweknow.mr.CharCountDriver.class); 
  7.           // 指定 mapper 
  8.           job.setMapperClass(CharCountMapper.class); 
  9.           // 指定 reducer 
  10.           job.setReducerClass(CharCountReducer.class); 
  11.           // map 程序的输出键-值对类型 
  12.           job.setMapOutputKeyClass(Text.class); 
  13.           job.setMapOutputValueClass(LongWritable.class); 
  14.           // 输出键-值对类型 
  15.           job.setOutputKeyClass(Text.class); 
  16.           job.setOutputValueClass(LongWritable.class); 
  17.           // 输入文件的路径 
  18.           FileInputFormat.setInputPaths(job, new Path(args[0])); 
  19.           // 输入文件路径 
  20.           FileOutputFormat.setOutputPath(job, new Path(args[1])); 
  21.           boolean res = job.waitForCompletion(true); 
  22.           System.exit(res?0:1); 
  23.           } 
  24.           } 

执行 MapReduce 作业

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读