MapReduce分布式计算框架

1、MapReduce分布式计算框架

        本章介绍了Hadoop的MapReduce分布式计算框架的基本概念、编程规范和词频统计实战等内容。从存储的大数据中快速抽取信息,进一步进行数据价值的挖掘,需要用到大数据的分布式计算技术的支持。Hadoop支持多种语言进行MapReduce编程,包括java、Python和C++等。本章从实战的角度出发,使用java编程语言通过一个词频统计案例的编码实现、编译、运行过程介绍了MapReduce编程。该程序的主要任务需求是:计算出给定文件中每个单词的出现频次,给定文件中单词和频数之间是用空格分割的,要求输出结果按照单词的字母进行排序,每个单词和其频数占一行形成结构化的统计分析结果。

        在单机的运算环境下,如果输入文件是GB级别以上的,那么统计该文件中单词出现的频数非常耗时。在搭建好的Hadoop分布式大数据平台环境下,使用MapReduce,把计算任务分发到多个节点上并行运算,可以提高词频统计的效率

2、MapReduce简介

        MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。

        Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。

Reduce负责“合”,即对map阶段的结果进行全局汇总。

MapReduce运行在yarn集群。(资源调度的平台)

        Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。

        MapReduce 作业通过将输入的数据集拆分为独立的块,这些块由 map 以并行的方式处理,框架对 map 的输出进行排序,然后输入到 reduce 中。MapReduce 框架专门用于 <key,value> 键值对处理,它将作业的输入视为一组 <key,value> 对,并生成一组 <key,value> 对作为输出。输出和输出的 key 和 value 都必须实现Writable 接口(实现序列化)

3、wordcount经典案例介绍

这里以词频统计为例进行说明,MapReduce 处理的流程如下

Mrappmaster   maptask  reducetask

这里假设由一个文本,文本中的内容为:

Deer Bear River

Car Car River

Deer Car Bear

这里单词与单词之间以空格隔开。现在要对单词进行统计,有如下几个阶段。

input : 读取文本文件;

splitting (拆分): 将文件按照行进行拆分,此时得到的 K1 行数,V1 表示对应行的文本内容;

mapping(映射):并行将每一行按照空格进行拆分,拆分得到的 List(K2,V2),其中 K2 代表每一个单词,由于是做词频统计,所以 V2 的值为 1,代表出现 1 次;

shuffling(洗牌):由于 Mapping 操作可能是在不同的机器上并行处理的,所以需要通过 shuffling 将相同 key 值的数据分发到同一个节点上去合并,这样才能统计出最终的结果,此时得到 K2 为每一个单词,List(V2) 为可迭代集合(注意每个List中的数据不一样),V2 就是 Mapping 中的 V2;

Reducing(化简):这里的案例是统计单词出现的总次数,所以 Reducing 对 List(V2) 进行归约求和操作(求List中数据的总和?),最终输出;

MapReduce 编程模型中 splitting 和 shuffing 操作都是由框架实现的,需要我们自己编程实现的只有 mapping 和 reducing,这也就是 MapReduce 这个称呼的来源。

4、MapReduce进程介绍

一个完整的mapreduce程序在分布式运行时有三类实例进程:

1)MrAppMaster:负责整个程序的过程调度及状态协调

2)MapTask:负责map阶段的整个数据处理流程

3)ReduceTask:负责reduce阶段的整个数据处理流程

5、MapReduce编程规范

考虑如下big.txt文件

其中行偏移量,第1行开头的偏移量为0,第2行开头的偏移量为13,第3行开头的偏移量为26,如此类推。注意行偏移量跟字符相关。因此k是永远不会重复的,这里可以不断的得到key-value的数据。比如:

  1. (0, "hadoop spark")
  2. (13, "hadoop storm")
  3. (26, "spark storm")
  4. …………

进入到Map阶段数据处理的过程。需要自己定义一个MapTask来处理。Map方法中进行数据处理具体的逻辑。Map方法具体细节是每一行根据空格进行拆分。当该行数据(0, "hadoop spark")被Map对象读取到的时候,会马上执行Map方法。

经过无数次map方法执行后,可以得到一堆key-value的数据(k1,v1)。K1获取到的是单词,v1则是数字1。因此这个阶段出现的数据是。

("hadoop",1)

("spark",1)

("hadoop",1)

("storm",1)

("spark",1)

("storm",1)

之后会进入shuffling的阶段。该阶段是hadoop帮我们搞定的。

k1.hashCode()方法实现了排序/分区。

该阶段实现的数据为k2 List(V2),这个阶段出现的数据是。

("hadoop",(1,1))

("spark",(1,1))

…………

之后进入到reduce阶段。该阶段需要编写ReduceTask类,该类的对象需要进行数据处理的方法。处理细节就是对List(v2)集合的数据进行累加求和。

该阶段实现的数据为k3 V3。这个就是最终的结果了。

Hadoop经过集合累积后,发现出现了两次。

("hadoop",2)

…………

这个就是MapReduce编程规范了。在编程的时候要对Map阶段和Reduce阶段进行业务逻辑的编写。

编程的时候,需要一个Driver类进行具体的描述:Map阶段要用哪个类,Reduce阶段要用哪个类。对整个词频统计作业的整合说明。

在Map阶段和Reduce阶段,都要进行数据的输入和输出。无论是输入还是输出,都是对key-value键值对进行数据处理。

如下则是具体的实现说明:

用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mapReduce程序的客户端)

1)Mapper阶段

(1)用户自定义的Mapper要继承自己的父类

(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)

(3)Mapper中的业务逻辑写在map()方法中

(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)

(5)map()方法(maptask进程)对每一个<K,V>调用一次

2)Reducer阶段

(1)用户自定义的Reducer要继承自己的父类

(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV

(3)Reducer的业务逻辑写在reduce()方法中

(4)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法

3)Driver阶段

整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象

6、wordcount经典案例的实现

需求: 在一堆给定的文本文件中统计输出每一个单词出现的总次数

7、分析数据准备

先启动hadoop

/export/servers/hadoop-3.1.2/sbin/start-dfs.sh

/export/servers/hadoop-3.1.2/sbin/start-yarn.sh

1.创建一个新的文件

cd /export/testdata

vim big.txt

2.向其中放入以下内容并保存(单词与单词之间通过空格隔开)

big.txt

Hello world hadoop

Hive sqoop flume hello

Kitty tom jerry world

hadoop Kitty tom jerry world

这些是要进行词频统计的数据。

3.上传到 HDFS

hadoop fs -mkdir -p /wordcount/input

hadoop fs -put big.txt /wordcount/input

在浏览器中打开 http://192.168.91.101:50070/explorer.html 并点击进入对应的目录,确认文件是否已经上传完成。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Distantfbc

你的鼓励是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值