大数据-数据仓库-Hive总结及性能优化

本文详细介绍了Hive作为大数据处理的数据仓库工具,包括其特点、体系结构、内部表与外部表的区别、分区表和桶表的概念,以及Hive的文件格式。此外,还探讨了Hive与关系型数据库的对比,并提供了Hive性能优化的多个策略,如避免数据倾斜、调整MapReduce任务数量、选择合适的存储和压缩格式等。
摘要由CSDN通过智能技术生成

一、关于Hive

1.1 什么是Hive

Hive是构建在Hadoop之上的数据仓库软件。它提供类似sql的查询语句HiveQL对数据进行分析处理,Hive将HiveQL语句转换成一系列MapReduce作业并执行。
目前,Hive除了支持MapReduce计算引擎,还支持Spark和Tez这两种分布式计算引擎,常用于离线批处理。
http://hive.apache.org/

1.2 什么是数据仓库

数据仓库(Data Warehouse),是一个面向主题、集成的、随时间变化的,但信息本身相对稳定的数据集合,用于对管理决策过程的支持。

数据仓库架构图
https://www.jianshu.com/p/0b6414f92442

1.3 Hive的特点
  1. 可通过类SQL来分析大数据,避免了写MapReduce程序来分析数据;
  2. 数据存储在HDFS上,Hive本身不提供数据的存储功能;
  3. Hive将数据映射成数据库和一张张表,库和表的元数据信息一般存在关系型数据库上(如MySQL);
  4. 数据存储方面:可以存储很大的数据集,对数据完整性、格式要求并不严格;
  5. 数据处理方面:不适用于实时计算的场景,适用于离线分析。

二、Hive的体系结构

Hive的元数据:包括表的名字、列、分区、属性(内/外部表)以及表数据所在目录等。将元数据存储在数据库中(metastore),支持mysql、derby、oracle等数据库。
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用生成。
在这里插入图片描述
hive编译安装并修改元数据存储库为MySQL

三、Hive重要概念

3.1 外部表和内部表
内部表(managed table)
  • 默认创建的是内部表,即 create table xxx (xx xxx),存储位置在 hive.metastore.warehouse.dir 设置,默认位置为 /user/hive/warehouse
  • 导入数据的时候是将文件剪切到指定位置,即原有路径下文件将不再存在
  • 删除表时,数据和元数据都将被删除
外部表(external table)
  • 外部表可以在外部系统上,只要有访问权限即可
  • 外部表导入文件时不移动文件,仅仅是添加一个metadata
  • 删除外部表时元数据不会被删除
  • 分辨外部表、内部表可以用 DESCRIBE FORMATTED table_name 命令查看
  • 创建外部表命令添加一个external即可,即 create external table xxx (xxx)
  • 外部表指向的数据发生变化时会自动更新,不用特殊处理
3.2 分区表和桶表
分区(Partitioned)
  • 有时数据是有组织的,比如按时间/类型等分类,而查询数据的时候也经常只关心部分数据,比方说 我只想查询2017年8月8日,此时可以创建分区,查询具体某一天数据时,不需要扫描全部目录,所以会明显优化性能
  • 一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的
  • 创建分区:是在创建表时,使用 Partitioned by (列名1 格式1, 列名2 格式2…) 关键字定义的
  • 增加分区ALTER TABLE table_name ADD PARTITION (day='2018-08-08')
  • 删除分区ALTER TABLE table_name DROP IF EXISTS PARTITION (day='2018-08-08') 外部分区表使用alter table…drop partition语句删除分区,只会删除元数据,相应的目录和文件并不会删除;内部表使用该语句删除分区,既会删除元数据,也会删除相应目录和数据文件。
  • 动态分区和静态分区:主要区别在于是否指定分区目录,或由系统自己选择。

Hive分区表的分区操作

分桶(clustered)
  • 分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性的hash值进行区分,按照取模结果对数据分桶,如取模结果相同的数据记录存放到一个文件
  • 桶表也是一种用于优化查询而设计的表类型。创建桶表时,指定桶的个数、分桶的依据字段,hive就可以自动将数据分桶储存。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率

具体说明分桶:clustered by (user_id) sorted by (leads_id) into 10 buckets

  • clustered by是根据user_id 的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同user_id 的数据放入同一个桶中
  • sorted by 是指定以哪个字段进行排序,排序的好处是,在join操作时可获得较高的效率
  • into 10 buckets 是指定一共分10个桶
  • 在HDFS上存储时,一个桶存入一个文件中,这样根据user_id进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提高查询效率
3.3 Hive文件格式
Hive文件存储格式包括以下几类:
  • TEXTFILE
  • SEQUENCEFILE
  • RCFILE
  • ORCFILE( 0.11以后出现)

其中,TEXTFILE为默认格式,导入数据时会直接将数据文件copy到hdfs上不进行处理;
其他三种格式的表不能直接从本地文件导入数据,数据要先导入到 TEXTFILE 格式的表中,然后再从表中用 insert 导入 SequenceFile,RCFile,ORCFile 表中。

3.4 列式存储和行式存储
Hive文件存储格式包括以下几类:

先来看一张表的存储格式:
在这里插入图片描述

行式存储:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值