当前课程知识点:高级大数据系统 > MapReduce > Processing pattern > Video
大家好
上一节我们讲到了什么MapReduce
以及为什么要我们要用MapReduce
来进行大规模的这样一个数据处理
那么在这一节
我们将详细的介绍在MapReduce里面
数据是怎么样被处理的
那么也就是它的
这样一个数据处理的一个模式
我们通过一个简单的例子
来带入我们今天要讲的
这个数据处理模式
那么在我的左手边
在这个PPT的左手边
实际上是一个这个英文的短文
我们的目标是想去计算
在这篇短文里面每个单词
出现的这个数量是多大
也就是单词的这样一个频率
那么这个任务当然非常简单
大家可以通过一个很简单的程序
就可以把这件事情做到
但是大家去想象
当这个数量是非常大的时候
比如说这个数量已经在你的内存
或者在你的一个简单的
服务器上装不下的时候
这件事情应该怎么去做
那么我们就用MapReduce
来解决这样一个事情
那么在MapReduce里面
我们看看我们怎么去做
首先我们会顺序的
去读取这样一个数据集
也就是去对短文中
每个单词去进行一个扫描
那么这个过程是并行的在大量的
服务器上进行的
那么它做什么事情呢
就是给我们每一个出现的单词
给它加上一个value
这个value就加成了1
那么我们可以看到
会出现这样的一个结果
每个单词被加了一个数量1
那么这是map的过程
那map完了之后
会把所有的结果进行一个排序
把它们按照这个单词的类型
把它们放到了一块
我们看到把不同的单词排到了一起
有A有aback等等
那么它们把被放到了一起
那么最后一个阶段是reduce的阶段
我们在reduce里面做了什么事情呢
我们会让相同的这个单词
也就是中间的这样一个key
对应的结果进行一个叠加
比如说我们把所有a的一
把它做了一个加和
我们最终得到了4736
那么得到了我们最终想要的一个结果
那这是MapReduce
进行一个简单的任务的时候
它经历的这样一个过程
那么我们现在通过这个技术的一个展示
我们把刚刚的这样一个过程
把它详细的这样一个分解一下
那我们来看一下它的步骤是什么样子
第一步实际上我们是把原来
原始我们需要处理的
这样一个数据集文件
给分割成了很多的这样一个数据小块
那么这一块又和我们之前说到的
这样一个分布式文件系统对应上了
那么在分布式文件系统里面
我们已经有了这样的
一个的小小的数据块
那么在这里面我们把它们称做了叫做shard
从0一直到m-1
我们有了这样的
一些分布式的数据块
它们分布在不同的服务器上
作为原始的数据可以直接读入进行处理
第二步我们就是会产生一系列的进程
而这个过程通常是由用户来发起的
那么这一步是怎么做的呢
在整个系统里面用户会通过
和我们刚刚说到的
这样一个中心的节点进行交互
然后让它帮忙在所有的这个工作节点
这些worker上产生一系列的进程
那么每一个worker
它既能够产生一个map的进程
也能产生一个reduce的进程
那么我们假设在整个系统里面
我们产生了m个map的
这样一个进程这样的任务
那我们产生了r个这样reduce的任务
那么它们就开始运行起来了
我们来看看当它们运行起来之后
map和reduce分别
会去做一些什么样的事情
那么这是map的阶段
我们来看看map
会做什么样的事情呢
map实际上它会从给它指定的
这样一个数据块shard里面
去读取数据
把数据读出来
然后做什么呢
会根据用户写的
这样一个map的程序
来对读入的key和value的
数据集进行一个操作
这个操作有可能是查找
有可能是做一些排序
有可能是做其它更复杂的
这样一个工作
总之这一步它会产生一个中间结果
那这个中间结果实际上会map的进程
写入到它本机的这个内存中
最终会不断地周期性地
写到这个磁盘里面
那么就像这里面
我们说到它写的过程中
实际上它会有一定的
这样的结构去依赖
这个结构实际上
是由一个叫做partition的
这样一个过程来决定的
也就是说把所有产生的
这个中间key和中间value
按照一定的规律
写到不同的partition里面
那么这个partition的数量
和partition的方式
实际上是和我们后面产生的
这个reducer
它的一个情况相匹配的
那么我们后面会去介绍一下
在前一步我们就得到了
一系列的中间结果
那这些中间结果具有key和value的属性
那么它们被分成了R个这样的区域
那么下一步我们就需要把这些数据
从map的节点移动到reduce的节点
进行进一步的这个处理
那么我们来看看这个是怎么去做的
map产生的数据reduce
需要接受这些数据
它们中间通过partition的过程连接起来
那么在这里面实际上一个核心的东西
就是我们刚刚说到的partition的函数
那这个函数决定了中间
生成的这些key
它到底应该到哪一个reducer上去
那么在默认的这个配置下
实际上我们通常是通过一个哈希函数
来模R这样的一个方法
来生成这样一个partition的key
那它的用处有什么
比如说我们可以通过这个中间的key
让中间的key基本上
比较随机的分散到各个reducer上去
那么可以在reducer的
这个服务器之间
达到一个相对比较均衡的
这样一个任务的分配
那实际上这个partition
是一个向用户暴露的一个接口
用户可以根据自己的需要
来决定他的partition怎么去写
比如说他并不需要任务非常的均衡
而为了达到其他的目标
那么他可能可以改写
这个partition的过程
那当这个partition完成之后
实际上就可以慢慢地
使整个任务推进到reduce
这样一个阶段
那么reduce这个阶段
数据就会从map的节点
通常是从它们的这个本地的磁盘中
把数据给拉到reduce的节点上
来进行一个处理
我们来看一下
这个过程大概是什么样子
那么在reduce这个阶段实际上
和map阶段是不一样的
它并不是说让每一个节点处理
本机上这些shard的
这些数据块就可以了
而是需要把所有整个系统里面
具有相同的key
中间key的这些数据放到
相同的reducer上去处理
也就是说每个reducer在系统中
处理了某一个中间key
而且是系统中所有的中间key
它对应的这个结果
那这中间会带来什么样的一个问题
它的问题
就是说我们需要从不同的map服务器上
把具有某一种key的这个数据
复制到某一个reducer上
会带来什么
它会带来网络的开销
对吧
所以在这个过程中
我们可以从这张图上看到
实际上数据
需要从不同的reducer到worker
然后从它们的磁盘把数据
经过网络经过交换机
最终传输到某一个处理它的
这个reducer的节点上去
那这个过程在今天实际的系统中
实际上也是开销比较大的一个过程
大量的研究工作实际上
也是在这一块展开
怎么样降低这个从map到reducer
它的这样一个shuffle的一个过程
怎么样使得这个过程尽可能的高效
那么是今天对MapReduce
这一类系统优化的一个关键点
好我们假设刚刚的内部已经完成了
我们可以看到在reducer的
这样一个工作节点上
实际上它有来自系统中
各个其他map节点的这个数据
通过远程的复制已经把它拿了过来
那么在这里就会进行我们最开始说的
那一步进行数据的一个整合
那么reduce里面用户会根据自己的
需要进行reduce函数的一个编写
这个过程有可能是数据的叠加
像我们刚刚说到的例子中进行单词统计
也有可能是进行一些这个统计
也有可能是找出某一些结果等等
这都是在reduce里面可以实现的功能
那么大家可以在日后自己的
这个数据处理任务中
具体的去尝试不同的这种类似的写法
那么完成这一步之后
实际上我们的整个数据处理任务
就已经基本上结束了
Reduce结束之后
实际上根据用户对于reduce的编写
又会进一步把最终生成的结果
写入到reducer节点的这个磁盘上
写入到他的这个分布式文件系统里面
实际上准确的说
那么完成这一步之后
实际上用户就可以通过分布式的
这个文件系统进行数据的一个访问
最终得到他想要进行的结果
那再往后它可以进一步
去迭代另一个这个MapReduce任务
或者是就已经得到了
最终的这样一个需要的数据集
-What is big data and what is big data system?
--Video
-Problems in big data systems?
--Video
-Overview of the course
--Video
-Principles of big data system design
--Video
-Manipulating Data on Linux
--Video
--Video
--Video
-Basics of Linux Data Processing--Manipulating Data
-Running Commands on a Single Machine
--Video
-Running Commands on a Single Machine--作业
-Using a Linux Cluster
--Video
-Using a Linux Cluster--作业
-Storage for Big Data Computing: Distributed file system
--Video
-Storage for Big Data Computing: Distributed file system--作业
-File system and GFS
--Video
-File system and GFS--作业
-Understanding HDFS using Legos
--Video
-Understanding HDFS using Legos--作业
-File System Implementation and DFS
--Video
--Video
-File System Implementation and DFS--作业
-What is MapReduce and why
--Video
-What is MapReduce and why
-Learn MapReduce by playing with cards
--Video
-Processing pattern
--Video
-Processing pattern--作业
-Hadoop
--Video
-Hadoop--作业
-Algorithms in MapReduce
--Video
-Algorithms in MapReduce--作业
-Tutorial
--Video
-Background
--Video
-Background--作业
-Spark
--Video
-Spark--作业
-Use Spark for data mining
--Video
-Use Spark for data mining--作业
-Spark data processing
--Video
-Spark data processing--作业
-Experiment in Spark
--Video
-Experiment in Spark--作业
-Introduction to streaming data processing
--Video
-Introduction to streaming data processing--作业
-Storm
--Video
--Video
--Video
-Storm--作业
-Spark streaming
--Video
--Video
-Spark streaming--作业
-NoSQL introduction
--Video
-NoSQL introduction--作业
-Common Advantages
--Video
-Common Advantages--作业
-Bigtable
--Video
-Bigtable--作业
-Master Startup
--Video
-Master Startup--作业
-HBase
--Video
-HBase--作业
-What is GraphDB and Graph data processing
--Video
-What is GraphDB and Graph data processing--作业
-Graph systems
--Video
-Graph systems
-Example of a GraphDB
--Video
-Example of a GraphDB--作业
-Mahout
--Video
-Mahout--作业
-Case Study: Recommendation
--Video
-Case Study: Recommendatio作业
-Recommendation in Mahout
--Video
-Recommendation in Mahout--作业