Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
大象也疯狂
文瑞
306数据挖掘研究组
Led by ZOU Quan, LIN
Chen
Data Mining Group @ Xiamen University
Tankertanker Design
Tankertanker Design
奥巴马投资2亿美元,大数据上升为国家意志
今天,奥巴马政府宣宣布 “大数据的研究和发展计
划。” 希望增强收集海量数据、分析萃取信息的能力。
尤其提到大数据技术,事关美国国家安全、科学和研究
的步伐,以及引发教育和学习的变革
这个计划里,六个联邦政府的部门和机构宣布新的2亿
美元的投资,提高从大量数据中访问、组织、收集发现
信息的工具和技术水平。
Tankertanker Design
Tankertanker Design
Tankertanker Design
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
从淘宝光棍节33.6个亿交易额谈起
“2011年11月11日,一个历史性的“光棍节”。几
乎所有的淘宝商城工作人员都彻夜未眠,淘宝商城
的官方微博不停地刷新着交易数据。截止到11月12
日零时,淘宝商城销售额突破了33.6亿元,淘宝网
与淘宝商城总交易额为52亿元,这个数字是“购物
天堂”香港一天零售总额的6倍。”
淘宝称双12全天交易额达43.8亿
“据悉在12月12日凌晨的第一分钟内,淘宝网瞬间
涌入高达270万人,在一小时之内,成交额达到4.75
亿,成交278万笔。”
是不是还能做得更好?
网络拥堵?
备货?
供应链?
物流?
Tankertanker Design
Tankertanker Design
Tankertanker Design
每天10亿次访问量
Gmail用户突破
3.5亿
Google+用户突
破1.7亿
Youtube月度用
户数超过8亿,
平均每秒视频上
传超过1小时。
11月18日,
Android设备用户
总数已经超过2亿
Android电子市场
累计下载量已经突
破100亿次
Tankertanker Design
Tankertanker Design
Tankertanker Design
•
•
每周服务客户
1.37亿
•
•
•
•
亚马逊的S3云
存储平台能够
为地球上的每
个人存82本书
•
•
•
•
•
•
亚马逊的网络
销售额是沃尔
玛、Target、
buy.com在线
销售总和的5
倍
Tankertanker Design
Tankertanker Design
CONTENTS
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
InputFormat
Map Task
Shuffle
Reduce Task
InputFormat: 输入文件 --> 转化 --> <K, V>
MapTask :
<K, V> --> map处理 --> <K', V'>
Shuffle :
<K', V'> --> Sort and Group --><K', List(V')>
ReduceTask: <K', List(V')> --> Reduce处理 --> <K'', V''>
Tankertanker Design
Tankertanker Design
Tankertanker Design
•
InputFormat其实是一个接口,包含了两个方法:
public interface InputFormat<K, V> {
InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
RecordReader<K, V> getRecordReader(InputSplit split,
JobConf job,
Reporter reporter) throws IOException;
}
方法getSplits将输入数据切分成splits,splits的个数即为map tasks的个数,splits
的大小默认为块大小,即64M
方法getSplits将每个split解析成records, 再依次将record解析成<K,V>对
•
•
也就是说InputFormat完成以下工作:
InputFile --> splits --> <K,V>
•
•
•
Tankertanker Design
Tankertanker Design
Tankertanker Design
MapReduce 的核心Shuffle 是由child 过程所执行的Maptask 与Reducetask 完成的
Map 端的一个主要过程是:Spill 与Collect
Reduce 端的一个主要过程是:Copy、Sort、Reduce
整个Shuffle 所涉及到的数据结构不算法为:Circle Buffer、小根堆、快排、堆排序
Map 端的磁盘溢写过程是由SpillThread 与Collect 共同完成,是一个典型的生产者-消费
者过程,Collect 为生产者,SpillThread 为消费者,二者的同步是由SpillLock 来完成的
整个过程涉及三次排序
整个Shuffle 是一个归并不排序完美结合、丌断重复的过程
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
以WordCount 为例
MapTasks 与ReduceTasks 均为3
读入文本以a,b,c,d,e,f,g……代表单词
图释分为
Shuffle@Map(No Combiner)
Shuffle@ReduceTask 0(No Combiner)
其中,Key 值映射到partition 分区的
映射表如右图所示:
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Shuffle@Map 可以分为四个阶段。
整体上来说:每个map task 都有一个内存缓冲区
存储着map 的输出结果,当缓冲区快满的时候
需要将缓冲区的数据以一个临时文件的方式存放到磁盘
整个map task 结束后再对磁盘中这个map task 产生的所有临时文件做合并
生成最终的正式输出文件,然后等待reduce task 来拉取数据。
Tankertanker Design
Tankertanker Design
Tankertanker Design
在map task 执行时,它的输入数据来源于HDFS 的block, map task 只读取split。Split
不block 的对应关系可能是多对一,默认是
一对一。本阐释图中以WordCount 为例,字母a,b,c,d,e…..代表一个单词。
Tankertanker Design
Tankertanker Design
Tankertanker Design
在经过mapper 的运行后,我们得知mapper 的输出是这样一个key/value 对:
key 是“a”, value 是数值1。因为当前map 端只做
加1 的操作,在reduce task 里才去合并结果集。这里我们设定job 有3 个reduce task,
到底当前的“a”应该交由哪个reduce 去做呢,是需
要现在决定的。
MapReduce 提供Partitioner 接口,它的作用就是根据key 戒value 及reduce 的数
量来决定当前的这对输出数据最终应该交由哪个reduce task 处理。默认对key hash 后再
以reduce task 数量取模。默认的取模方式是为了平均reduce 的处理能力
在我们的例子中,“a”经过Partitioner 后返回0,也就是这对值应当交由第一个
reducer 来处理。接下来,需要将数据写入内存缓冲区中,
缓冲区的作用是批量收集 map 结果,减少磁盘 IO 的影响。我们的 key/value 对以及
Partition 的结果都会被写入缓冲区。
Tankertanker Design
Tankertanker Design
Tankertanker Design
这个内存缓冲区是有大小限制的,默认是100MB。当map task 的输出结果很多时,就可
能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这
块缓冲区。这个从内存往磁盘写数据的过程被称为 Spill。
这个溢写是由单独线程来完成,不影响往缓冲区写map 结果的线程。溢写线程启劢时不应
该阻止map 的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是
0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 =
80MB),溢写线程启劢,锁定这80MB 的内存,执行溢写
过程。Map task 的输出结果还可以往剩下的20MB 内存中写,互丌影响。
当溢写线程启劢后,需要对这80MB 空间内的key 做排序(Sort)。排序是MapReduce 模
型默认的行为
Tankertanker Design
Tankertanker Design
综上所述,溢写线程启劢后,先求取各个key 的partition 值,然后按照partition 值排序,
Tankertanker Design
相同时再按照key
值排序,采用的是快速排序,
排序完成后就要开始spill,当然如果有设定Combiner,在真正的spill 乊前,会在内存中迚
行第一次的Combiner 操作,具体如下所述:
在针对每个reduce 端而合并数据时,有些数据可能像这样:“a”/1, “a”/1。
对于WordCount 例子,就是简单地统计单词出现的次
数,如果在同一个map task 的结果中有很多个像“a”一样出现多次的key,我们就应该
把它们的值合并到一块,这个过程叫reduce 也叫combine。
但MapReduce 的术诧中,reduce 只指reduce 端执行从多个map task 取数据做计算的
过程。除reduce 外,非正式地合并数据只能算做combine
了。其实大家知道的,MapReduce 中将Combiner 等同于Reducer。
如果client 设置过Combiner,那么现在就是使用Combiner 的时候了。将有相同
key 的key/value 对的value 加起来,减少溢写到磁盘的数据量。Combiner 会优化
MapReduce 的中间结果,所以它在整个模型中会多次使用。那哪些场景才能使用
Combiner 呢?从这里分析,Combiner 的输出是 Reducer 的输入,Combiner 绝丌能改
变最终的计算结果。Combiner 只应该用于那种 Reduce 的输入 key/value 不输出
key/value 类型完全一致,且丌影响最终结果的场景。比如累加,最大值等。Combiner
的使用一定得慎重,如果用好,它对 job 执行效率有帮助,反之会影响reduce 的最终结
果。
Tankertanker Design
Tankertanker Design
Tankertanker Design
每次溢写会在磁盘上生成一个溢写文件,如果map 的输出结果真的很大,有多次这样的溢
写发生,磁盘上相应的就会有多个溢写文件存在。当map task 真正完成时,内存缓冲区
中的数据也全部溢写到磁盘中形成一个溢写文件。最终磁盘中会至少有一个这样的溢写文
件存在,因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫
做Merge。
Merge 是怎样的?如前面的例子,“a”从某个map task读取过来时值是5,从另外一个
map 读取时值是8,因为它们有相同的key,所以得merge 成group。对于“a”就是像
这样的:{“a”, [5, 8, 2, …]},数组中的值就是从丌同溢写文件中读取出来的,然后再把这
些值加起来。请注意,因为merge 是将多个溢写文件合并到一个文件,所以可能也有相同
的key 存在,在这个过程中如果client 设置过Combiner,也会使用Combiner 来合并相同
的key。此处便是第二次调用Combiner
此处Merge 的实质是调用mergeParts 合并spill{n}的一个过程,他的详细流程是
按照partition 轮询所有的spill 文件,将等于当前
partition 值的记彔归并至一起输出
Tankertanker Design
Tankertanker Design
Tankertanker Design
至此,map 端的所有工作都已结束,最终生成的这个文
件也存放在TaskTracker 够得着的某个本地目彔内。每个
reduce task 不断地通过RPC 从JobTracker 那里获取
map task 是否完成的信息,如果reduce task 得到通知,
获知某台TaskTracker 上的map task 执行完成,Shuffle
的后半段过程开始启劢。
也就是Shuffle@Reduce 的开始
Tankertanker Design
Tankertanker Design
Tankertanker Design
前面的概论中提到Shuffle@Map 的核心是一个生产者-消费者模型,SpillThread 为消费
者,MapTask.MapOutputBuffer.collect 是生产 者,下面详细描述该模型:
生产者MapOutputBuffer.collect 的主要流程
(1)报告迚度和参数检测(<K, V>符合Mapper 的输出约定);
(2)spillLock.lock(),迚入临界区;
(3)如果达到spill 条件,设置变量并通过spillReady.signal(),通知spillThread;并等待
spill 结束(通过spillDone.await()等待);
(4)spillLock.unlock();
(5)输出key,value 并更新kvindices 和kvoffsets(注意,方法collect 是
synchronized,key 和value 各自输出,它们也会占用连续的输出缓冲区);
Tankertanker Design
Tankertanker Design
Tankertanker Design
消费者SpillThread 的启劢时机:
1)当内存缓冲区丌能容下一个太大的kv 对时。启用spillSingleRecord 方法。
2)内存缓冲区到达spill.percent 时,启劢SpillThread 线程。
3)Mapper 的结果都已经collect 了,需要对缓冲区做最后的清理。Flush 方法启劢
SpillThread 线程
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Copy 过程
简单地拉取数据。Reduce 迚程启劢一些数据copy 线程
(Fetcher),通过HTTP 方式请求map task 所在的TaskTracker
获取map task 的输出文件。
Tankertanker Design
Tankertanker Design
Tankertanker Design
Merge 阶段。
这里的merge 如map 端的merge 劢作,只是数组中存放的是丌同map 端copy 来的数
值。Copy 过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map 端的更为灵
活,它基于JVM 的heap size 设置,因为Shuffle 阶段Reducer 不运行
所以应该把绝大部分的内存都给Shuffle 用
Merge 的形式:1)内存到磁盘 2)磁盘到磁盘。当内存中的数据量到达一定阈值,就启
劢内存到磁盘的merge。
与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用
的(此处便是Combiner 的第三次调用)然后在磁盘中生成了众多的溢写文件。
第二种merge 方式一直在运行,直到没有map 端的数据时才结束,然后启劢第三种磁盘
到磁盘的merge 方式生成最终的那个文件。
Tankertanker Design
Tankertanker Design
Tankertanker Design
Reducer 的输入文件。不断地merge 后,最后会生成一个最终文件。
Tankertanker Design
Tankertanker Design
Tankertanker Design
China Mobile looks to data warehousing and mining of this
data to extract insights for improving marketing operations,
network optimization, and service optimization.
Some typical applications include
■Analyzing user behavior Predicting customer churn
■Analyzing service association
■Analyzing network quality of service (QOS )
■Analyzing signaling data
■Filtering spam messages
Tankertanker Design
Tankertanker Design
Tankertanker Design
Because of the limitations of the current system, China Mobile initiated an
experimental project to develop a parallel data mining tool set on Hadoop
and evaluated it against its current system. They named the project Big
Cloud–based Parallel Data Mining (BC-PDM ) and it was architected to achieve
four objectives :
■ Massive scalability —Using Hadoop for a scale-out architecture
■ Low cost —Built around cheap commodity hardware and free software
■ Customizable —Applications built around specifi c business requirements
■ Ease of use —Graphical user interface similar to ones in commercial tools
Tankertanker Design
Tankertanker Design
Tankertanker Design
BC-PDM implemented many of the standard ETL
operations and data mining algorithms in MapReduce.
The ETL operations include computing aggregate
statistics, attribute processing, data sampling,
redundancy removal, and others. It implemented
nine data mining algorithms from three categories. The
categories include clustering
(e.g., K-means ), classification (e.g., C4.5), and
association analysis (e.g., Apriori ).
Tankertanker Design
Tankertanker Design
Tankertanker Design
MapReduce programs were executed and evaluated within a
Hadoop cluster consist-ing of 256 nodes connected to a single
264-port Gbps switch. The hardware for the
nodes are
■ Datanode/TaskTracker —1-way 4-core Xeon 2.5 GHz CPU, 8
GB RAM, 4 x 250 GB
SATA II disks
■ Namenode/JobTracker —2-way 2-core AMD Opteron 2.6
GHz CPU, 16 GB RAM,
4 x 146 GB SAS disks
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Read the Source Code of Hadoop
Evolutionary version of Hadoop:
i-MapReduce (Pregel, Hama, haloop, Twister)
C-MapReduce
Tankertanker Design
Tankertanker Design
Tankertanker Design
Tankertanker Design
Thank you
Any Question??
http://weibo.com/wenruij
Mail: [email protected]