Hive map side join入门及测试
什么是MapJoin?
MapJoin
顾名思义,就是在Map
阶段进行表之间的连接。而不需要进入到Reduce
阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。
MapJoin的原理:
即在map 端进行join,其原理是broadcast join,即把小表作为一个完整的驱动表来进行join操作。通常情况下,要连接的各个表里面的数据会分布在不同的Map中进行处理。即同一个Key对应的Value可能存在不同的Map中。这样就必须等到 Reduce中去连接。要使MapJoin
能够顺利进行,那就必须满足这样的条件:除了一份表的数据分布在不同的Map中外,其他连接的表的数据必须在每个Map
中有完整的拷贝。MAPJOIN
会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map
是进行了join
操作,省去了reduce运行的效率也会高很多。
MapJoin适用的场景:
mapjoin
的适用场景如关联操作中有一张表非常小,.不等值的链接操作。通过上面分析你会发现,并不是所有的场景都适合用MapJoin. 它通常会用在如下的一些情景:在二个要连接的表中,有一个很大,有一个很小,这个小表可以存放在内存中而不影响性能
。这样我们就把小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。
MapJoin的实现方法:
1)在Map-Reduce的驱动程序中使用静态方法DistributedCache.addCacheFile()
增加要拷贝的小表文件。 JobTracker在作业启动之前会获取这个URI列表,并将相应的文件拷贝到各个TaskTracker
的本地磁盘上。
2)在Map类的setup方法中使用DistributedCache.getLocalCacheFiles()方法获取文件目录,并使用标准的文件读写API读取相应的文件。
Hive版本区别:
Hive内置提供的优化机制之一就包括MapJoin
。
在Hive v0.7
之前,需要给出MapJoin
的指示,Hive才会提供MapJoin的优化。
Hive v0.7
之后的版本已经不需要给出MapJoin
的指示就进行优化。它是通过如下配置参数来控制的:
hive> set hive.auto.convert.join=true;
hive 0.11
之后,在表的大小符合设置时
hive.auto.convert.join.noconditionaltask=true,
hive.auto.convert.join.noconditionaltask.size=10000,
hive.mapjoin.smalltable.filesize=25000000
默认会把join
转换为map join
(认 hive.ignore.mapjoin.hint为true,hive.auto.convert.join为true),不过hive0.11的 map join bug比较多,可以通过在默认关闭map join convert,在需要时再设置hint:hive.auto.convert.join=false 。hive.ignore.mapjoin.hint=false.
Hive v0.12.0
版本,缺省状况下MapJoin
优化是打开的。也就是
hive.auto.convert.join=true
Hive还提供另外一个参数–表文件的大小作为开启和关闭MapJoin的阈值。
hive.mapjoin.smalltable.filesize=25000000
测试
hive 2.1.1 版本
可以看出map端join是默认开启
的
hive> set hive.auto.convert.join;
hive.auto.convert.join=true
hive> set hive.mapjoin.smalltable.filesize;
hive.mapjoin.smalltable.filesize=25000000
以2个小表join进行测试,看执行过程可以看出是没有reduce
阶段的
hive> select * from u1 left join u2 on u1.id=u2.id;
Query ID = root_20201228193725_f83e5aa0-ec9f-44b3-8efd-655d34bbb638
Total jobs = 1
2020-12-28 19:38:01 Starting to launch local task to process map join; maximum memory = 477626368
2020-12-28 19:38:06 Dump the side-table for tag: 1 with group count: 4 into file: file:/usr/local/hive/iotmp/root/54f6a901-c015-4394-a032-97f861b9cdb2/hive_2020-12-28_19-37-25_392_4405802127612271879-1/-local-10004/HashTable-Stage-3/MapJoin-mapfile01--.hashtable
2020-12-28 19:38:06 Uploaded 1 File to: file:/usr/local/hive/iotmp/root/54f6a901-c015-4394-a032-97f861b9cdb2/hive_2020-12-28_19-37-25_392_4405802127612271879-1/-local-10004/HashTable-Stage-3/MapJoin-mapfile01--.hashtable (348 bytes)
2020-12-28 19:38:06 End of local task; Time Taken: 4.661 sec.
Execution completed successfully
MapredLocal task succeeded
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Job running in-process (local Hadoop)
2020-12-28 19:38:24,939 Stage-3 map = 0%, reduce = 0%
2020-12-28 19:38:26,089 Stage-3 map = 100%, reduce = 0%
Ended Job = job_local1658451598_0001
MapReduce Jobs Launched:
Stage-Stage-3: HDFS Read: 25 HDFS Write: 240 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
1 a NULL NULL
2 b 2 bb
3 c 3 cc
4 d NULL NULL
7 y 7 yy
8 u NULL NULL
NULL NULL NULL NULL
总结
map side join
在新版本中是默认开启的,无需设置- join时是否有
reduce
主要取决于表的大小! - 目前是如果有
25M
以下的小表都会启动map side join
Hive map side join入门及测试相关推荐
- Hive的连接(join)方案
一 Common JOIN/Reduce Side JOIN/Shuffle JOIN 这三种其实都是一种连接方案:即在Reduce端做JOIN操作.一般情况下,如果不手动指定MapJoin或者不满足 ...
- HIve map jion的原理、操作和使用场景
一:hive mapjion的使用场景: 1.关联操作中有一张表非常小(有严重的数据倾斜) 2.不等值的链接操作 Join有多个关联键,则以这些关联键的组合作为key:Map输出的value为join ...
- Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积
1 left semi join的时间比in的时间短,比in高效 2 left semi join时select中不能出现右表的字段,不然报错 3 left semi join 时on中出现左表字 ...
- Hive优化之Join(三)
1.Join算法概述 Hive拥有多种join算法,包括Common Join,Map Join,Bucket Map Join,Sort Merge Buckt Map Join等,下面对每种j ...
- set hive.map.aggr=true 时统计PV数据错误
从一个表里group by 之后 计算累加值.去重值: 为了效率设置并行:set hive.exec.parallel=true(可选:set hive.exec.parallel.thread.nu ...
- map端join和reduce端join的区别
MapReduce Join MapJoin和ReduceJoin区别及优化 maptask处理后写到本地,如果再到reduce,又涉及到网络的拷贝. map端join最大优势,可以提前过滤不需要的数 ...
- hadoop join之map side join
在本例中,我们仍然采用上一例中的数据文件.之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中.Reduce s ...
- hive关于left join 和join时候on条件总结
hive中使用join时候on条件 1.如果 select * from a left join b on(a.字段=b.字段) 工作正常 2.如果 select * from a left join ...
- hive linux进程数,控制Hive MAP个数详解
控制Hive MAP个数详解 Hive的MAP数或者说MAPREDUCE的MAP数是由谁来决定的呢?inputsplit size,那么对于每一个inputsplit size是如何计算出来的,这是做 ...
最新文章
- js对象数组(JSON) 根据某个共同字段 分组
- Openstack组件部署 — Keystone Install Create service entity and API endpoints
- FetchType.LAZY和FetchType.EAGER什么区别?(懒加载和急加载的理解)
- 2021暑假每日一题 【week2 完结】
- iBatis resultMap出错 The error happened while setting a property on the result object 解决办法
- 教你玩转CSS 尺寸 (Dimension)
- combox 增加请选择_娱乐测试:选择四种花束中的一种,测试你对婚姻的看法
- python编码器下载_Python Code128编码器
- System verilog随机系统函数$urandom_range使用方法
- win7_64 安装 caffe
- 金钱工具类 MoneyUtils.java
- Unity 可重复随机数
- 设计模式(十)外观模式
- abb机器人gsd文件_ABB机器人控制器死机故障维修
- Python 菜鸟入门 《笨方法学PYthon》、《与孩子一起学编程》
- 如何用python做前端_python 适合做什么开发 python是用于前端还是后端开发
- 音视频技术开发周刊 | 241
- 2017又是新的一年
- C++STL常用算法adjacent_find
- WIDS(无线入侵检测)
热门文章
- $.ajax中contentType属性为“application/json”和“application/x-www-form-urlencoded”的区别...
- java scene_Java Scene類代碼示例
- omni rpc python生成地址_python编辑图形界面单一功能MAC随机地址生成
- 考研初试将近,收好这份准备清单,祝你一战成硕
- win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结
- go 类型断言_深入理解Go的interface内部执行原理
- ubuntu执行python脚本_在启动时运行python脚本作为守护进程(Ubuntu)
- IDEA 不提示报错 和有波浪线
- 前后端分离提交多次验证
- matlab和气象,matlab在气象上的应用