intellij idea使用教程 Python入门到实战 Mxnet 私有变量 webserver html session dart swift3 null vue前端开发 sketch up教程 easyui视频 华为路由器ipv6配置 jquery拼接字符串 微信pc版无法获取二维码 oracle重命名表名 cmd清空命令 python写文件 python语言编程入门 python的编译器 java编程实例 java正则表达 java重写和重载 java时间函数 java自学编程入门教程 java列表 java日期转时间戳 java网络编程实例 php实例教程 rewritebase 计算机操作系统第四版 三维看图软件 整站系统 java电子书 骰子表情 程序卸载 梦幻手游助手 iframe跨域 linux解压命令
当前位置: 首页 > 学习教程  > 编程语言

Hive map side join入门及测试

2020/12/28 19:46:13 文章标签:

什么是MapJoin? MapJoin顾名思义,就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。 MapJoin的原理: 即在map 端进行join,其原理是bro…

什么是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

本文链接: http://www.dtmao.cc/news_show_550374.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?