hadoop系列四 ——hive基本概念

引入原因

  • 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce代码
  • 对于统计任务,只能由懂MapReduce的程序员才能搞定
    耗时耗力,更多精力没有有效的释放出来

什么是Hive

Hive基于一个统一的查询分析层,通过SQL语句的方式对HDFS上的数据进行询、统计和分析
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库。

Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的

1)Hive处理的数据存储在HDFS

2)Hive分析数据底层的实现是MapReduce

3)执行程序运行在Yarn上

4)Hive的内容是读多写少,不支持对数据的改写和删除

5)Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。本质就是Hadoop的目录/文件达到了元数据与数据存储分离的目的

6)Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:
– 列分隔符 空格,‘,’‘\t’
– 行分隔符’\n’
– 读取文件数据的方法

Hive的优缺点

优点:

1、可扩展性,横向扩展,Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务 横向扩展:通过分担压力的方式扩展集群的规模 纵向扩展:一台服务器cpu i7-6700k 4核心8线程,8核心16线程,内存64G => 128G

2、延展性,Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数

3、良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行

缺点:

1、Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结 果导入到文件中(当前选择的 hive-2.3.2 的版本支持记录级别的插入操作)

2、Hive 的查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能 用在交互查询系统中。(查的慢)

3、Hive 不支持事务增删改(因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而 不是 OLTP(联机事务处理),这就是数据处理的两大级别)。

Hive 和 RDBMS 的对比

在这里插入图片描述总结:

Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库。

与 传 统 关 系 数 据 特 点 比 较

  1. hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统)
    关系数据库则是服务器本地的文件系统;

  2. hive使用的计算模型是mapreduce,而关系数据库则是自己设计的计算模型;

  3. 关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,性很差

  4. Hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个要比Hive差很多。

Hive的架构

在这里插入图片描述

Hive的数据组织

1、Hive 的存储结构包括数据库、表、视图、分区和表数据等。数据库,表,分区等等都对 应 HDFS 上的一个目录。表数据对应 HDFS 对应目录下的文件。

2、Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式,因为 Hive 是读模式 (Schema On Read),可支持 TextFile,SequenceFile,RCFile 或者自定义格式等

3、 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据

  • Hive 的默认列分隔符:控制符 Ctrl + A,\x01 Hive 的

  • Hive 的默认行分隔符:换行符 \n

4、Hive 中包含以下数据模型:

  • database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

  • table:在 HDFS 中表现所属 database 目录下一个文件夹

  • external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径

  • partition:在 HDFS 中表现为 table 目录下的子目录

  • bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的多个文件

  • view:与传统数据库类似,只读,基于基本表创建

5、Hive 的元数据存储在 RDBMS 中,除元数据外的其它所有数据都基于 HDFS 存储。默认情 况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的 测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。

6、Hive 中的表分为内部表、外部表、分区表和 Bucket 表

内部表和外部表的区别:

  • 删除内部表,删除表元数据和数据
  • create table 内部表
  • 在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它
    自己来管理的!
  • 删除外部表,删除元数据,不删除数据
  • create external table location ‘hdfs_path’外部表 (必须是文件)
  • 而删除外部表的时候,Hive仅仅删除
    外部表的元数据,数据是不会删除的!

内部表和外部表的使用选择:

大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于 选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。

使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中

使用外部表的场景是针对一个数据集有多个不同的 Schema

通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在 HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部 表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。
分区表
分区表的实质是:在表目录中为数据文件创建分区子目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读取数据的范围。

比如,网站每天产生的浏览记录,浏览记录应该建一个表来存放,但是,有时候,我们可能只需要对某一天的浏览记录进行分析
这时,就可以将这个表建为分区表,每天的数据导入其中的一个分区;
当然,每日的分区目录,应该有一个目录名(分区字段)

分区表和分桶表的区别

Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同 时表和分区也可以进一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的 HashPartitioner 的原理类似。

分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所 以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列 形成的多个文件,所以数据的准确性也高很多

发布了44 篇原创文章 · 获赞 0 · 访问量 869

猜你喜欢

转载自blog.csdn.net/heartless_killer/article/details/102526323