前言

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

正文

  我打开了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. Rocket - tilelink - ErrorEvaluator

    https://mp.weixin.qq.com/s/NkbW465NAmhDsETksd2M0g   介绍ErrorEvaluator的实现.   ​​   1. 基本介绍   ErrorEvalu ...

  2. 面试官问我会不会Elasticsearch,我语塞了...

    少点代码,多点头发 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 从今天开始准备给大家带来全新 ...

  3. MethodHandle(方法句柄)系列之二:方法句柄的简单使用

     二话不说,上代码 /** * * @author LiuYeFeng<897908343@qq.com> * @date 2015年4月8日 下午10:41:13 * @CopyRigh ...

  4. CPU efficiency测量标准:DMIPS

    DMIPS:Dhrystone Million Instructions executed Per Second ,主要用于测整数计算能力.   1.Dhrystone:是测量处理器运算能力的最常见基 ...

  5. Java实现 LeetCode 312 戳气球

    312. 戳气球 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left ...

  6. 第五届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 小明带两个妹妹参加元宵灯会.别人问她们多大了,她们调皮地说:"我们俩的年龄之积是年龄之和的6倍" ...

  7. java实现第三届蓝桥杯火柴游戏

    火柴游戏 [编程题](满分34分) 这是一个纵横火柴棒游戏.如图[1.jpg],在3x4的格子中,游戏的双方轮流放置火柴棒.其规则是: 不能放置在已经放置火柴棒的地方(即只能在空格中放置). 火柴棒的 ...

  8. .gitignore文件详细说明

    简介 有些时候,你必须把某些文件放到 Git 工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件.Java编译生成的.class文件.处理这个需求很简单,从不git add它们就可以.但这样 ...

  9. linux安装QT-Designer两种方法

    1.安装Qt-Creator, Qt-Creator自带了qt-designer 2.安装qt5-default,qttools5-dev-tools

  10. 【Spring Boot 】1、Spring Boot 开始

    0.写在最前面: 开始了新的征程,Spring Boot作为下一代的t开发框架,日渐流行.它作为spring mvc  的继承者,虽然二者之间没有多大联系,但是Spring Boot 的出现,大大简化 ...