Hive原理剖析

news2024/9/24 19:20:20

一、简介

Hive是建立在Hadoop上的数据仓库框架,提供大数据平台批处理计算能力,能够对结构化/半结构化数据进行批量分析汇总完成数据计算。提供类似SQL的Hive Query Language语言操作结构化数据,其基本原理是将HQL语言自动转换成MapReduce任务,从而完成对Hadoop集群中存储的海量数据进行查询和分析。有关Hive表的更多信息,请参阅开源社区Hive教程。

Hive主要特点如下:

  • 海量结构化数据分析汇总。
  • 将复杂的MapReduce编写任务简化为SQL语句。
  • 灵活的数据存储格式,支持JSON,CSV,TEXTFILE,RCFILE,SEQUENCEFILE,ORC(Optimized Row Columnar)这几种存储格式。

二、Hive结构

Hive为单实例的服务进程,提供服务的原理是将HQL编译解析成相应的MapReduce或者HDFS任务,如下图所示为Hive的结构概图。
在这里插入图片描述

名称说明
HiveServer一个集群内可部署多个HiveServer,负荷分担。对外提供Hive数据库服务,将用户提交的HQL语句进行编译,解析成对应的Yarn任务或者HDFS操作,从而完成数据的提取、转换、分析。
MetaStore1.一个集群内可部署多个MetaStore,负荷分担。提供Hive的元数据服务,负责Hive表的结构和属性信息读、写、维护和修改。2.提供Thrift接口,供HiveServer、Spark、WebHCat等MetaStore客户端来访问,操作元数据。
WebHCat一个集群内可部署多个WebHCat,负荷分担。提供Rest接口,通过Rest执行Hive命令,提交MapReduce任务。
Hive客户端包括人机交互命令行Beeline、提供给JDBC应用的JDBC驱动、提供给Python应用的Python驱动、提供给Mapreduce的HCatalog相关JAR包。
ZooKeeper集群ZooKeeper作为临时节点记录各HiveServer实例的IP地址列表,客户端驱动连接Zookeeper获取该列表,并根据路由机制选取对应的HiveServer实例。
HDFS/HBase集群Hive表数据存储在HDFS集群中。
MapReduce/Yarn集群提供分布式计算服务:Hive的大部分数据操作依赖MapReduce,HiveServer的主要功能是将HQL语句转换成MapReduce任务,从而完成对海量数据的处理。

HCatalog建立在Hive Metastore之上,具有Hive的DDL能力。从另外一种意义上说,HCatalog还是Hadoop的表和存储管理层,它使用户能够通过使用不同的数据处理工具(比如Pig和MapReduce),更轻松地在网格上读写HDFS上的数据,HCatalog还能为这些数据处理工具提供读写接口,并使用Hive的命令行接口发布数据定义和元数据探索命令。此外,经过封装这些命令,WebHcat Server还对外提供了RESTful接口,如下图所示。
在这里插入图片描述
Hive作为一个基于HDFS和MapReduce架构的数据仓库,其主要能力是通过对HQL(Hive Query Language)编译和解析,生成并执行相应的MapReduce任务或者HDFS操作。Hive与HiveQL相关信息,请参考HiveQL 语言手册。

如下图为Hive的结构简图。

  • Metastore - 对表,列和Partition等的元数据进行读写及更新操作,其下层为关系型数据库。
  • Driver - 管理HiveQL执行的生命周期并贯穿Hive任务整个执行期间。
  • Compiler - 编译HiveQL并将其转化为一系列相互依赖的Map/Reduce任务。
  • Optimizer - 优化器,分为逻辑优化器和物理优化器,分别对HiveQL生成的执行计划和MapReduce任务进行优化。
  • Executor - 按照任务的依赖关系分别执行Map/Reduce任务。
  • ThriftServer - 提供thrift接口,作为JDBC的服务端,并将Hive和其他应用程序集成起来。
  • Clients - 包含WebUI和JDBC接口,为用户访问提供接口。
    在这里插入图片描述

三、Hive CBO原理介绍

CBO,全称是Cost Based Optimization,即基于代价的优化器。

其优化目标是:

在编译阶段,根据查询语句中涉及到的表和查询条件,计算出产生中间结果少的高效join顺序,从而减少查询时间和资源消耗。

Hive中实现CBO的总体过程如下:

Hive使用开源组件Apache Calcite实现CBO。首先SQL语句转化成Hive的AST,然后转成Calcite可以识别的RelNodes。Calcite将RelNode中的Join顺序调整后,再由Hive将RelNode转成AST,继续Hive的逻辑优化和物理优化过程。流程图如下图所示:
在这里插入图片描述
Calcite调整Join顺序的具体过程如下:

  1. 针对所有参与Join的表,依次选取一个表作为第一张表。
  2. 依据选取的第一张表,根据代价选择第二张表,第三张表。由此可以得到多个不同的执行计划。
  3. 计算出代价最小的一个计划,作为最终的顺序优化结果。

代价的具体计算方法:

当前版本,代价的衡量基于Join出来的数据条数:Join出来的条数越少,代价越小。Join条数的多少,取决于参与join的表的选择率。表的数据条数,取自表级别的统计信息。

过滤条件过滤后的条数,由列级别的统计信息,max,min,以及NDV(Number of Distinct Values)来估算出来。

例如存在一张表table_a,其统计信息如下:数据总条数1000000,NDV 50,查询条件如下:

Select * from table_a where colum_a='value1';

则估算查询的最终条数为1000000 * 1/50 = 20000条,选择率为2%。
以下以TPC-DS Q3为例来介绍CBO是如何调整Join顺序的。

select 
    dt.d_year, 
    item.i_brand_id brand_id, 
    item.i_brand brand, 
    sum(ss_ext_sales_price) sum_agg 
from 
    date_dim dt, 
    store_sales, 
    item 
where 
    dt.d_date_sk = store_sales.ss_sold_date_sk 
    and store_sales.ss_item_sk = item.i_item_sk 
    and item.i_manufact_id = 436 
    and dt.d_moy = 12 
group by dt.d_year , item.i_brand , item.i_brand_id 
order by dt.d_year , sum_agg desc , brand_id 
limit 10;

语句解释:这个语句由三张表来做Inner join,其中store_sales是事实表,有约2900000000条数据,date_dim是维度表,有约73000条数据,item是维度表,有约18000条数据。每一个表上都有过滤条件,其Join关系如所下图示:
在这里插入图片描述
CBO应该先选择能起到最好过滤效果的表来join。

通过分析min,max,NDV,以及数据条数。CBO估算出不同维度表的选择率,详情如下表所示。

表名原始数据条数过滤后数据条数选择率
date_dim7300062008.5%
item18000190.1%

上述表格获取到原始表的数据条数,估算出过滤后的数据条数后,计算出选择率=过滤后条数/原始条数。
从上表可以看出,item表具有较好的过滤效果,因此CBO将item表的join顺序提前。
CBO未开启时的Join示意图如下图所示:
在这里插入图片描述
CBO开启后的Join示意图如下图所示:
在这里插入图片描述
可以看出,优化后中间结果由495000000条减少到了2900000条,执行时间也大幅减少。

四、Hive与HDFS组件的关系

Hive是Apache的Hadoop项目的子项目,Hive利用HDFS作为其文件存储系统。Hive通过解析和计算处理结构化的数据,Hadoop HDFS则为Hive提供了高可靠性的底层存储支持。Hive数据库中的所有数据文件都可以存储在Hadoop HDFS文件系统上,Hive所有的数据操作也都是通过Hadoop HDFS接口进行的。

五、Hive与MapReduce组件的关系

Hive的数据计算依赖于MapReduce。MapReduce也是Apache的Hadoop项目的子项目,它是一个基于Hadoop HDFS分布式并行计算框架。Hive进行数据分析时,会将用户提交的HQL语句解析成相应的MapReduce任务并提交MapReduce执行。

六、Hive与Tez的关系

Tez是Apache的开源项目,它是一个支持有向无环图的分布式计算框架,Hive使用Tez引擎进行数据分析时,会将用户提交的HQL语句解析成相应的Tez任务并提交Tez执行。

七、Hive与DBService的关系

Hive的MetaStore(元数据服务)处理Hive的数据库、表、分区等的结构和属性信息(即Hive的元数据),这些信息需要存放在一个关系型数据库中,由MetaStore管理和处理。在产品中,Hive的元数据由DBService组件存储和维护,由Metadata组件提供元数据服务。

八、Hive与Elasticsearch的关系

Hive可以将Elasticsearch作为其扩展的文件存储系统。Hive通过集成Elasticsearch提供的Elasticsearch-Hadoop插件,建立外表,将表数据存储在Elasticsearch里,实现Hive读取和写入Elasticsearch索引数据的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k3s初体验

概述 K3s 是轻量级的 Kubernetes。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。 K3s 是 rancher 公司开发维护的一套 K8s 发行版。 目的是轻量化 K8s,并将其应用于 IoT 设备(比如树…

信息系统项目管理师(第四版)教材精读思维导图-第五章信息系统工程

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 5.1 软件工程 5.2 数据工程 5.3 系统集成 5.4 …

JVM第二篇 类加载子系统

JVM主要包含两个模块,类加载子系统和执行引擎,本篇博客将类加载子系统做一下梳理总结。 1.类加载子系统功能 2.类加载子系统执行过程 2.1 加载 解析class文件的常用工具

SpringCloud学习笔记(十二)_Zipkin全链路监控

Zipkin是SpringCloud官方推荐的一款分布式链路监控的组件,使用它我们可以得知每一个请求所经过的节点以及耗时等信息,并且它对代码无任何侵入,我们先来看一下Zipkin给我们提供的UI界面都是提供了哪些信息。 zipkin首页为我们提供了对于调用链…

JavaScript最牛逼代码语句

下面这段代码是JavaScript中最牛逼的表达式 ([][[]] [])[!![]] ([] {})[!![] !![]]为什么说这个表达式是最牛逼的表达式呢?我们把它放浏览器内执行一下 输出如下,怎么样,牛不牛逼 那它为什么会输出这么一个玩意儿呢,我们先把它拆解一下 ([][[]] [])[!![]] ([] {})[!!…

【python使用 Pillow 库】缩小|放大图片

当我们处理图像时,有时候需要调整图像的大小以适应特定的需求。本文将介绍如何使用 Python 的 PIL 库(Pillow)来调整图像的大小,并保存调整后的图像。 环境准备 在开始之前,我们需要安装 Pillow 库。可以使用以下命令…

文心一言 VS 讯飞星火 VS chatgpt (82)-- 算法导论8.1 1题

一、如果用go语言,在一棵比较排序算法的决策树中,一个叶结点可能的最小深度是多少? 文心一言: 在一个排序决策树(如二叉搜索树)中,每个叶节点的最小深度等于输入数据中最大元素与最小元素之间的位距离。…

(动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

❓剑指 Offer 48. 最长不含重复字符的子字符串 难度:中等 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为…

Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南

天猫平台商品淘口令接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取天猫商品的标题、价格、库存、商品快递费用,宝贝ID,发货地,区域ID,快递费用,月销量、总销量、库存、详情描…

ArrayList集合安全

并发修改异常 java.util.ConcurrentModificationException异常 CopyOnWriteArrayList add() 方法 public boolean add(E e) {final ReentrantLock lock this.lock;lock.lock();try {Object[] elements getArray();int len elements.length;Object[] newElements Arrays.c…

【Acwing285】没有上司的舞会(树形dp)题目笔记

题目描述 题目分析 首先来看状态表示: f[u][1]:所有从以u为根的子树中选择,并且不选u这个点的情况之下的最大指数 f[u][0]:所有从以u为根的子树中选择,并且选择u这个点的情况之下的最大指数 然后看状态计算&#x…

3 自制一个集群分发脚本

1. 随便取了一个名字:xsync 2. 在一个配置环境变量的目录下,我是放在了/opt/software下,这个路径我是配置了环境变量的。 3. 编辑脚本:vim xsync #!/bin/bash#1. 判断参数个数 if [ $# -lt 1 ] thenecho Not Enough Arguement!…

【淘宝/天猫】获得淘宝商品详情sku(PC端APP端),关键词搜索商品列表,商品分类等

采集商品详情的主要用途包括: 1. 电商平台运营:电商平台需要收集商品的详细信息,包括商品名称、描述、价格、规格、图片等,以便展示给用户进行购买决策。通过采集商品详情,电商平台可以提供丰富的商品信息给用户&…

openGauss学习笔记-52 openGauss 高级特性-LLVM

文章目录 openGauss学习笔记-52 openGauss 高级特性-LLVM52.1 适用场景52.2 非适用场景52.3 其他因素对LLVM性能的影响52.4 LLVM使用建议 openGauss学习笔记-52 openGauss 高级特性-LLVM openGauss借助LLVM(Low Level Virtual Machine)提供的库函数&…

语言基础篇1——Python概述,Python是什么?Python能干什么?

概述 简介 Python,计算机高级语言,读作/ˈpaɪθən/(英音)、/ˈpaɪθɑːn/(美音),意为蟒蛇,Python的logo为两条缠绕的蟒蛇 特点 Python以开发效率高而运行效率低著称 应用领域…

Android学习之路(10) Bundle

Bundle的概念理解 Bundle经常出现在以下场合: Activity状态数据的保存与恢复涉及到的两个回调:void onSaveInstanceState (Bundle outState)、void onCreate (Bundle savedInstanceState)Fragment的setArguments方法:void setArguments (Bu…

无可用的防病毒提供方你的设备

今天安装软件时关闭了一下windows的Defender,然后安装后出现下面问题 莫名奇妙我的病毒防护就不能用了 后来请教了老师才知道是安装的软件把我系统设置改了,以后使用一键安装软件要谨慎 解决措施: CMD命令,输入“regedit”&#…

kubernetes/k8s驱逐机制总结篇

概述 k8s的驱逐机制是指在某些场景下,如node节点notReady、node节点压力较大等,将pod从某个node节点驱逐掉,让pod的上层控制器重新创建出新的pod来重新调度到其他node节点。这里也将kube-scheduler的抢占调度纳入到了驱逐的讨论范围内&#…

Kotlin开发笔记:协程基础

Kotlin开发笔记:协程基础 导语 本章内容与书的第十五章相关,主要介绍与协程相关的知识。总的来说,本文将会介绍Kotlin中关于异步编程的内容,主要就是与协程有关。在Kotlin中协程是利用continuations数据结构构建的,用…

【洛谷】P2678 跳石头

原题链接:https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。(使用二分需要满足两个条件。一个是有界,一个是单调。 这题的题面:使得选手们在比赛过程中…