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

Stella981
• 阅读 531

Hive

前言

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

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

数据组织格式

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

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

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

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

Hive 架构

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

由上图可知,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 流程

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

执行流程详细解析

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

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

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

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

基于代价优化

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

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

数据共同分片

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这