天天看点

Hive

hive是基于hadoop的数仓解决方案。简单来说hive就是在hadoop上接了一个sql接口。将sql翻译成mapreduce程序去执行,节约成本。

hive架构图:

Hive
Hive

如图中所示,hive通过给用户提供的一系列交互接口,接收到用户的指令(sql),使用自己的driver,结合元数据(metastore),将这些指令翻译成mapreduce,提交到hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

hive组件包括ui组件、driver组件(complier,optimizer和executor)、metastore组件、cli(command line interface, 命令行接口)、jdbc/odbc、thrift server和hive web interface(hwi)等。

driver组件:核心组件,整个hive的核心,该组件包括complier(编译)、optimizer(优化器)和executor(执行器),它们的作用是对hive sql语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。

metastore组件:元数据服务组件,这个组件存储hive的元数据。hive的元数据存储在关系数据库里,hive支持的关系数据库有derby和mysql。默认情况下,hive元数据保存在内嵌的derby数据库中,只能允许一个会话链接,只适合简单的测试。实际生产中不适用,为了支持多用户会话,需要一个独立的元数据库(如mysql),hive内部对mysql提供了很好的支持。

cli:命令行接口。

thrift server:提供jdbc和odbc接入的能力,用来进行可扩展且跨语言 的服务开发。hive集成了该服务,能让不同的编程 语言调用hive的接口。

hive web interface(hwi):hive客户端提供了一个通过网页方式访问hive所提供的服务,这个接口对应hive的hwi组件。

在使用过程中,只需要将hive看做是一个数据库就行,本身hive也具备了数据库的很多特性和功能。

hive可以使用hql(hive sql)很方便的完成对海量数据的统计汇总,即席查询和分析,除了很多内置的函数,还支持开发人员使用其他编程语言和脚本语言来自定义函数。

但是,由于hadoop本身是一个批处理,高延迟的计算框架,hive使用hadoop作为执行引擎,自然也就有了批处理,高延迟的特点,在数据量很小的时候,hive执行也需要消耗较长时间来完成,这时候,就显示不出它与oracle,mysql等传统数据库的优势。hive不能提供数据排序和查询缓存功能,也不提供在线事务处理、更不提供实时的查询和记录级的更新,但它能很好的处理不变的大规模数据集,当然这是 和其根植于hadoop近似线性的可扩展性分不开的。

此外,hive对事物的支持不够好,原因是hdfs本身就设计为一次写入,多次读取的分布式存储系统,因此,不能使用hive来完成诸如delete、update等在线事务处理的需求。

因此,hive擅长的是非实时的、离线的、对响应及时性要求不高的海量数据批量计算,即席查询,统计分析。

数据单元:

databases:数据库。概念等同于关系型数据库的schema,不多解释;

tables:表。概念等同于关系型数据库的表,不多解释;

partitions:分区。概念类似于关系型数据库的表分区,没有那么多分区类型,只支持固定分区,将同一组数据存放至一个固定的分区中。

buckets (or clusters):分桶。同一个分区内的数据还可以细分,将相同的key再划分至一个桶中,这个有点类似于hash分区,只不过这里是hash分桶,也有点类似子分区吧。

原始数据类型:

整型

tinyint — 微整型,只占用1个字节,只能存储0-255的整数。

smallint– 小整型,占用2个字节,存储范围–32768 到 32767。

int– 整型,占用4个字节,存储范围-2147483648到2147483647。

bigint– 长整型,占用8个字节,存储范围-263到263-1。

布尔型

boolean — true/false

浮点型

float– 单精度浮点数。

double– 双精度浮点数。

字符串型

string– 不设定长度。

复合数据类型:

structs:一组由任意数据类型组成的结构。比如,定义一个字段c的类型为struct {a int; b string},则可以使用a和c.b来获取其中的元素值;

maps:和java中的map没什么区别,就是存储k-v对的;

arrays:数组;

hivesql:

hive sql是hive用户使用hive的主要工具。hive sql是类似于ansi sql标准的sql语言,但两者又不完全相同。hive sql和mysql的sql方言最为接近,但两者之前也存在显著差异,比如hive不支持行级数据插入、更新和删除,也不支持事务等。

hive数据库:hive中的数据库从本质上来说仅仅是一个目录或命名空间,但是对于具有很多用户和组的集群来说,这个概念非常有用。首先,这样可以避免表命名冲突;其次,它等同于数据型数据库在的数据库概念呢,是一组表或表的逻辑组,非常容易理解。

hive表:hive中的表(table)和关系数据库中的table在概念上是类似的,每个table在hive在都有一个对应的目录存储数据,如果么有指定表的数据库,那么hive会通过{hive_home}/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir属性来使用默认值(一般是 /user/hive/warehouse, 也可以根据实际的情况来修改这个配置),所有的table数据(不包括外部表)都保存在这个目录。

hive分为两类,即内部表和外部表。所谓内部表(managed table)即hive管理的表,hive内部表的管理既包含逻辑以及语法上的,也包含实际物理意义上的,即创建hive内部表时,数据将真实存在于表所在的目录内,删除内部表时,物理数据和文件也一并删除。外部表(external table )则不然,其管理仅仅是在逻辑和语法意义上的,即新建表仅仅是指向一个外部目录而已。同样,删除时也不物理删除外部目录,而仅仅是将引用和定义删除。

分区和桶:hive 将表划分为分区(partition),partition根据分区字段进行。分区可以让数据的部分查询变得更快。表或者分区可以进一步被划分为桶(bucket)。桶通常在原始数据中加入一些额外的结构,这些结构可以用于高效查询。例如,基于用户id的分桶可以使用基于用户的查询非常快。

分区:假设日志数据中,每条记录都带有时间戳。如果根据时间来分区,那么同一天的数据将被划分到同一个分区中。针对某一天或某几天数据的查询将会变得很高效,因为只需要扫描对应分区的文件。分区并不会导致跨度的的查询变得低效。

https://www.jianshu.com/p/199cb5b76692

下一篇: HIVE