Hive学习- 一些基础概念

Hive 是什么
  • Hive 基于一个统一的查询分析层,通过SQL语句的方式对HDFS的数据进行查询、统计和分析
  • Hive 是一个SQL解析引擎,将SQL语句转译成MR Job,然后在Hadoop平台上进行,达到快速开发的目的。
  • Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。本质就是Hadoop的目录文件,达到了元数据与数据存储分离的目的
  • Hive本身不存储数据,它完全依赖HDFS和MapReduce
  • Hive的内容是读多写少,不支持对数据的改写和删除(内部表会删除,外部表删除元数据,更多的是覆盖或追加)
  • Hive 中没有定义专门的数据格式,由用户指定,需要指定三个属性:
    • 列分割符
    • 行分割符
    • 读取文件数据的方法

简单来说,Hive就是在Hadoop上架了一层SQL接口,可以将输入的SQL指令翻译成MapReduce去Hadoop上执行,这样就使得开发人员方便的使用SQL来完成海量的数据统计和分析,减少开发MapReduce 的工作量

Hive并不适合更新数据,MapReduce本身是一个离线、高延迟的计算框架,Hive在数据量很小的时候,也需要消耗较长时间来完成,这时候,就显示不出它与Oracle、Mysql等传统数据库库的优势

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

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

Hive 与传统关系型数据特点比较
  • hive 和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop 的分布式文件系统),关系数据库则是服务器本地的文件系统;
  • hive 使用的计算模型是mapreduce,而关系数据库则是自己设计的计算模型;
  • 关系数据库都是为了实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时性很差
  • hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个方面要比hive差很多
Hive 支持的数据模型
  1. Table(Managed Table) 内部表 Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。例如一个表pvs,它在HDFS中的路径为/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的Table数据(不包括External Table)都保存在这个目录中
  2. External Table 外部表 外部表指向已经在HDFS中存在的数据,可以创建Partition。它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。

以上两种也统称为数据表

  1. 分区表 Partition 类似于关系型数据库的表分区,没有那么多分区类型,只支持固定分区,将同一组数据存放至一个固定的分区中
    Partition对应于数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。

注意:
对于查询效率上分区表更快:

  1. 所有数据都放到一个表的文件夹中,查询数据需要扫一遍该文件中所有数据,如果这个文件夹中的数据包含了一年的用户的行为数据,这样扫一遍就是一年所有数据中筛选出需要查询的那一天(或几天)的数据
  2. 如果做了分区,想要获得昨天数据,只需要先扫一遍所有文件夹,将昨天对应日期的文件夹找出来,将昨天对应日期的文件夹找出来,在对该文件夹中数据进行读取分析
  3. 什么时候采用分区,是需要结合实际业务,根据经常要用到的分析口径,在where条件里面经常要被用到的,都可以按照条件进行设计分区。
create table art_dt(sentence string)
partitioned by (dt string)
row format delimited fields terminated by '\n';

insert into table art_dt partition(dt ='20200202')
  1. 分桶表 Bucket 同一个分区内的数据还可以细分,将相同的key再划分至一个桶中
    Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。例如将user列分散至32个bucket,首先对user列的值计算hash,对应hash值为0的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00000;hash值为20的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00020。如果想应用很多的Map任务这样是不错的选择。

‘set hive.enforce.bucketing=true’ 可以自动控制上一轮reduce的数量从而适配bucket的个数,当然用户也可以自主设置mapred.reduce.tasks去适配bucket个数

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

Hive 架构

在这里插入图片描述

  • 用户接口:shell/CLI,jdbc/odbc,webUI Command Line Interface shell 终端命令行,采用交互形式使用Hive 命令行与Hive 进行交互,最常用的一种交互方式;JDBC/ODBC,是Hive的基于JDBC操作提供的客户端,用户通过这连接至Hive Server服务;Web UI,通过浏览器访问Hive
  • 跨语言服务:thrift server 提供了一种能力,让用户可以使用多种不同的语言来操作Hive
  • 底层的Driver:驱动器Driver,编译器Compiler,优化器Optimizer,执行器Executor,Driver 组件完成HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成。生成的逻辑执行计划存储在HDFS中,并随后又MapReduce 调用执行
    • Hive 的核心是驱动引擎,驱动引擎由四部分组成:
      1. 解释器:解释器的作用是将HiveSQL 语句转换为抽象语法树
      2. 编译器:编译器是将语法树编译为逻辑执行计划
      3. 优化器:优化器是对逻辑执行计划进行优化
      4. 执行器:执行器是调用底层的运行框架执行逻辑执行计划
  • 元数据存储,通常存在自己创建的MySQL库
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值