当前课程知识点:大数据系统基础 > 4. 处理框架 > 授课视频 > Pig Latin 实现与优化(2)
这个第二个优化
是一种针对特定数据的
这个什么意思
什么叫Skew data
就是说它那个数据的分布
特别的恶心
那么就是说绝大多数的数据
都是同一个key
那么这时候就是说
它虽然这个key
比如说有百千万种key
但是绝大多数数据
还都是有一个key
这个东西是非常非常常见的
一种分布
叫(00:25)
这种分布它基本上就是这样
如果你说我这个横轴
是不同的key
纵轴是这个count
这是那个key的话
那么每一个点就是一个key
那么它基本上是这样感觉的
就是说大部分key都没多少
只有少部分key特别多
这个是非常符合人类社会的
这种分布的
就跟比如说你说你的微博
有多少人关注你的微博
那么对绝大多数人来说
没多少人关注他的微博
但是对于那些大V们来讲
就有无数的人关注他的微博
所以这种东西
人类社会的基本上都是这样的
如果它很热的东西
它最后是很热
不热的东西也很多
但是它就是不热
所以在这种情况下
你怎么做
如果你做Map-Reduce的话
那个处理最热的那个reduce
它就非常非常的惨
它会要处理好多好的的数据
但是按照道理来说
我们必须把所有的
具有相同key的东西
放到一个reduce上来处理
这个时候这种东西
就叫做一种skew的
这种data的Join
这情况下
在PIG里头它会做一些优化
它会在map的时候
它会看一看
这里头到底有多少
它会经过一些simple的采样
我们来看一看
到底有多少个
哪个key是特别热
如果我simple了1%
我看到了好几个这种key
那说明这个东西肯定是挺多的
这种情况下
我就把那个key
再给它人为做成好几块
我把它分到好几个reduce上去
然后我把再reduce的结果
在合并一起这个就叫Skew Join
防止有一个reduce跑得超级慢
顺便说一句
这种跑的超级慢的reduce
你跑几个它也是超级慢
就因为它处理的数据太多了
所以你在(02:05)
就是你说的等于在运行一些
那不解决问题
你每一都会很慢
因为它数据分布是这样的
那么这是一类
另外一类就是说
我两个表
我要把它Join在一起
但是一个表巨大
一个表巨小
这个时候你只得
把那个巨大的表也跑一次
Map-Reduce然后你把它又排序
又什么的 折腾一遍
就是为了跟一个
就是五个记录的表
再Join一下吗
其实不值得
这个PIG的话
它会自动地发现有一个表巨小
那么巨小的表
我干脆就把这个巨小的表
拷贝到每一个这个()上
我把这个巨小的表整体地
拷贝进去
它可能还不如一个()大
然后它自己就在自己本地
把这个Join算完
然后最后再合并就好了
所以这个叫做旁路的输入叫做side file
side file是一种很小的文件
它根本就不值得让你
为了它做Join
然后再跑一次Map-Reduce
所以这样的话
可以减少最后跑
Map-Reduce的数目
这些都是一种基于数据的
这样的一些优化
其实很多数据库的优化
都是基于数据的
它是基于数据是统计
就是数据库
它先看看你的数据到底长啥样
它知道了之后
它就可以针对这种特殊的
这种非常诡异的数据
它进行一些特殊的优化
让它跑的不至于太慢
那么还有一种优化
就是说多个数据流
比如说这个里头
它问你说的
我想对这个用户
网页访问的用户
针对它来自于不同的省份
就是不同的state
在美国叫州
中国叫省
在不同的省份我们要统计一下
另一个是我们基于
它不同的demographic
就是基于不同的人的类别
比如是男的 女的
它是基于多大岁数的
它基于这个做一次统计
那么一个是基于地方的
一个是基于这个的
那么我所有的用户进来之后
我首先要先看看这东西
不是这个爬虫自动的
搜索引擎的爬虫正常的
不是给我做拒绝访问攻击
这些人造成的
我先把这些垃圾的去掉
然后我把它分别group成两次
就是一个是group by state
一个group by demographic
我分别用两种办法来group
然后生成两种不同的结论
这个udfs就是用户定义的函数
所以我同时生成
两种不同的输出
这种情况下如果你写
Map-Reduce的话
Map-Reduce它只能
做一次输出
因为一个reduce它只能
基于一个key来采取
但这个想要两种不同的
group方法
两种不同的排序方法
所以你最后就得抛两次
Map-Reduce
然后你不光要跑两个reduce
你还map也得跑两个
所以意思就是说
你得扫描两遍这个用户数据
如果用户数据特多的话
那你就浪费了两倍的时间
就是把它读进来
也浪费了两倍的时间
但是我们怎么样能够把它
用一个Map-Reduce来跑完呢
所以这个时候PIG里头
它就有这种
有一个split的这样的
一个特殊的操作
它可以把一个map的输出
分成两块
然后它可以同时让map
输出两种不同的输出
然后有两个不同的key来操作
最后它在reduced时候
它最后再做一次Demultiplex
它可以生成两个操作
所以这个也是一个基于多个
数据流可以进行一次操作
但是为什么它可以进行
这样的操作
那么是因为它理解你想做什么
这个系统它理解你想生成
两个输出
但怎么能理解它生成两个输出
那么就是因为它用了一系列
它自身定义的操作
比方说split
比方说这个group by 比方说它的load
然后比方说它的safe
所以这个时候
它可以自己分析出来
这个数据流它会
它是一个数据流的图
这个图上头它是有一个地方
它是需要有两种不同的输出的
所以在这种情况下
它可以进行一系列的
这种优化
然而如果你只写Map-Reduce
然后你写上一堆Map-Reduce
当然这个程序很难看清楚
你这两个Map-Reduce
它实际上用的是一类的输出
但是它也没办法
把你自己写的两个map
合并在一起
因为这个是一个用户写的程序
它可以是任意的
这种程序它没办法
它做任何的处理
所以这个也是
我们经历了抽象之后
我们就有更多的机会
对它做更好的处理
-授课视频
--什么是大数据
--大数据典型应用
--大数据的特点
--大数据技术体系
--大数据生态系统
--大数据技术挑战
--课程内容
-1. 绪论--Quiz 1
-授课视频
--2.2并行化理念
--2.9计算虚拟化
-2.云计算--Quiz 2
-授课视频
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-3.文件存储--Quiz3
-授课视频
--4.13类似框架
--4.14章节总结
-4. 处理框架--Quiz4
-授课视频
-5.内存计算--Quiz5
-授课视频
--数据副本及一致性
--节点本地数据存储
-6. NoSQL--Quiz6
-授课视屏
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-7. 流计算--Quiz7