主要内容:

  • 介绍OLAP和OLTP区别
  • 介绍Hive的概念、架构,对比内部表和外部表,行存储和列存储

1、数据仓库

  • 数据仓库的英文名称为Data Warehouse,可简写为DW。作为商业智能的核心组件,数据仓库将来自许多不同来源的数据汇集到一个数据存储中心,以支持数据分析、数据挖掘、人工智能 (AI) 和机器学习。数据仓库使组织能够以标准数据库无法做到的方式,对大量历史数据进行强大的分析。在企业中,数据仓库作为企业全部业务数据的集中存储中心(解决数据孤岛问题),并在数仓中进行数据指标迭代开发计算。
  • 数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。
  • 主要特征:数据仓库是面向主题的集成的相对稳定的反映历史变化的数据集合,用以支持管理决策。

1.1 数据仓库(OLAP)与数据库(OLTP)的区别

首先要明白,数据仓库的出现,并不是要取代数据库。在数据科学领域,有两种类型的数据处理系统:OLAP(Online Analytical Processing)是联机分析处理,OLTP(Online Transaction Processing)是联机事务处理。各自都有各自的应用场景。

The question isn’t which to choose, but how to make the best use of both processing types for your situation.

  • 主要区别在于:OLAP使用数据来获得有价值的见解,而OLTP则纯粹是可操作的。OLTP是面向事务的,是为捕获数据而设计的,而OLAP是面向分析的,是为分析数据而设计的。
  • 侧重点不同:OLAP侧重基于海量数据进行复杂分析,为了推动业务决策,查询通常涉及大量数据。相比之下,OLTP侧重在数据库中进行简单的更新、插入、删除,查询通常只涉及部分少量数据。
  • 数据源不同:OLAP具有多维分析模式,需要从多个业务库接入数据。不同的OLTP库可以作为OLAP库的数据来源。数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的大型数据库。
  • 数据冗余性不同:OLAP有意引入冗余,OLTP有意避免冗余。
  • 处理时间不同:OLAP响应时间比OLTP慢几个数量级,OLAP要求时效性和实时性。OLAP工作负载是读密集型,涉及大量的数据集。OLTP工作负载是进行简单的读写操作,需要更少的时间和更少的存储空间。

2、Hive

2.1 Hive的概念

  • hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
  • 其本质是将SQL转化为MR任务进行运算,底层由HDFS来提供数据的存储支持。

Snipaste_2019-07-10_23-23-31
hive与数据库的区别:

2018040319335283

2.2 Hive的架构原理

2019-07-11_11-08-35
hive1

2.3 内部表和外部表

默认创建的都是内部表,也叫管理表(Managed Table)。因为这种表,hive控制着数据的生命周期。默认情况下,内部表的数据存储在hive.metastore.warehouse.dir(默认/user/hive/warehouse)。外部表在创建的时候需要加上external关键字。在创建表时可以自己指定目录位置,location字段可以指定,也可以不指定。指定就是数据存放的具体目录,不指定就是使用默认目录 /user/hive/warehouse。外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉。

内部表和外部表的区别:

  • 创建内部表时:会将数据移动到数据仓库指向的路径;
  • 创建外部表时:仅记录数据所在路径,不对数据的位置做出改变;
  • 删除内部表时:删除表元数据和数据;
  • 删除外部表时,删除元数据,不删除数据。

内部表和外部表的使用时机:

  • 内部表由于删除表的时候会同步删除HDFS的数据文件,所以如果一个表仅仅是你独占使用,其他人不使用的时候就可以创建内部表;如果一个表的文件数据其他人也要使用,那么就创建外部表。

  • 一般外部表都是用在数据仓库的ODS层。

  • 内部表都是用在数据仓库的DW层。

2.4 分区表和分桶表

如果hive当中所有的数据都存入到一个文件夹下面,那么在使用MR计算程序的时候,读取一整个目录下面的所有文件来进行计算,就会变得特别慢,因为数据量太大了。实际工作当中一般都是计算前一天的数据,所以我们只需要将前一天的数据挑出来放到一个文件夹下面即可,专门去计算前一天的数据。这样就可以使用hive当中的分区表,通过分文件夹的形式,将每一天的数据都分成为一个文件夹,然后我们计算数据的时候,通过指定前一天的文件夹即可只计算前一天的数据。在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个小的文件,这样每次操作一个小的文件就会很容易了。同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天,或者每小时进行切分成一个个的小的文件,这样去操作小的文件就会容易得多了。

分桶是相对分区进行更细粒度的划分。分区在HDFS上的表现形式是一个目录,分桶则是一个单独的文件。分桶则是指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀地分发到各个桶文件中。

因此,分区就是分目录,分桶就是分文件。目的都是细化数据管理,加快查询速度。

2.5 Hive表的数据压缩格式

2.5.1 压缩格式的评级标准

  • 压缩比:压缩比越高,压缩后文件越小,所以压缩比越高越好。
  • 压缩时间:越快越好。
  • 压缩的格式文件是否可切割:可以分割的格式允许单一文件由多个Mapper程序处理,可以更好的并行化。

2.5.2 常见的压缩格式

压缩方式 压缩比 压缩速度 解压缩速度 是否可分割
gzip 13.4% 21 MB/s 118 MB/s
bzip2 13.2% 2.4MB/s 9.5MB/s
lzo 20.5% 135 MB/s 410 MB/s
snappy 22.2% 172 MB/s 409 MB/s

2.5.3 Hadoop编/解码器方式

压缩格式 对应的编码/解码器
DEFLATE org.apache.hadoop.io.compress.DefaultCodec
Gzip org.apache.hadoop.io.compress.GzipCodec
BZip2 org.apache.hadoop.io.compress.BZip2Codec
LZO com.hadoop.compress.lzo.LzopCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec

2.6 Hive表的文件存储格式

目前大数据存储有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based)。Hive支持的存储数据的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列式存储)。

2.6.1 行式存储和列式存储

clip_image002

行式存储下一张表的数据都是放在一起的,但列式存储下都被分开保存了。列式存储是相对于传统关系型数据库的行式存储来说的。简单来说两者的区别就是如何组织表
Row-based storage storesatable in a sequence of rows.
基于行的存储按行顺序存放数据。
Column-based storage storesatable in a sequence of columns.
基于列的存储可按列顺序存放数据。

优缺点:

  • 数据写入:
    • 写入效率高。行存储的写入是一次性的,消耗的时间比列式存储少,并且能保证数据的完整性。
    • 写入效率低。列存储需要把一行数据拆成单列保存,写入的次数明显比行存储多,时间消耗大。
  • 数据读取:
    • 存在冗余。行存储在读取数据时,通常将一行数据全部读出,如果只需要部分列,就会存在冗余列。
    • 不存在冗余。列存储在读取数据时,每次读取的数据是集合的一段或者全部,不存在冗余性问题。这对数据完整性要求不高的大数据处理领域,比如互联网,尤为重要。
  • 数据压缩:
    • 列存储中每一列的数据类型一致,数据特征相似,可以高效压缩。有利于数据存储和网络传输。

在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy。