前言:

  互联网应用, 当Mysql单机遇到性能瓶颈时, 往往采用的优化策略是分库分表. 由于互联网应用普遍的弱事务性, 这种优化效果非常的显著.而Hive作为数据仓库, 当数据量达到一定数量时, 查询性能会有所下降, 那如何利用数据的特点进行优化? 分区分桶作为Hive的优化的一个有力武器.

*). 分区(静态、动态)

  Hive没有索引, 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。倘若只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。分区表指的是在创建表时指定的partition的分区空间。 
  1). 静态分区
  hive默认采用静态分区, 数据的导入需至少指定一个分区字段

  1.1). 创建分区表

CREATE TABLE tb_part_shop (
shop_id int,
shop_name string,
shopkeeper string
) PARTITIONED BY (province_id int, city_id int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

  1.2). 描述分区表(describe extended <table_name>)
  DESCRIBE EXTENDED tb_part_shop;

> DESCRIBE EXTENDED tb_part_shop;
OK
shop_id int None
shop_name string None
shopkeeper string None
province_id int None
city_id int None # Partition Information
# col_name data_type comment province_id int None
city_id int None

  1.3). 导入分区和数据

  ALTER TABLE tb_part_shop ADD PARTITION (province_id = 1001, city_id = 10001);

  数据内容
  33068201 Wal-Mart wal-mart
  33068202 Carrefour carrefour

  LOAD DATA LOCAL INPATH '/path/to/data.txt' INTO TABLE tb_part_shop PARTITION(province_id = 1001, city_id = 10001);

  对于小数据量导入, 可采用如下的语句来实现
  INSERT INTO VALUES() 等价实现 INSERT INTO TABLE <table_name> SELECT ... FORM <table_name> LIMIT 1;

  1.4). 分区表的目录结构

  分区表, 在hdfs中的目录结构如图所示:

  2). 动态分区表
  2.1). 设置开启动态分区开关
  set hive.exec.dynamic.partition=true;

  2.2). 严格模式

  set hive.exec.dynamic.partition.mode=strict; # strict/nonstrict
  默认为strict, 对于分区表, 若插入语句没有指定至少一个静态分区字段, 则执行失败

  如下例子:
  set hive.exec.dynamic.partition.mode=strict;
  hive> insert into table tb_part_shop select 1, "2haodian", "shopper", 1001, 20012 from tb_user limit 1;
  FAILED: SemanticException 1:18 Need to specify partition columns because the destination table is partitioned. Error encountered near token 'tb_part_shop'

  2.3). 其他限制条件
  set hive.exec.max.dynamic.partitions=3000; # 具体的数值, 表示总共能创建的动态分区数
  set hive.exec.max.dynamic.partitions.pernode=1000; # 在mapper/reducer节点中, 允许创建的分区数

  SHOW PARTITIONS tb_part_shop;
  

  分区适合于字段值可枚举, 离散有限个数值, 比如按时间年/月/日, 省份/市区号编码, 而不适合取值特别多的应用场景, 因为一个值就对应一个目录, 目录无休止的增加对查询的性能, 反而是有害的.

*). 分桶
  Hive采用对列值哈希来组织数据的方式, 称之为分桶, 适合采样和map-join.
  看看分桶表如何建立
  1). 创建分桶表

CREATE TABLE tb_bucket_shop (
shop_id int,
shop_name string,
shopkeeper string
) CLUSTERED BY (shop_id) INTO 4 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

  2). 数据导入
  set hive.enforce.bucketing=true;
  INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name, shopkeeper FROM tb_part_shop CLUSTER BY shop_id;

  若没有使用hive.enforce.bucketing属性, 则需要设置和分桶个数相匹配的reducer个数, 同时SELECT后添加CLUSTER BY
  set mapred.reduce.tasks=4;
  INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name, shopkeeper FROM tb_part_shop CLUSTER BY shop_id;

  分桶适合于sampling, 不过其数据正确的导入到hive表中, 需要用户自己来保证, 因为table中信息仅仅是元数据, 而不影响实际填充表的命令.

总结:
  分区分桶是hive性能优化的一个手段, 不同的字段, 其数值属性不同, 其对应的优化方式也不同. 也不能简单的认为分区分桶对应传统关系型数据库的分库分表, 完全不一样.

Hive 实战(2)--hive分区分桶实战的更多相关文章

  1. 大数据入门第十一天——hive详解(二)基本操作与分区分桶

    一.基本操作 1.DDL 官网的DDL语法教程:点击查看 建表语句 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data ...

  2. hive分区分桶

    目录 1.分区 1.1.静态分区 1.1.1.一个分区 1.1.2.多个分区 1.2.动态分区 2.分桶 1.分区 如果一个表中数据很多,我们查询时就很慢,耗费大量时间,如果要查询其中部分数据该怎么办 ...

  3. 深入浅出Hadoop实战开发(HDFS实战图片、MapReduce、HBase实战微博、Hive应用)

    Hadoop是什么,为什么要学习Hadoop?     Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运 ...

  4. 【Hive学习之五】Hive 参数&动态分区&分桶

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  5. 大数据开发实战:Hive优化实战2-大表join小表优化

    4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...

  6. Hive学习笔记——Hive中的分桶

    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...

  7. Hive动态分区和分桶(八)

    Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 ​ hive的静态分区需要用户在插入数据的时候必须手动指定hive的分区字段值,但是这样的话会导致用户的操作复杂度提高,而且在 ...

  8. 《OD大数据实战》Hive入门实例

    官方参考文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual 一.命令行和客户端 1. 命令窗口 1)进入命令窗口 hi ...

  9. webpack4 中的最新 React全家桶实战使用配置指南!

    最新React全家桶实战使用配置指南 这篇文档 是吕小明老师结合以往的项目经验 加上自己本身对react webpack redux理解写下的总结文档,总共耗时一周总结下来的,希望能对读者能够有收获, ...

随机推荐

  1. [翻译]LSP程序的分类

    翻译的太垃圾,不建议其它人阅读本文. Note:LSP现在已经不推荐使用.自windows8和windows Server2012开始,使用Windows Filtering Platform. Wi ...

  2. 微信小程序注册页面

    Page Page() 函数用来注册一个页面.接受一个 object 参数,其指定页面的初始数据.生命周期函数.事件处理函数等. object 参数说明: 属性 类型 描述 data Object 页 ...

  3. .NET IL学习笔记(一)

    参考资料: 1. <.NET IL Assembler> 2. NGEN代码产生器 3. NGEN的使用 4. IL编辑器下载 5. IL编辑器的使用 知识点: ● Common Lang ...

  4. hdu3341Lost's revenge(ac自动机+dp)

    链接 类似的dp省赛时就做过了,不过这题卡内存,需要把当前状态hash一下,可以按进制来算出当前的状态,因为所有的状态数是不会超过10*10*10*10的,所以完全可以把这些存下来. 刚开始把trie ...

  5. sans-serif

    sans-serif无衬线字体,是一类字体,它在操作系统或者浏览器里是可以设置的,你可以把它设置成宋体,也可以设置成微软雅黑,而设置的这种字体肯定是当前系统里存在的字体,所以使用这个字体就一肯能显示出 ...

  6. jedis,spring-redis-data 整合使用,版本问题异常以及解决。

    最近整合使用redis spring-redis 出现了一下问题 spring:3.2.4.RELEASE jedis: jedis  2.4.2 spring-data-redis: 1.5.2.R ...

  7. WCF初探-20:WCF错误协定

    WCF错误协定概述 在所有托管应用程序中,处理错误由 Exception 对象表示. 在基于 SOAP 的应用程序(如 WCF 应用程序)中,服务方法使用 SOAP 错误消息来传递处理错误信息. SO ...

  8. Halcon 10.0 Sample:完整性检查(圆形)

    * ball.hdev: Inspection of Ball Bonding * 球接合检查 Comment Time:// *核心思想:.白色区域用作自动ROI,黑色区域是目标 * .Openin ...

  9. 1362. Classmates 2

    http://acm.timus.ru/problem.aspx?space=1&num=1362 水题,树形DP 代码: #include<iostream> #include& ...

  10. 关于 php mysql pdo cannot find driver 解决方案

    1.下载 文件 或者 进入 在PHP源码包中进入ext/pdo_mysql http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 2.解压文件tar zxvf PDO ...