前言

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

正文

  我打开了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 TableSkewed 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. 前端 vue-cli+Webpack 项目开发环境配置、创建一个vue-demo

    一.软件及命令: (1)下载node.js 最新的LTS 版本,下载 msi格式的(直接点击安装即可). (2)命令1:npm install cnpm -g 命令2:cnpm install web ...

  2. JavaScript 简版-菜鸟中的菜鸟2

    JavaScript 输出 JavaScript 没有任何打印或者输出的函数. JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() ...

  3. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  4. No grammar constraints (DTD or XML Schema) referenced in the document.的两种解决办法

    方法一:常用方法 关闭XML验证 工具栏:windows => preferences => xml => xml files => validation => Indi ...

  5. 第十届蓝桥杯JavaC组省赛真题

    试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...

  6. Java实现 LeetCode 453 最小移动次数使数组元素相等

    453. 最小移动次数使数组元素相等 给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 ...

  7. Java实现蓝桥杯突击战

    突击战 你有n个部下,每个部下需要完成一项任务.第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地. 无间断地执行Ji分钟后完成任务.你需要选择交待任务的顺序, 使得所有任务尽早执行完毕(即最后一 ...

  8. Java实现 LeetCode 45 跳跃游戏 II(二)

    45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...

  9. Android中如何使用Listview

    第一步 首先在xml文件中声明一个List View控件,并且标明id (这一步其实不用说,怕自学Android的小白不懂,就好比当初的我,哈哈) <?xml version="1.0 ...

  10. electron内使用vue-slider-component组件报“$attrs is readonly”错误

    解决办法 安装vue-no-ssr插件 https://www.npmjs.com/package/vue-no-ssr npm install vue-no-ssr --save-dev 代码 &l ...