hive中的map/reduce
来源:互联网 发布:dijkstra算法的优点 编辑:程序博客网 时间:2024/06/03 18:32
MapReduce 框架的核心步骤主要分两部分:Map 和Reduce。当你向MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执行,每一个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一起并输出。
一、对于 JOIN 操作:
INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);
实现过程为:
- Map:
- 以 JOIN ON 条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合
- 以 JOIN 之后所关心的列作为 Value,当有多个列时,Value 是这些列的组合。在 Value 中还会包含表的 Tag 信息,用于标明此 Value 对应于哪个表。
- 按照 Key 进行排序。
- Shuffle:
- 根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中。
- Reduce:
- Reducer 根据 Key 值进行 Join 操作,并且通过 Tag 来识别不同的表中的数据。
具体实现过程如图:
在举一例:
- key这里后面的数字是tag,后面在reduce阶段用来区分来自于那个表的数据。tag是附属在key后面的。那为什么会把a(0)和a(1)汇集在一起了呢,是因为对先对a求了hashcode,设在了HiveKey上,所以同一个key还是在一起的。
- Map阶段只是拆分key和value。
- reduce阶段主要看它是如何把它合并起来了,从图上可以直观的看到,其实就是把tag=1的内容,都加到tag=0的后面,就是这么简单。
- 代码实现上,就是先临时用个变量把值存储起来在storage里面, storage(0) = [{a, 苹果}, {a, 橙子}] storage(1) = [{23}],当key变化(如a变为b)或全部结束时,会调用endGroup()方法,把内容合并起来。变成[{a,苹果,23}, {a, 橙子,23}]
二 、GROUP BY 操作
SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;
具体实现过程如图:
再举个例子:
默认设置了hive.map.aggr=true,所以会在mapper端先group by一次,最后再把结果merge起来,为了减少reducer处理的数据量。注意看explain的mode是不一样的。mapper是hash,reducer是mergepartial。如果把hive.map.aggr=false,那将groupby放到reducer才做,他的mode是complete.
三、DISTINCT 操作
SELECT age, count(distinct pageid) FROM pv_users GROUP BY age;
实现过程如图:
- Map:以age,pageid作为key,value为1
- shuffle:根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中。
- reduce:以age作为key,计算不同pageid的数量
再举个例子:
1. 第一步先在mapper计算部分值,会以count和uid作为key,如果是distinct并且之前已经出现过,则忽略这条计算。第一步是以组合为key,第二步是以count为key.
2. ReduceSink是在mapper.close()时才执行的,在GroupByOperator.close()时,把结果输出。注意这里虽然key是count和uid,但是在reduce时分区是按count来的!
3. 第一步的distinct计算的值没用,要留到reduce计算的才准确。这里只是减少了key组合相同的行。不过如果是普通的count,后面是会合并起来的。
4. distinct通过比较lastInvoke判断要不要+1(因为在reduce是排序过了的,所以判断distict的字段变了没有,如果没变,则不+1)
- hive中的map/reduce
- HIVE UDAF 中的map对象及reduce对象(GenericUDAFEvaluator)
- hive优化 map+reduce+split
- HIVE的MAP/REDUCE原理
- Hive任务优化--控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- Hive优化----控制hive任务中的map数和reduce数
- hive优化之--控制hive任务中的map数和reduce数<转>
- hive优化之 —— 控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- hive优化之-控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- hive优化之 控制hive任务中的map数和reduce数
- hive优化之------控制hive任务中的map数和reduce数
- 获取webapp目录
- 【树型DP】BZOJ1564 二叉查找树(noi2009)
- (1)Introduction
- MD5加密
- 社説 20150511 サイバー対策 官民一体で防護態勢強化せよ
- hive中的map/reduce
- 每天一道算法题(1) ——不用乘除法求和1+2+…+n
- struts页面跳转和局部刷新配置的五种方式
- 社説 20150511 カジノ法案提出 依存症対策も政府に丸投げか
- python re 模块 findall 函数用法简述
- 开源项目SlidingMenu的使用和示例
- oc 打印二进制
- MyEclipse导入现成项目出现小红叉错误
- Office在线预览及PDF在线预览的实现方式