IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MapJoin -> 正文阅读

[大数据]MapJoin

Common Join

Common join的操作被编译成MapReduce任务。

Map阶段把join操作的on条件字段作为输出的key,把select、where的字段和表名拼接成输出的value。下图是一个简单的案例:
example of common join

更通用的:
common join

可见有三个阶段

  1. Mapper从表中读取数据,并依据规则把k-v键值对发送到中间文件。
  2. 中间文件在Shuffle阶段对这些键值对进行排序和合并。
  3. Reducer利用排序,把相同key的键值对发送到同一个reduce方法中进行join

Map Join

Map Join的目的是减少Shuffle和Reducer阶段的代价,仅在Map阶段进行Join。这样不仅可以提高join的速度,由于没有shuffle,进而可以避免数据倾斜的问题

这就要求参与join的表至少要有一个足够小到可以装进内存,让所有的Mapper可以把该表读进MapTask的运行时内存。

但是如果成千上万个Mapper同时去HDFS中读取这个小表,效率很低,容易导致Mapper在读取队列中操作超时,因此Hive提出了分布式缓存技术的解决方案。

使用分布式缓存

优化的基本思想是在原始Join操作的MapReduce任务创建之前创建一个新的本地MapReduce任务,这个任务是将小表数据从HDFS上读取到内存中的hash表中,读取完成后,将hash表序列化为文件,随后将该文件上传到Hadoop的分布式缓存中,分布式缓存会将该文件发送到每个Mapper所在的本地磁盘上。

因此所有Mapper都可以将这个hash表文件加载到MapTask的运行内存中去。

优化后,从HDFS读取小表的操作只需要进行一次。并且如果多个Mapper在同一台机器上,他们读取的是同一份小表的hash表序列化文件。

distributed cache

大小表的区分

此前Hive用户需要在查询中给出提示来指定哪个表是小表,用户体验很差。随后Hive支持自动尝试将Common Join转为Map Join,Hive自动识别哪些表可以作为小表,并将这些小表放入内存中。

Hive查询处理在编译时不知道输入文件的大小,并且有可能子查询的表也会生成中间表,因此Hive只能在执行期间计算出输入文件的大小。

condition task

如上图所示,左侧是Common Join,不做过多解释。

右侧流程是Map Join执行流程。以select * from src1 x join src2 y on x.key=y.key为例。因为表src1和src2都可能是大表,所以处理器生成2个Map Join任务,第一个假设src1是大表,第二个假设src2是大表,这两个任务都放在Condition Task中,此外还有Common Join任务,在执行本阶段任务时,会先通过计算表大小决定前两个Map Join是否可以执行,如果都无法执行则执行Common Join。通过这种机制可以动态地将Common Join转化为Map Join。

mmon Join。通过这种机制可以动态地将Common Join转化为Map Join。

参考资料:https://cloud.tencent.com/developer/article/1481780

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:34:51  更:2021-08-01 14:35:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 21:55:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码