大数据开发之离线分析工具 Hive
Hive 是 Facebook 为了解决海量日志数据的分析而开发的,后来开源给了 Apache 软件基金会,可见 Apache 软件基金会是个神奇的组织,大数据培训我们之前学过的很多开源工具都有 Apache 软件基金会的身影。
官网定义:
The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL.
此处版本是 Hive-1.0.0
Hive 的几个特点
Hive 最大的特点是通过类 SQL 来分析大数据,而避免了写 MapReduce 程序来分析数据,这样使得分析数据更容易。
数据是存储在 HDFS 上的,Hive 本身并不提供数据的存储功能
Hive 是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如 MySQL)。
数据存储方面:它能够存储很大的数据集,并且对数据完整性、格式要求并不严格。
数据处理方面:因为 Hive 语句最终会生成 MapReduce 任务去计算,所以不适用于实时计算的场景,它适用于离线分析。
Hive 的核心
Hive 的核心是驱动引擎,驱动引擎由四部分组成:
解释器:解释器的作用是将 HiveSQL 语句转换为语法树(AST)。
编译器:编译器是将语法树编译为逻辑执行计划。
优化器:优化器是对逻辑执行计划进行优化。
执行器:执行器是调用底层的运行框架执行逻辑执行计划。
Hive 的底层存储
Hive 的数据是存储在 HDFS 上的,Hive 中的库和表可以看做是对 HDFS 上的数据做的一个映射。所以 HVIE 必须运行在一个 Hadoop 的集群上的
Hive 语句执行过程
Hive 中的执行器,是将最终要执行的 MapReduce 程序放到 YARN 上以一系列 Job 的方式去执行。
Hive 的元数据存储
Hive 的元数据是一般是存储在 MySQL 这种关系型数据库上的,Hive 和 MySQL 之间通过 MetaStore 服务交互。
Hive 客户端
Hive 有很多种客户端。
cli 命令行客户端:采用交互窗口,用 hive 命令行和 Hive 进行通信。
HiveServer2 客户端:用 Thrift 协议进行通信,Thrift 是不同语言之间的转换器,是连接不同语言程序间的协议,通过 JDBC 或者 ODBC 去访问 Hive。
HWI 客户端:hive 自带的一个客户端,但是比较粗糙,一般不用。
HUE 客户端:通过 Web 页面来和 Hive 进行交互,使用的比较多。
基本的数据类型
DDL 语法
创建数据库
创建一个数据库会在 HDFS 上创建一个目录,Hive 里数据库的概念类似于程序中的命名空间,用数据库来组织表,北京大数据培训在大量 Hive 的情况下,用数据库来分开可以避免表名冲突。Hive 默认的数据库是 default。
创建数据库例子:
查看数据库定义
user_db 是数据库名
hdfs://bigdata-51cdh.chybinmy.com:8020/user/hive/warehouse/userdb.db 是 userdb 库对应的存储数据的 HDFS 上的根目录。
查看数据库列表
创建数据库
创建分区表
Hive 查询一般是扫描整个目录,但是有时候我们关心的数据只是集中在某一部分数据上,比如我们一个 Hive 查询,往往是只是查询某一天的数据,这样的情况下,可以使用分区表来优化,一天是一个分区,查询时候,Hive 只扫描指定天分区的数据。
普通表和分区表的区别在于:一个 Hive 表在 HDFS 上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的。一个分区一个子目录。主要作用是来优化查询性能。
这个例子中,这个日志表以 dt 字段分区,dt 是个虚拟的字段,dt 下并不存储数据,而是用来分区的,实际数据存储时,dt 字段值相同的数据存入同一个子目录中,插入数据或者导入数据时,同一天的数据 dt 字段赋值一样,这样就实现了数据按 dt 日期分区存储。
当 Hive 查询数据时,如果指定了 dt 筛选条件,那么只需要到对应的分区下去检索数据即可,大大提高了效率。所以对于分区表查询时,尽量添加上分区字段的筛选条件。
创建桶表
桶表也是一种用于优化查询而设计的表类型。创建通表时,指定桶的个数、分桶的依据字段,hive 就可以自动将数据分桶存储。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。举例:
对这个例子的说明:
clustered by 是指根据 userid 的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同 userid 的数据放入同一个桶中。而经销商的订单数据,大部分是根据 user_id 进行查询的。这样大部分情况下是只需要查询一个桶中的数据就可以了。
sorted by 是指定桶中的数据以哪个字段进行排序,排序的好处是,在 join 操作时能获得很高的效率。
into 10 buckets 是指定一共分 10 个桶。
在 HDFS 上存储时,一个桶存入一个文件中,这样根据 user_id 进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提供查询效率。
文章来源:极客运维之家
评论