轻松驾驭Hive数仓,数据分析从未如此简单!

1 前言

  • 先通过SparkSession read API从分布式文件系统创建DataFrame

  • 然后,创建临时表并使用SQL或直接使用DataFrame API,进行数据转换、过滤、聚合等操作

  • 最后,再用SparkSession的write API把计算结果写回分布式文件系统

直接与文件系统交互,仅是Spark SQL数据应用常见case之一。Spark SQL另一典型场景是与Hive集成、构建分布式数仓。

数仓,带有主题、聚合层次较高的数据集,承载形式是一系列数据表。数据分析应用很普遍。Hive与Spark联合:

  • Hive擅长元数据管理
  • Spark长高效分布式计算

Spark与Hive集成方式:

  • Spark仅将Hive当成元信息管理工具:Spark with Hive
  • Hive用Spark作底层计算引擎:Hive on Spark

2 Hive架构与基本原理

Hadoop社区构建数仓的核心组件,提供丰富的用户接口,接收用户提交的SQL查询语句。这些查询语句经过Hive解析与优化后,转化为分布式任务,并交付Hadoop MapReduce执行。

核心:

  • User Interface(1)

  • Driver(3)

不论元数据库(4)、存储系统(5),还是计算引擎(6),Hive都外包、可插拔式交给第三方独立组件,即专事专人做:

User Interface为开发者提供SQL接入服务,具体接入途径:

  • Hive Server 2(2)

    Hive Server 2通过提供JDBC/ODBC客户端连接,允许开发者从远程提交SQL查询请求。该方案更灵活,应用更广泛

  • CLI

  • Web Interface(Web界面入口)
    CLI与Web Interface直接在本地接收SQL查询语句

Hive Metastore

一个普通的RDBMS,可为MySQL、Derby、Oracle、DB2。

作用
  • 辅助SQL语法解析、执行计划的生成与优化
  • 帮助底层计算引擎高效地定位并访问分布式文件系统中的数据源

分布式文件系统可HDFS、Amazon S3。执行方面,Hive支持3类计算引擎:

  • Hadoop MapReduce
  • Tez
  • Spark

3 Hive工作流程

  • 接收到SQL查询后,Hive的Driver先用Parser组件,将查询语句转化为AST(Abstract Syntax Tree,查询语法树)
  • 接着,Planner组件根据AST生成执行计划
  • Optimizer进一步优化执行计划
  • 要完成这一系列的动作,Hive须拿到相关数据表的元信息,如表名、列名、字段类型、数据文件存储路径、文件格式等。这些都存储在“Hive Metastore”(4)数据库

4 Spark with Hive

Hive Metastore利用RDBMS存储数据表的元信息,如表名、表类型、表数据的Schema、表(分区)数据的存储路径、及存储格式。Metastore像“户口簿”,记录分布式文件系统中每一份数据集的“底细”。

Spark SQL通过访问Hive Metastore,即可扩充数据访问来源,即Spark with Hive核心思想:

  • Spark是主体
  • Hive Metastore只是Spark扩充数据源的辅助

集成方式

  1. 创建SparkSession,访问本地或远程的Hive Metastore
  2. 通过Spark内置的spark-sql CLI,访问本地Hive Metastore
  3. 通过Beeline客户端,访问Spark Thrift Server

SparkSession + Hive Metastore

启动Hive Metastore。

hive --service metastore

Hive Metastore启动后,要让Spark知道Metastore的访问地址,即告诉他数据源的“户口簿”藏在哪:

  • 创建SparkSession时,通过config函数指定hive.metastore.uris参数
  • 让Spark读取Hive配置文件hive-site.xml,该文件记录Hive相关配置项,包括hive.metastore.uris。把hive-site.xml拷贝到Spark安装目录的conf子目录,Spark即可自行读取内容

第一种用法案例

假设Hive有张名为“salaries”的薪资表,每条数据都包含id和salary两个字段,表数据存储在HDFS,那么,在spark-shell中敲入下面的代码,我们即可轻松访问Hive中的数据表。

import org.apache.spark.sql.SparkSession
import  org.apache.spark.sql.DataFrameval hiveHost: String = _
// 创建SparkSession实例
val spark = SparkSession.builder().config("hive.metastore.uris", s"thrift://hiveHost:9083").enableHiveSupport().getOrCreate()// 读取Hive表,创建DataFrame
val df: DataFrame = spark.sql(“select * from salaries”)df.show/** 结果打印
+---+------+
| id|salary|
+---+------+
|  1| 26000|
|  2| 30000|
|  4| 25000|
|  3| 20000|
+---+------+
*/

利用createTempView函数从数据文件创建临时表的方法,临时表创建后,就能使用SparkSession的sql API来提交SQL查询语句。连接到Hive Metastore之后,咱们就可以绕过第一步,直接使用sql API去访问Hive中现有的表,方便!

createTempView创建的临时表,其生命周期仅限于Spark作业内部,一旦作业执行完毕,临时表就不复存在,无法被其他应用复用。而Hive表的元信息已持久化到Hive Metastore,不同的作业、应用、甚至是计算引擎,如Spark、Presto、Impala等,都可以通过Hive Metastore访问Hive表。

SparkSession + Hive Metastore这种集成,Spark对Hive的访问,仅涉及Metastore,对Hive架构其他组件,Spark并未触及。即Spark仅“白嫖”Hive的Metastore,拿到数据集的元信息后,Spark SQL自行加载数据、处理:

在第一种集成方式下,通过sql API,可直接提交复杂SQL,也可以在创建DataFrame之后,再使用各种算子实现业务逻辑。

spark-sql CLI + Hive Metastore

“既然是搭建数仓,能不能像用普通数据库,直接输入SQL查询,绕过SparkSession的sql API?”肯定的,Spark with Hive的第二种集成方式:spark-sql CLI + Hive Metastore。

与spark-shell、spark-submit类似,spark-sql也是Spark内置的系统命令。将配置好hive.metastore.uris参数的hive-site.xml文件放到Spark安装目录的conf下,我们即可在spark-sql中直接使用SQL语句来查询或是处理Hive表。

显然,在这种集成模式下,Spark和Hive的关系,与刚刚讲的SparkSession + Hive Metastore一样,本质上都是Spark通过Hive Metastore来扩充数据源。

不过,相比前者,spark-sql CLI的集成方式多了一层限制,那就是在部署上,spark-sql CLI与Hive Metastore必须安装在同一个计算节点。换句话说,spark-sql CLI只能在本地访问Hive Metastore,而没有办法通过远程的方式来做到这一点。

在绝大多数的工业级生产系统中,不同的大数据组件往往是单独部署的,Hive与Spark也不例外。由于Hive Metastore可用于服务不同的计算引擎,如前面提到的Presto、Impala,因此为了减轻节点的工作负载,Hive Metastore往往会部署到一台相对独立的计算节点。

在这样的背景下,不得不说,spark-sql CLI本地访问的限制,极大地削弱了它的适用场景,这也是spark-sql CLI + Hive Metastore这种集成方式几乎无人问津的根本原因。不过,这并不妨碍我们学习并了解它,这有助于我们对Spark与Hive之间的关系加深理解。

Beeline + Spark Thrift Server

“既然spark-sql CLI有限制,有没有其他集成方式,既能够部署到生产系统,又能让开发者写SQL查询?” 有,Spark with Hive集成的第三种途径,就是使用Beeline客户端,去连接Spark Thrift Server,从而完成Hive表的访问与处理。

Beeline原是Hive客户端,通过JDBC接入Hive Server 2。Hive Server 2可同时服务多个客户端,提供多租户的Hive查询服务。由于Hive Server 2实现采用Thrift RPC协议框架,因此,很多时候又把Hive Server 2称为“Hive Thrift Server 2”。

通过Hive Server 2接入的查询请求,经由Hive Driver的解析、规划与优化,交给Hive搭载的计算引擎付诸执行。相应地,查询结果再由Hiver Server 2返还给Beeline客户端,如下图右侧虚线框。

Spark Thrift Server脱胎于Hive Server 2,在接收查询、多租户服务、权限管理等方面,这两个服务端的实现逻辑几乎一模一样。它们最大的不同,在于SQL查询接入之后的解析、规划、优化与执行。

我们刚刚说过,Hive Server 2的“后台”是Hive的那套基础架构。而SQL查询在接入到Spark Thrift Server之后,它首先会交由Spark SQL优化引擎进行一系列的优化。在第14讲我们提过,借助于Catalyst与Tungsten这对“左膀右臂”,Spark SQL对SQL查询语句先后进行语法解析、语法树构建、逻辑优化、物理优化、数据结构优化、以及执行代码优化,等等。然后,Spark SQL将优化过后的执行计划,交付给Spark Core执行引擎付诸运行。

SQL查询在接入Spark Thrift Server之后的执行路径,与DataFrame在Spark中的执行路径是完全一致。

理清Spark Thrift Server与Hive Server 2之间的区别与联系后。

来看Spark Thrift Server的启动与Beeline的具体用法。

5 启动Spark Thrift Server

只需调用Spark提供的start-thriftserver.sh

// SPARK_HOME环境变量,指向Spark安装目录
cd $SPARK_HOME/sbin// 启动Spark Thrift Server
./start-thriftserver.sh

脚本执行成功之后,Spark Thrift Server默认在10000端口监听JDBC/ODBC的连接请求。有意思的是,关于监听端口的设置,Spark复用了Hive的hive.server2.thrift.port参数。与其他的Hive参数一样,hive.server2.thrift.port同样要在hive-site.xml配置文件中设置。

一旦Spark Thrift Server启动成功,我们就可以在任意节点上通过Beeline客户端来访问该服务。在客户端与服务端之间成功建立连接(Connections)之后,咱们就能在Beeline客户端使用SQL语句处理Hive表了。需要注意的是,在这种集成模式下,SQL语句背后的优化与计算引擎是Spark。

/**
用Beeline客户端连接Spark Thrift Server,
其中,hostname是Spark Thrift Server服务所在节点
*/
beeline -u “jdbc:hive2://hostname:10000”

好啦,到此为止,Spark with Hive这类集成方式我们就讲完了。

为了巩固刚刚学过的内容,咱们趁热打铁,一起来做个简单的小结。不论是SparkSession + Hive Metastore、spark-sql CLI + Hive Metastore,还是Beeline + Spark Thrift Server,Spark扮演的角色都是执行引擎,而Hive的作用主要在于通过Metastore提供底层数据集的元数据。不难发现,在这类集成方式中,Spark唱“主角”,而Hive唱“配角”

6 Hive on Spark

说到这里,你可能会好奇:“对于Hive社区与Spark社区来说,大家都是平等的,那么有没有Hive唱主角,而Spark唱配角的时候呢?”还真有,这就是Spark与Hive集成的另一种形式:Hive on Spark。

基本原理

在这一讲的开头,我们简单介绍了Hive的基础架构。Hive的松耦合设计,使得它的Metastore、底层文件系统、以及执行引擎都是可插拔、可替换的。

在执行引擎方面,Hive默认搭载的是Hadoop MapReduce,但它同时也支持Tez和Spark。所谓的“Hive on Spark”,实际上指的就是Hive采用Spark作为其后端的分布式执行引擎,如下

从用户的视角来看,使用Hive on MapReduce或是Hive on Tez与使用Hive on Spark没有任何区别,执行引擎的切换对用户来说是完全透明的。不论Hive选择哪一种执行引擎,引擎仅仅负责任务的分布式计算,SQL语句的解析、规划与优化,通通由Hive的Driver来完成。

为了搭载不同的执行引擎,Hive还需要做一些简单的适配,从而把优化过的执行计划“翻译”成底层计算引擎的语义。

举例来说,在Hive on Spark的集成方式中,Hive在将SQL语句转换为执行计划之后,还需要把执行计划“翻译”成RDD语义下的DAG,然后再把DAG交付给Spark Core付诸执行。从第14讲到现在,我们一直在强调,Spark SQL除了扮演数据分析子框架的角色之外,还是Spark新一代的优化引擎。

在Hive on Spark这种集成模式下,Hive与Spark衔接的部分是Spark Core,而不是Spark SQL。这也是为什么,相比Hive on Spark,Spark with Hive的集成在执行性能更胜。毕竟,Spark SQL + Spark Core这种原装组合,相比Hive Driver + Spark Core这种适配组合,契合度更高。

集成实现

分析完原理之后,接下来,我们再来说说,Hive on Spark的集成到底该怎么实现。

首先,既然我们想让Hive搭载Spark,那么我们事先得准备好一套完备的Spark部署。对于Spark的部署模式,Hive不做任何限定,Spark on Standalone、Spark on Yarn或是Spark on Kubernetes都是可以的。

Spark集群准备好之后,我们就可以通过修改hive-site.xml中相关的配置项,来轻松地完成Hive on Spark的集成,如下表所示。

9060fdf6-e125-44d6-8d51-fbfe615799db

其中,hive.execution.engine用于指定Hive后端执行引擎,可选值有“mapreduce”、“tez”和“spark”,显然,将该参数设置为“spark”,即表示采用Hive on Spark的集成方式。

确定了执行引擎之后,接下来我们自然要告诉Hive:“Spark集群部署在哪里”,spark.master正是为了实现这个目的。另外,为了方便Hive调用Spark的相关脚本与Jar包,我们还需要通过spark.home参数来指定Spark的安装目录。

配置好这3个参数之后,我们就可以用Hive SQL向Hive提交查询请求,而Hive则是先通过访问Metastore在Driver端完成执行计划的制定与优化,然后再将其“翻译”为RDD语义下的DAG,最后把DAG交给后端的Spark去执行分布式计算。

当你在终端看到“Hive on Spark”的字样时,就证明Hive后台的执行引擎确实是Spark,如下图所示。

图片

当然,除了上述3个配置项以外,Hive还提供了更多的参数,用于微调它与Spark之间的交互。对于这些参数,你可以通过访问Hive on Spark配置项列表来查看。不仅如此,在第12讲,我们详细介绍了Spark自身的基础配置项,这些配置项都可以配置到hive-site.xml中,方便你更细粒度地控制Hive与Spark之间的集成。

7 总结

了解Spark与Hive常见的两类集成方式,Spark with Hive和Hive on Spark。前者由Spark社区主导,以Spark为主、Hive为辅;后者则由Hive社区主导,以Hive为主、Spark为辅。两类集成方式各有千秋,适用场景各有不同。

在Spark with Hive这类集成方式中,Spark主要是利用Hive Metastore来扩充数据源,从而降低分布式文件的管理与维护成本,如路径管理、分区管理、Schema维护,等等。

对于Spark with Hive,我们至少有3种途径来实现Spark与Hive的集成,分别是SparkSession + Hive Metastore,spark-sql CLI + Hive Metastore和Beeline + Spark Thrift Server。

与Spark with Hive相对,另一类集成方式是Hive on Spark。这种集成方式,本质上是Hive社区为Hive用户提供了一种新的选项,这个选项就是,在执行引擎方面,除了原有的MapReduce与Tez,开发者还可以选择执行性能更佳的Spark。

Spark大行其道当下,习惯使用Hive的团队与开发者,更愿意尝试和采用Spark作为后端的执行引擎。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于三平面映射的地形纹理化【Triplanar Mapping】

你可能遇到过这样的地形:悬崖陡峭的一侧的纹理拉伸得如此之大,以至于看起来不切实际。 也许你有一个程序化生成的世界,你无法对其进行 UV 展开和纹理处理。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 三平面映射(Trip…

CTF之CTF(夺旗赛)介绍

什么是CTF? CTF(Capture The Flag,中文一般译作“夺旗赛”)在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,用以代替之前黑客们通过互相发起真实攻击进行…

2023年中国全固态电池市场发展趋势分析:全固态电池的渗透率将占据固态电池市场主体[图]

全固态电池是锂电池的一种细分,其电池的电解质和电极材料全部由固态材料构成,而非传统电池中常见的液态或者凝胶电解质。由于传统液态锂电池中电解液具有易燃特性,近年来相关安全事故频发,因此随着技术革新,固态电池的…

openGauss学习笔记-95 openGauss 数据库管理-访问外部数据库-postgres_fdw

文章目录 openGauss学习笔记-95 openGauss 数据库管理-访问外部数据库-postgres_fdw95.1 使用postgres_fdw95.2 postgres_fdw下推主要成分95.3 常见问题95.4 注意事项 openGauss学习笔记-95 openGauss 数据库管理-访问外部数据库-postgres_fdw openGauss的fdw实现的功能是各个…

[羊城杯 2020]black cat - 文件隐写+RCE(hash_hmac绕过)

[羊城杯 2020]black cat 1 解题流程1.1 第一步1.2 第二步1.3 第三步 1 解题流程 1.1 第一步 打开网站有首歌,按F12也是提示听歌,ctf-wscan扫描就flag.php下载歌,用010打开,发现有一段内容if(empty($_POST[Black-Cat-Sheriff]) |…

ThreeJS-3D教学五-材质

我们在ThreeJS-3D教学二&#xff1a;基础形状展示中有简单介绍过一些常用的材质&#xff0c;这次我们举例来具体看下效果&#xff1a; 代码是这样的&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

【Qt】三种方式实现抽奖小游戏

简介 本文章是基本Qt与C实现一个抽奖小游戏&#xff0c;用到的知识点在此前发布的几篇文章。 下面是跳转链接&#xff1a; 【Qt控件之QLabel】用法及技巧链接&#xff1a; https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm1001.2014.3001.5501 【Qt控件之QPus…

CRMEB 标准版商城系统新增主题风格颜色【超级完整教程】

一、后台 1.新增主题图片 assets/images/brown.jpg和assets/images/brownsign.png 2.修改admin/src/pages/setting/themeStyle/index.vue 3.修改admin/src/pages/marketing/sign/index.vue 4.修改admin/src/pages/system/group/visualization.vue &#xff08;第三步和第四步…

嵌入式养成计划-33--数据库-sqlite3

七十一、 数据库 71.1 数据库基本概念 数据&#xff08;Data&#xff09; 能够输入计算机并能被计算机程序识别和处理的信息集合数据库 &#xff08;Database&#xff09;数据库是在数据库管理系统管理和控制之下&#xff0c;存放在存储介质上的数据集合 常用的数据库 大型数…

MapReduce(林子雨慕课课程)

文章目录 7. MapReduce7.1 MapReduce简介7.1.1 分布式并行编程7.1.2 MapReduce模型简介 7.2 MapReduce体系结构7.3 MapReduce工作流程概述7.4 Shuffle过程原理7.5 MapReduce应用程序的执行过程7.6 WordCount实例分析7.7 MapReduce的具体应用7.8 MaReduce编程实践 7. MapReduce …

Prometheus和grafana安装配置手册

1.简介 本文档为prometheus和grafana安装配置手册&#xff0c;prometheus和grafana的内容、和操作过程&#xff0c;详细介绍了服务监控配置、dashboard配置、告警配置等操作。 2.部署说明 Prometheus基于Golang编写&#xff08;需要安装&#xff09;&#xff0c;编译后的软件…

PyTorch 深度学习实战

文章目录 前言1. 环境安装1.Anaconda2.pytorch cuda 环境3.测试 前言 官网 https://pytorch.org/hub/pytorch_vision_vgg/ 1. 环境安装 1.Anaconda 可以参考这里&#xff1a;Anaconda学习 2.pytorch cuda 环境 我是按照下面的博客一步步完成&#xff0c;亲测有效 Pytorc…

移动应用-Android-开发指南

Android-UI开发指南 Android Studio调试UI设计UI框架布局Layout文本框 android的活动Activity基本概念Activity的生命周期Activity栈创建Activity管理ActivityActivity间传递数据 FragmentAdapterRecyclerViewRecyclerView Adapter&#xff08;适配器&#xff09;事件setOnItem…

基于BES平台音乐信号处理之DRC算法实现

基于BES平台音乐信号处理之DRC算法实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;加我微信hezkz17, 本群提供音频技术答疑服务 1 DRC实现 drc.h 2 调用 audio_process.c 3 DRC动态范围控制算法在音乐信号处理中的位置 4 DRC具体细节源码 可参考…

Lumos-az/MiniSQL阅读笔记

文章目录 处理SQL创建创建表RecordManager部分CatalogManager部分 创建索引IndexManager::createIndex部分API::createNewIndex部分CatalogManager::createIndex部分 插入删除删除表删除记录? 查询B树gif演示B树增删&#xff1a;插入&#xff1a;删除&#xff1a; 项目源码&am…

ArcGIS Pro地图可视化—双变量关系映射

原址链接ArcGIS Pro地图可视化—双变量关系映射https://mp.weixin.qq.com/s/g-pPBHPXMOEF5NHm06JcrA 这个方法很早很早以前就有了&#xff0c;可能大家早就知道了&#xff0c;可我昨天刚看到这个东西 https://en.wikipedia.org/wiki/Multivariate_map 像是上图&#xff0c;美国…

MyBatisPlus(十)判空查询

说明 判空查询&#xff0c;对应SQL语句中的 IS NULL语句&#xff0c;查询对应字段为 NULL 的数据。 isNull /*** 查询用户列表&#xff0c; 查询条件&#xff1a;电子邮箱为 null 。*/Testvoid isNull() {LambdaQueryWrapper<User> wrapper new LambdaQueryWrapper<…

ctfshow-web9(奇妙的ffifdyop绕过)

尝试万能密码登录&#xff0c;没有任何回显 尝试扫描目录&#xff0c;这里不知道为啥御剑什么都扫不到&#xff0c;使用dirsearch可以扫到robots.txt 查看robots协议 访问下载index.phps 查看index.phps 简单审计一下php代码&#xff1a; $password$_POST[password]; if(strl…

js 之让人迷惑的闭包

文章目录 一、闭包是什么&#xff1f; &#x1f926;‍♂️二、闭包 &#x1f60e;三、使用场景 &#x1f601;四、使用场景&#xff08;2&#xff09; &#x1f601;五、闭包的原理六、思考总结一、 更深层次了解闭包&#xff0c;分析以下代码执行过程二、闭包三、闭包定义四、…

GNN+RA 文献阅读

[1] X. Wang et al., ‘Scalable Resource Management for Dynamic MEC: An Unsupervised Link-Output Graph Neural Network Approach’. paper code&#xff1a;GitHub - UNIC-Lab/LOGNN: This is the code for paper "Scalable Resource Management for Dynamic MEC:…