Spark on Hive
集成原理
HiveServer2的主要作用: 接收SQL语句,进行语法检查;解析SQL语句;优化;将SQL转变成MapReduce程序,提交到Yarn集群上运行
SparkSQL与Hive集成,实际上是替换掉HiveServer2。是SparkSQL中的HiveServer2替换掉了Hive中的HiveServer2。
集成以后优点如下:
1- 对于SparkSQL来说,可以避免在代码中编写schema信息。直接向MetaStore请求元数据信息
2- 对于SparkSQL来说,多个人可以共用同一套元数据信息,避免每个人对数据理解不同造成代码功能兼容性问题
3- 对于Hive来说,底层执行引擎由之前的MapReduce变成了Spark Core,能够提升运行效率
4- 对于使用者/程序员来说,SparkSQL与Hive集成,对于上层使用者来说,是完全透明的。
在代码中集成Hive
代码中集成Hive:
from pyspark import SparkConf, SparkContext
import os
from pyspark.sql import SparkSession
# 绑定指定的Python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
if __name__ == '__main__':
# 1- 创建SparkSession对象
"""
spark.sql.warehouse.dir:告诉Spark数据存储在什么地方。默认使用本地磁盘进行存储。推荐使用HDFS
hive.metastore.uris:告诉Spark元数据信息去什么地方找MetaStore
enableHiveSupport():开启SparkSQL和Hive的集成
"""
spark = SparkSession.builder\
.config("spark.sql.warehouse.dir","hdfs://node1:8020/user/hive/warehouse")\
.config("hive.metastore.uris","thrift://node1.itcast.cn:9083")\
.appName('sparksql_hive')\
.master('local[*]')\
.enableHiveSupport()\
.getOrCreate()
# 2- 数据输入
# 3- 数据处理
# 4- 数据输出
spark.sql("show databases").show()
spark.sql("""
select
*
from a.student
where id>=2
""").show()
# 5- 释放资源
spark.stop()
总结:
spark.sql.warehouse.dir: 告知Spark,数据表存放的地方。推荐使用HDFS进行存储。如果不配置,默认使用本地磁盘存储。
hive.metastore.uris: 告知Spark,MetaStore元数据管理服务的连接信息
enableHiveSupport() : 开启Spark和Hive的集成
Spark SQL运行机制
Spark SQL底层依然运行的是Spark RDD的程序,所以说Spark RDD程序的运行的流程,在Spark SQL中依然是存在的,只不过在这个流程的基础上增加了从SQL翻译为RDD的过程
Spark SQL的运行机制,其实就是在描述如何将Spark SQL翻译为RDD程序
Catalyst内部具体的执行流程:
文章来源:https://www.toymoban.com/news/detail-818840.html
1- 接收客户端提交过来的SQL/DSL代码,首先会校验SQL/DSL的语法是否正常。如果通过校验,根据SQL/DSL的执行顺序,生成未解析的逻辑计划,也叫做AST抽象语法树
2- 对于AST抽象语法树加入元数据信息,确定一共涉及到哪些字段、字段的数据类型是什么,以及涉及到的表的其他相关元数据信息。加入元数据信息以后,就得到了(未优化的)逻辑计划
3- 对(未优化的)逻辑计划执行优化操作,整个优化通过优化器来执行。在优化器匹配相对应的优化规则,实时具体的优化。SparkSQL底层提供了一两百中优化规则,得到优化的逻辑计划。例如: 谓词下推(断言下推)、列值裁剪
3.1- 谓词下推: 也叫做断言下推。将数据过滤操作提前到数据扫描的时候执行,减少后续处理的数据量,提升效率。
3.2- 列值裁剪: 将一张表中与数据分析不相关的字段不加载进来,只加载数据分析用到的字段。减少后续处理的数据量,提升效率。
4- 由于优化规则很多,导致会得到多个优化的逻辑计划。在转换成物理执行计划的过程中,会根据成本模型(对比每个计划运行的耗时、资源消耗等)得到最优的一个物理执行计划
5- 将物理执行计划通过code generation(代码生成器),转变成Spark RDD的代码
6- 最后就是将Spark RDD代码部署到集群上运行。后续过程与Spark内核调度中Job的调度流程完全一致。
专业术语:文章来源地址https://www.toymoban.com/news/detail-818840.html
1- Spark SQL底层解析是由RBO(基于规则的优化器)和CBO(基于代价的优化器)优化完成的
2- RBO是基于规则优化,对于SQL或DSL的语句通过执行引擎得到未执行逻辑计划,在根据元数据得到逻辑计划,之后加入列值裁剪或谓词下推等优化手段形成优化的逻辑计划
3- CBO是基于优化的逻辑计划得到多个物理执行计划,根据代价函数选择出最优的物理执行计划
4- 通过code genaration代码生成器完成RDD的代码构建
5- 底层依赖于DAGScheduler和TaskScheduler完成任务计算执行
到了这里,关于Spark on Hive及 Spark SQL的运行机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!