Hive

前言

Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转换为 MapReduce 任务执行。

数据组织格式

下面是直接存储在HDFS上的数据组织方式

  • Table:每个表存储在HDFS上的一个目录下
  • Partition(可选):每个Partition存储再Table的子目录下
  • Bucket(可选):某个Partition根据某个列的hash值散列到不同的Bucket中,每个Bucket是一个文件

用户可以指定Partition方式和Bucket方式,使得在执行过程中可以不用扫描某些分区。看上去Hive是先指定Partition方式,再在相同的Partition内部调用hash函数;GreenPlum是先指定Hash方式,在Hash分片内部,指定不同的分区方式。

Hive 架构

由上图可知,hdfs和 mapreduce 是 hive 架构的根基。

  • MetaStore:存储和管理Hive的元数据,使用关系数据库来保存元数据信息。
  • 解释器和编译器:将SQL语句生成语法树,然后再生成DAG,成为逻辑计划
  • 优化器:只提供了基于规则的优化
    • 列过滤:只查询投影列
    • 行过滤:子查询where语句包含的partition
    • 谓词下推:减少后面的数据量
    • Join方式
      • Map join:一大一小的表,将小表广播(指定后在执行前统计,没有数据直方图)
      • shuffle join:按照hash函数,将两张表的数据发送给join
      • sort merge join:排序,按照顺序切割数据,相同的范围发送给相同的节点(运行前在后台创建立两张排序表,或者建表的时候指定)
  • 执行器:执行器将DAG转换为MR任务

Hive 特点

  • Hive 最大的特点是 Hive 通过类 SQL 来分析大数据,而避免了写 MapReduce 程序来分析数据,这样使得分析数据更容易
  • Hive 是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如 MySQL)
  • Hive 本身并不提供数据的存储功能,数据一般都是存储在 HDFS 上的(对数据完整性、格式要求并不严格)
  • Hive 很容易扩展自己的存储能力和计算能力,这个是继承自 hadoop 的(适用于大规模的并行计算)
  • Hive 是专为 OLAP 设计,不支持事务

Hive 流程

执行流程详细解析

Step 1:UI(user interface) 调用 executeQuery 接口,发送 HQL 查询语句给 Driver

Step 2:Driver 为查询语句创建会话句柄,并将查询语句发送给 Compiler, 等待其进行语句解析并生成执行计划

Step 3 and 4:Compiler 从 metastore 获取相关的元数据

Step 5:元数据用于对查询树中的表达式进行类型检查,以及基于查询谓词调整分区,生成计划

Step 6 (6.1,6.2,6.3):由 Compiler 生成的执行计划是阶段性的 DAG,每个阶段都可能会涉及到 Map/Reduce job、元数据的操作、HDFS 文件的操作,Execution Engine 将各个阶段的 DAG 提交给对应的组件执行。

Step 7, 8 and 9:在每个任务(mapper / reducer)中,查询结果会以临时文件的方式存储在 HDFS 中。保存查询结果的临时文件由 Execution Engine 直接从 HDFS 读取,作为从 Driver Fetch API 的返回内容。

容错(依赖于 Hadoop 的容错能力)

  1. Hive 的执行计划在 MapReduce 框架上以作业的方式执行,每个作业的中间结果文件写到本地磁盘,从而达到作业的容错性。
  2. 最终输出文件写到 HDFS 文件系统,利用 HDFS 的多副本机制来保证数据的容错性。

Hive缺陷

  1. MapReduce:
    1. Map任务结束后,要写磁盘
    2. 一个MapReduce任务结束后,需要将中间结果持久化到HDFS
    3. DAG生成MapReduce任务时,会产生无谓的Map任务
    4. Hadoop在启动MapReduce任务要消耗5-10秒,需要多次启动MapReduce任务

SparkSQL

SparkSQL在架构上和Hive类似,只是底层把MapReduce替换为Spark

除了替换底层执行引擎,SparkSQL还做了3个方面的优化

  1. 可以基于内存的列簇存储方案
  2. 对SQL语句提供基于代价优化
  3. 数据共同分片

基于代价优化

SparkSQL会根据数据的分布,统计分片大小,热点数据等等的数据直方图。根据数据直方图可以完成:

  1. 根据表的大小动态改变操作符类型(join类型,aggeragate类型)
  2. 根据表的大小决定并发数(DAG节点分裂个数)

数据共同分片

通过创建表的时候,指定数据的分布方式,类似于GreenPlum指定distribute。这样join的时候不用网络交换。

Hive和SparkSQL:基于 Hadoop 的数据仓库工具的更多相关文章

  1. Hive和SparkSQL: 基于 Hadoop 的数据仓库工具

    Hive: 基于 Hadoop 的数据仓库工具 前言 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转 ...

  2. 基于hadoop的数据仓库工具:Hive概述

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习成本低,可以通过类 ...

  3. 基于Hadoop的数据仓库Hive

    Hive是基于Hadoop的数据仓库工具,可对存储在HDFS上的文件中的数据集进行数据整理.特殊查询和分析处理,提供了类似于SQL语言的查询语言–HiveQL,可通过HQL语句实现简单的MR统计,Hi ...

  4. Hive -- 基于Hadoop的数据仓库分析工具

    Hive是一个基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库 ...

  5. 大数据之路week07--day05 (一个基于Hadoop的数据仓库建模工具之一 HIve)

    什么是Hive? 我来一个短而精悍的总结(面试常问) 1:hive是基于hadoop的数据仓库建模工具之一(后面还有TEZ,Spark). 2:hive可以使用类sql方言,对存储在hdfs上的数据进 ...

  6. HIVE---基于Hadoop的数据仓库工具讲解

    Hadoop: Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用来开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Dist ...

  7. Hadoop整理五(基于Hadoop的数据仓库Hive)

    数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合.它是单个数据存储,出于分析性报告和决策支持目的而创建. 为需要业务智能的企业,提供指导业务流程改进.监视时间.成本.质量以及控 ...

  8. [转] X-RIME: 基于Hadoop的开源大规模社交网络分析工具

    转自http://www.dataguru.cn/forum.php?mod=viewthread&tid=286174 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter ...

  9. Hive--可执行SQL的Hadoop数据仓库管理工具

    Hive是一个基于HDFS的数据仓库软件,可理解为数据库管理工具:Hive的功能主要有: 1. 支持使用SQL对分布式存储的大型数据集进行读.写.管理,将SQL转化成MapReduce任务执行: 2. ...

随机推荐

  1. redis aof和rdb区别

    转自https://blog.csdn.net/m0_38110132/article/details/76906422 1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由 ...

  2. linux相关(3)

    1. shell环境变量 能够存在于本shell进程及其子shell进程的变量.变量可以从父shell进程传递给子shell进程,而不能反过来,因此环境变量在子shell进程中无论如何修改都不会影响到 ...

  3. B - 取(2堆)石子游戏

    有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者. ...

  4. Linux上强制踢出其他正在登录的用户

    一.查看当前在线用户有几个 w命令 [root@pa1 nginx]#w 13:36:00 up 79 days, 23:50, 3 users, load average: 0.10, 0.07, ...

  5. FastDFS数据迁移

    参考:https://blog.csdn.net/frvxh/article/details/56293502 FastDFS安装配置参考:https://www.cnblogs.com/minseo ...

  6. 使用Zabbix监控RabbitMQ消息队列

    参考文档:http://blog.51cto.com/270142877/1937241 本项目脚本下载地址:https://github.com/jasonmcintosh/rabbitmq-zab ...

  7. 具有键“XXX”的 ViewData 项属于类型“System.Int32”,但它必须属于类型“IEnumerable<SelectListItem>

    原因是Edit视图中有@Html.DropDownListFor(m => m.BirthdayAD... 但是没有从Controller中没有设置值

  8. ajax传输中文参数乱码,本地使用tomcat不乱码,liunx+weblogic乱码

    公司项目有个问题,ajax请求含中文,无论是post方式还是get方式.本地使用tomcat不乱码,liunx+weblogic都乱码.并且用以往encodeURIComponent()并在后台解码之 ...

  9. 鸡头兔头共20,脚56,鸡兔各有多少?算法实 php现版

    //$x 鸡头 //$y 兔头 for ($x = 0; $x <= 20; $x++) { for ($y = 0; $y <= 20; $y++) { if (($x + $y == ...

  10. c++ assert() 使用方法

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> void assert( i ...