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

Hadoop 生态之 MapReduce 及 Hive 简介

发布时间:2019-11-01 04:39:09 所属栏目:建站 来源:李一帆
导读:1.计算框架 Hadoop 是一个计算框架,目前大型数据计算框架常用的大致有五种: 仅批处理框架:Apache hadoop. 仅流处理框架:Apache Storm、Apache Samza. 混合框架:Apache Spark、Apache Flink. 这其中名气最大、使用最广的当属 Hadoop 和 Spark。 虽然两
副标题[/!--empirenews.page--]

Hadoop 生态之 MapReduce 及 Hive 简介

 1.计算框架

Hadoop 是一个计算框架,目前大型数据计算框架常用的大致有五种:

  • 仅批处理框架:Apache hadoop.
  • 仅流处理框架:Apache Storm、Apache Samza.
  • 混合框架:Apache Spark、Apache Flink.

这其中名气最大、使用最广的当属 Hadoop 和 Spark。

虽然两者都被称为大数据框架,但实际层级不同。Hadoop 是一个分布式数据基础设施,包括计算框架 MapReduce、分布式文件系统 HDFS、YARN 等。而Spark 是专门用来对分布式存储的大数据的处理工具,并不会进行数据存储,更像是 MapReduce 的替代。

在使用场景上,Hadoop 主要用于离线数据计算,Spark更适用于需要精准实时的场景。本文主要介绍 Hadoop,对 Spark 不做讨论。

本篇文章可承接知识库 Hadoop之HDFS (https://gitlab.aihaisi.com/docs/docs/issues/516) ,介绍下 Hadoop 另一重要组件 MapReduce,以及 Hive。

2. MapReduce

2.1 MapReduce 是什么

一个基于 Java 的并行分布式计算框架。

前文有提到 HDFS 提供了基于主从结构的分布式文件系统,基于此存储服务支持,MapReduce 可以实现任务的分发、跟踪、执行等工作,并收集结果。

2.2 MapReduce 组成

MapReduce 主要思想讲的通俗一点就是将一个大的计算拆分成 Map(映射)和 Reduce(化简)。说到这里,其实 JAVA8 在引入 Lambda 后,也有 map 和 reduce 方法。下面是一段 Java 中的用法:

  1. List<Integer> nums = Arrays.asList(1, 2, 3); 
  2. List<Integer> doubleNums = nums.stream().map(number -> number * 2).collect(Collectors.toList()); 
  3. 结果:[2,4,6] 
  4. Optional<Integer> sum = nums.stream().reduce(Integer::sum); 
  5. 结果:[6] 

代码很简单,map 负责归类,reduce 负责计算。而 Hadoop 中的 MapReduce 也有异曲同工之处。

下面结合官方案例 WordCount 进行分析:

  1. public class WordCount { 
  2.  // Mapper泛型类,4个参数分别代表输入键、值,输出键、值类型 
  3.  public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ 
  4.  private final static IntWritable one = new IntWritable(1); 
  5.  private Text word = new Text(); 
  6.  public void map(Object key, Text value, Context context) throws IOException, InterruptedException { 
  7.  // 字符解析 
  8.  StringTokenizer itr = new StringTokenizer(value.toString()); 
  9.  while (itr.hasMoreTokens()) { 
  10.  // nextToken():返回从当前位置到下一个分隔符的字符串 
  11.  word.set(itr.nextToken()); 
  12.  context.write(word, one); 
  13.  } 
  14.  } 
  15.  } 
  16.   
  17.  // Reducer同样也是四个参数 
  18.  public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { 
  19.  private IntWritable result = new IntWritable(); 
  20.  public void reduce(Text key, Iterable<IntWritable> values,Context context) throws  
  21.  IOException,InterruptedException { 
  22.  int sum = 0; 
  23.  // 循环values,并记录“单词”个数 
  24.  for (IntWritable val : values) { 
  25.  sum += val.get(); 
  26.  } 
  27.  result.set(sum); 
  28.  context.write(key, result); 
  29.  } 
  30.  } 

在这段代码中,不难看出程序核心是 map 函数和 reduce 函数。是否 MapReduce 就是由这两者组成的?接着往下看。

2.3 Map 和 Reduce

2.3.1 Map

在 WordCount 案例中,明显看到 map 函数的输入主要是一个

Context 在这里暂时性忽略,其是 Mapper 类的内部抽象类,一般计算中不会用到,可以先当做“上下文”理解。

map 函数计算过程是: 将这行文本中的单词提取出来,针对每个单词输出一个

2.3.2 Reduce

接着就来看看 reduce ,这里输入参数 Values 就是上面提到的由很多个 1 组成的集合,而 Key 就是具体“单词” word。

它的计算过程是: 将集合里的1求和,再将单词(word)与这个和(sum)组成一个

假设有两个数据块的文本数据需要进行词频统计,MapReduce 计算过程如下图所示:

Hadoop 生态之 MapReduce 及 Hive 简介

到这都很容易理解,毕竟只是个 HelloWorld 的例子~,但整个MapReduce过程中最关键的部分其实是在 map 到 reduce 之间。

(编辑:核心网)

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

热点阅读