寻找hive数据倾斜路
前言
一直以来我都是从书上、博客上、别人口中听说数据倾斜,自己也从而指导一些解决数据倾斜的方式或者一些容易出现数据倾斜的场景。但是从来没有认真的去发现过,寻求过,研究过。
正文
我打开了hive官网 点开了 document文档 然后呢,一个一个的去找倾斜的地方,找了一会儿发现了一个地方,看到了一个词skew,没错这个就是倾斜的意思,Skewed Join Optimization于是我就跟着进去了,那么我先不管三七二十一解读一下吧!
The problem
首先是两个大表的join通过mr作业的集合来基于key对他们进行表排序后再join他们。Mapper给全部的行指定一个特定的key然后到下游相同的reducer。
e.g:假设我们有一个A表又一列“id“字段,有值1,2,3,4;然后B表也有这么一列,有值1,2,3。
select A.id from A join B on A.id = B.id
Mapper去读取表基于key去分组然后发给相应下游的reducer。例如:行数据 key是1的会发送R1,2的发到Reducer R2 如此这样。这些reducer会跨越从A表和B表生成值,然后写出去。R4从A获取,但是不会生成任何结果。因为B没有4.
现在我们假设A表的1倾斜特别高。R2和R3会完成的很快但是R1要持续一段时间,这样就成了瓶颈。如果用户有关于倾斜的信息,瓶颈可以通过以下方式来避免:
执行两个不受影响的查询:
select A.id from A join B on A.id = B.id where A.id <> 1;
select A.id from A join B on A.id = B.id where A.id = 1 and B.id = 1;
这样第一个查询语句就不会产生任何倾斜了,因此所有的reducer就会在大约相同的时间完成。如果我们假设B有很少的B.id = 1的数据,然后他会被写到内存中。因此join可以提高很高的性能通过把B的值存储在内存哈希表中。这种方式,join可以完成通过mapper自己数据就不需要到reducer计算了。两个查询的部分结果就可以合并获取到最终的结果了。很精妙啊,之前从来没来官网看这个地方。今天的目的也是为了帮助工作中一些仓库同学有时候作业慢如何解决而产生的一个念头,确实还是有收获的。
优势:
其实优势已经很明显了,如果key倾斜小数量弥补了数据的大部分,那么就不会成为瓶颈了。
劣势:
AB表不得不读取处理两次
因为部分结果,从而不得不读取写入两次
用户必须有意识的去发现数据中的倾斜并且需要手动去处理以上过程
我们可以提高这种情况通过尝试减少数据倾斜的过程。首先读取B并且存储key=1在内存哈希表。现在mapper读取A然后如下操作:
如果他有key 1,那么用哈希B去计算结果
对于其他的key,发送到reducer。
这种方式,我们最后只读B两次。A中的倾斜值只是读取和处理在mapper中,不会发送到reducer。剩下的A的key仅在一个单独的mr。
这种场景是,假设B的倾斜的数据只是很少可以被存储在内存中,倾斜的数据是大部分在A中。
hive增强
实现:在Hive0.10.0,表创建可以作为倾斜方式或者我们可以修改为倾斜表。此外,倾斜表可以列表块特征通过指定存储方式为DIRECTORIES选项。更详细的DDL查看:Create Table, Skewed Tables, and Alter Table Skewed or Stored as Directories.
看吧,应不是这一个地方,后面都是倾斜的document。那就接着打开看,我们在创建表的时候,可以通过指定某几个字段值来说明,我们标志这几个是倾斜的值。
CREATE TABLE list_bucket_single (key STRING, value STRING)
SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES]; CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING) SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];我们也可以修改table为倾斜表
ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...) ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...] [STORED AS DIRECTORIES];禁止倾斜
ALTER TABLE table_name NOT SKEWED;
结尾
好吧,就这样吧。这算自己主动学习了一下,有时候具体业务还需要具体来分析表的数据。
be sure to practive
寻找hive数据倾斜路的更多相关文章
- 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...
- 大数据平台Hive数据迁移至阿里云ODPS平台流程与问题记录
一.背景介绍 最近几天,接到公司的一个将当前大数据平台数据全部迁移到阿里云ODPS平台上的任务.而申请的这个ODPS平台是属于政务内网的,因考虑到安全问题当前的大数据平台与阿里云ODPS的网络是不通的 ...
- 利用sqoop将hive数据导入导出数据到mysql
一.导入导出数据库常用命令语句 1)列出mysql数据库中的所有数据库命令 # sqoop list-databases --connect jdbc:mysql://localhost:3306 ...
- Hive数据导入导出的几种方式
一,Hive数据导入的几种方式 首先列出讲述下面几种导入方式的数据和hive表. 导入: 本地文件导入到Hive表: Hive表导入到Hive表; HDFS文件导入到Hive表; 创建表的过程中从其他 ...
- R语言读取Hive数据表
R通过RJDBC包连接Hive 目前Hive集群是可以通过跳板机来访问 HiveServer, 将Hive 中的批量数据读入R环境,并进行后续的模型和算法运算. 1. 登录跳板机后需要首先在Linux ...
- Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!
转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop ...
- Hive数据导入导出的n种方式
Tutorial-LoadingData Hive加载数据的6种方式 #格式 load data [local] inpath '/op/datas/xxx.txt' [overwrite] into ...
- 2个CDH的hive数据同步
算法和数仓共用一套hive数据: CM: 真实数据: 都存在共享存储: oss, s3,ufile上. CDH配置能访问的权限(key)
- KUDU数据导入尝试一:TextFile数据导入Hive,Hive数据导入KUDU
背景 SQLSERVER数据库中单表数据几十亿,分区方案也已经无法查询出结果.故:采用导出功能,导出数据到Text文本(文本>40G)中. 因上原因,所以本次的实验样本为:[数据量:61w条,文 ...
随机推荐
- Bitwarden_rs搭建
最近LastPass网络极其不稳定,正好闲下来找到了Bitwarden_rs这个替代品,感觉不错,分享记录下部署过程. 一.Docker方式部署 #获取镜像 docker pull bitwarden ...
- MyBatis(二)参数传递和自定义结果集
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.myBatis的注解使用方式 package com.webcode.mapper; import ...
- Java实现 蓝桥杯 算法训练 寻找数组中最大值
算法训练 寻找数组中最大值 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 对于给定整数数组a[],寻找其中最大值,并返回下标. 输入格式 整数数组a[],数组元素个数小于1等于10 ...
- Java实现 LeetCode 450 删除二叉搜索树中的节点
450. 删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引 ...
- Java实现 蓝桥杯VIP 算法训练 P0504
算法训练 P0504 时间限制:1.0s 内存限制:256.0MB Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,Uncl ...
- Java实现 LeetCode 240 搜索二维矩阵 II
public static boolean searchMatrix(int[][] matrix, int target) { if(matrix.length == 0) return false ...
- Java实现 蓝桥杯 历届试题 约数倍数选卡片
问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字" ...
- mysql基础-数据类型和sql模式-学习之(三)
0x01 mysql的两种方向: 开发DBA:数据库设计(E-R关系图).sql开发.内置函数.存储历程(存储过程和存储函数).触发器.时间调度器(event scheduler) 运维----> ...
- 深入浅出-iOS Block原理和内存中位置
Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 #简介 今天回顾一下blcok,基本 ...
- oracle使用+简写左关联出现的结果集不一致问题
这是使用(+)的sql语句(已简写) select a.id,b.num from a,b where a.id=b.id(+) and b.num>10 这是使用left join的sql语句 ...