前言

  一直以来我都是从书上、博客上、别人口中听说数据倾斜,自己也从而指导一些解决数据倾斜的方式或者一些容易出现数据倾斜的场景。但是从来没有认真的去发现过,寻求过,研究过。

正文

  我打开了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数据倾斜路的更多相关文章

  1. 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下

    阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...

  2. 大数据平台Hive数据迁移至阿里云ODPS平台流程与问题记录

    一.背景介绍 最近几天,接到公司的一个将当前大数据平台数据全部迁移到阿里云ODPS平台上的任务.而申请的这个ODPS平台是属于政务内网的,因考虑到安全问题当前的大数据平台与阿里云ODPS的网络是不通的 ...

  3. 利用sqoop将hive数据导入导出数据到mysql

    一.导入导出数据库常用命令语句 1)列出mysql数据库中的所有数据库命令  #  sqoop list-databases --connect jdbc:mysql://localhost:3306 ...

  4. Hive数据导入导出的几种方式

    一,Hive数据导入的几种方式 首先列出讲述下面几种导入方式的数据和hive表. 导入: 本地文件导入到Hive表: Hive表导入到Hive表; HDFS文件导入到Hive表; 创建表的过程中从其他 ...

  5. R语言读取Hive数据表

    R通过RJDBC包连接Hive 目前Hive集群是可以通过跳板机来访问 HiveServer, 将Hive 中的批量数据读入R环境,并进行后续的模型和算法运算. 1. 登录跳板机后需要首先在Linux ...

  6. Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!

    转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop ...

  7. Hive数据导入导出的n种方式

    Tutorial-LoadingData Hive加载数据的6种方式 #格式 load data [local] inpath '/op/datas/xxx.txt' [overwrite] into ...

  8. 2个CDH的hive数据同步

    算法和数仓共用一套hive数据: CM: 真实数据: 都存在共享存储: oss, s3,ufile上. CDH配置能访问的权限(key)

  9. KUDU数据导入尝试一:TextFile数据导入Hive,Hive数据导入KUDU

    背景 SQLSERVER数据库中单表数据几十亿,分区方案也已经无法查询出结果.故:采用导出功能,导出数据到Text文本(文本>40G)中. 因上原因,所以本次的实验样本为:[数据量:61w条,文 ...

随机推荐

  1. python argparse总结

    python2.7废除optparse,原因:http://code.google.com/p/argparse/ 说了半天好像是重开了个小号练级 抓紧写下来一会又得忘了 用法: import arg ...

  2. Rocket - diplomacy - NodeHandle相关类

    https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA   介绍NodeHandle相关的类.     ​​   1. NoHandle   顶层类(tra ...

  3. 【HIVE】数据分析HQL的编写方法/思路

    SQL编写一般思路: 1)复杂的查询,先划分为小任务,以降低难度.分别实现各个小任务后,再进行汇总: 2)涉及多表时,先进行联表查询: 3)简单分组,一般只需要group by即可: 4)组内TopN ...

  4. 【HIVE & Spark】将hive引擎换成Spark,运行速度快!怎么换?请看本文

    本教程仅仅是使用spark,能在hive用就行. 1.下载Spark; 2.WinSCP上传spark压缩包到虚拟机: 3.tar -zxvf spark-2.3.3-bin-without-hado ...

  5. Java实现 蓝桥杯VIP 算法训练 非递归(暴力)

    试题 算法训练 非递归 问题描述 当x>1时,Hermite多项式的定义见第二版教材125页.用户输入x和n,试编写"非递归"函数,输出对应的Hermite多项式的值.其中x ...

  6. (Java实现) 洛谷 P1605 迷宫

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  7. Java实现 蓝桥杯 算法训练 Remember the A La Mode(暴力)

    试题 算法训练 Remember the A La Mode 问题描述 Hugh Samston经营着一个为今年的ICPC世界总决赛的参与者提供甜点的餐饮服务.他将会提供上面有冰激凌的饼片.为了满足不 ...

  8. Java实现BFS广度优先查找

    1 问题描述 广度优先查找(Breadth-first Search,BFS)按照一种同心圆的方式,首先访问所有和初始顶点邻接的顶点,然后是离它两条边的所有未访问顶点,以此类推,直到所有与初始顶点同在 ...

  9. java实现第四届蓝桥杯马虎的算式

    马虎的算式 题目描述 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了. 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答 ...

  10. Python如何绘制可视化图?给你一段代码,你能自己做出来吗

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 喜欢的朋友欢迎关注小编,除了分享技术文章之外还有很多福利 没有数据生成的图 ...