写点什么

架构师训练营第十二周”数据应用一“作业

用户头像
随秋
关注
发布于: 2021 年 02 月 20 日

Q:分析 MapReduce 输入输出

分析如下 HiveQL,生成的 MapReduce 执行程序,map 函数输入是什么?输出是什么,reduce 函数输入是什么?输出是什么?

INSERT OVERWRITE TABLE pv_usersSELECT pv.pageid, u.ageFROM page_view pv   JOIN user u   ON (pv.userid = u.userid);
复制代码



A1: 普通 Join

  • Map(假设有两个 Mapper,分别处理 page_view,user)

  • Mapper1 处理 page_view

输入:key:偏移量,value: <page_id><user_id>-,(1,111)  偏移量没有实际业务意义,用-代替-,(2,111)-,(1,222)输出:key:<user_id>, value:<page_view标识,1><page_id>111, (1,1)111, (1,2)222, (1,1)
复制代码
  • Mapper2 处理 user

输入:key:偏移量,value:<user_id><age>-,(111,25)  偏移量没有实际业务意义,用-代替-,(222,32)输出:key:<user_id>, value:<user标识,2><age>111, (2, 25)222, (2, 32)
复制代码
  • Reduce(假设只有一个 Reducer,汇总所有数据)

输入:key:两个mapper输出的key<user_id>, value:两个mapper输出的value按key排序汇总后:111, (1,1)111, (1,2)111, (2, 25)222, (1,1)222, (2, 32)针对每个key,Reducer内部Join后输出(user_id为111的数据,page_view.page_id[1,2] x user.age[25])1, 252, 25(user_id为222的数据,page_view.page_id[1] x user.age[32])1, 32
复制代码

最终输出:

1,252,251,32
复制代码

A2: MapJoin

SELECT /*+ MAPJOIN(pv) */ pv.pageid, u.ageFROM page_view pv   JOIN user u   ON (pv.userid = u.userid);
复制代码

如果 page_view 数据量很小(单台机器可以加载到内存),将 page_view 加载分配到 mapper 直接 Join。

单个 Mapper 直接处理

输入:key:偏移量,value:<user_id><age>-,(111,25)  偏移量没有实际业务意义,用-代替-,(222,32)
HashTable:<user_id>:<page_id list>111: [1, 2]222: [1]
输出:Join后的结果1, 252, 251, 32
复制代码


用户头像

随秋

关注

还未添加个人签名 2018.04.27 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第十二周”数据应用一“作业