什么是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入门及测试相关推荐

  1. Hive的连接(join)方案

    一 Common JOIN/Reduce Side JOIN/Shuffle JOIN 这三种其实都是一种连接方案:即在Reduce端做JOIN操作.一般情况下,如果不手动指定MapJoin或者不满足 ...

  2. HIve map jion的原理、操作和使用场景

    一:hive mapjion的使用场景: 1.关联操作中有一张表非常小(有严重的数据倾斜) 2.不等值的链接操作 Join有多个关联键,则以这些关联键的组合作为key:Map输出的value为join ...

  3. Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积

    1 left semi join的时间比in的时间短,比in高效 2 left semi join时select中不能出现右表的字段,不然报错 3  left semi  join 时on中出现左表字 ...

  4. Hive优化之Join(三)

    1.Join算法概述   Hive拥有多种join算法,包括Common Join,Map Join,Bucket Map Join,Sort Merge Buckt Map Join等,下面对每种j ...

  5. set hive.map.aggr=true 时统计PV数据错误

    从一个表里group by 之后 计算累加值.去重值: 为了效率设置并行:set hive.exec.parallel=true(可选:set hive.exec.parallel.thread.nu ...

  6. map端join和reduce端join的区别

    MapReduce Join MapJoin和ReduceJoin区别及优化 maptask处理后写到本地,如果再到reduce,又涉及到网络的拷贝. map端join最大优势,可以提前过滤不需要的数 ...

  7. hadoop join之map side join

    在本例中,我们仍然采用上一例中的数据文件.之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中.Reduce s ...

  8. hive关于left join 和join时候on条件总结

    hive中使用join时候on条件 1.如果 select * from a left join b on(a.字段=b.字段) 工作正常 2.如果 select * from a left join ...

  9. hive linux进程数,控制Hive MAP个数详解

    控制Hive MAP个数详解 Hive的MAP数或者说MAPREDUCE的MAP数是由谁来决定的呢?inputsplit size,那么对于每一个inputsplit size是如何计算出来的,这是做 ...

最新文章

  1. js对象数组(JSON) 根据某个共同字段 分组
  2. Openstack组件部署 — Keystone Install Create service entity and API endpoints
  3. FetchType.LAZY和FetchType.EAGER什么区别?(懒加载和急加载的理解)
  4. 2021暑假每日一题 【week2 完结】
  5. iBatis resultMap出错 The error happened while setting a property on the result object 解决办法
  6. 教你玩转CSS 尺寸 (Dimension)
  7. combox 增加请选择_娱乐测试:选择四种花束中的一种,测试你对婚姻的看法
  8. python编码器下载_Python Code128编码器
  9. System verilog随机系统函数$urandom_range使用方法
  10. win7_64 安装 caffe
  11. 金钱工具类 MoneyUtils.java
  12. Unity 可重复随机数
  13. 设计模式(十)外观模式
  14. abb机器人gsd文件_ABB机器人控制器死机故障维修
  15. Python 菜鸟入门 《笨方法学PYthon》、《与孩子一起学编程》
  16. 如何用python做前端_python 适合做什么开发 python是用于前端还是后端开发
  17. 音视频技术开发周刊 | 241
  18. 2017又是新的一年
  19. C++STL常用算法adjacent_find
  20. WIDS(无线入侵检测)

热门文章

  1. $.ajax中contentType属性为“application/json”和“application/x-www-form-urlencoded”的区别...
  2. java scene_Java Scene類代碼示例
  3. omni rpc python生成地址_python编辑图形界面单一功能MAC随机地址生成
  4. 考研初试将近,收好这份准备清单,祝你一战成硕
  5. win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结
  6. go 类型断言_深入理解Go的interface内部执行原理
  7. ubuntu执行python脚本_在启动时运行python脚本作为守护进程(Ubuntu)
  8. IDEA 不提示报错 和有波浪线
  9. 前后端分离提交多次验证
  10. matlab和气象,matlab在气象上的应用