【数据仓库】SparkSQL数仓实践

文章目录

spark-sql没有元数据管理功能,只有sql 到RDD的解释翻译功能,所以需要和hive的metastore服务集成在一起使用。

集成hive metastore

在spark安装目录conf下,新增hive-site.xml配置文件,内容如下:

复制代码
<configuration>
   <!-- 指定存储元数据metastore要连接的地址 -->
  <property>
      <name>hive.metastore.uris</name>
      <value>thrift://127.0.0.1:9083</value>
      <description>URI for client to connect to metastore server</description>
  </property>
  <!--配置数据表数据存储目录-->
  <property>
      <name>hive.metastore.warehouse.dir</name>
      <value>/home/datahouse/hive/warehouse</value>
  </property>
</configuration>

然后,就是要保证,hive + hadoop的数仓已能正常运行。因为spark需要使用hive的metastore服务,所以hive的相关服务得正常运行。可以参考 【数据仓库】hive + hadoop数仓搭建实践文章。

集成完成后就可以开始启动spark-sql了。

SQL测试

到spark 的bin目录,执行

复制代码
./spark-sql

如下:

复制代码
[root@yd-ss bin]# ./spark-sql
24/12/27 14:49:53 WARN Utils: Your hostname, yd-ss resolves to a loopback address: 127.0.0.1; using XX.XX.XX.XX instead (on interface bond0)
24/12/27 14:49:53 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
24/12/27 14:49:54 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark master: local[*], Application Id: local-1735282198034
spark-sql> 

执行如下脚本:

复制代码
show database;

输出:

复制代码
spark-sql> show databases;
db_msg
default
test
Time taken: 6.644 seconds, Fetched 3 row(s)

可以看到之前在hive+hadoop数仓下建的库都可以通过spark-sql 查出来了,因为两者共用了一个metastore服务,元数据是一样的,数仓地址也是一样的。

spark-sql 语法

由于spark-sql 使用的元数据管理是hive的元数据服务,所以,spark-sql的语法可以理解为和hive SQL是一样的。

SQL执行流程

上图是hive sql 和 spark sql的执行流程图及框架图。可以看出:

1 hive 偏重的是 hive sql 解释 和 元数据管理,分布式计算和存储依赖于hadoop的MR和HDFS;

2 spark 偏重的是spark sql 解释 和 RDD分布式计算,元数据管理和分布式存储依赖于hive 的 metastore服务和hadoop的HDFS;

3 提供两种数仓数据分析工具 hive sql 和 spark sql,都可以使用数据库客户端工具去连接访问。

两种数仓架构的选择

上图,体现了两种数仓的架构。

hive + hadoop 数仓:分布式计算使用MR,性能计算很慢,在BI数据集配置时,经常会超时;

spark + hive (metastore) + hadoop(HDFS)数仓:分布式计算使用spark RDD ,性能计算快,但还要维护hive ,架构较复杂;

如果基于hive + hadoop 数仓,将MR分布式计算框架换成 Spark RDD的计算框架,是不是就很完美了,强强联合。

hive on spark数仓配置

hive sql 会被解释为Spark RDD 计算执行。

一开始也是怀着激动的心来的,因为hive on MR 实在是太慢了,spark又非常快,两者强强联合,岂不是最佳实践。网上也搜到了很多教程,但都是对于hive的低版本的。但是现实却发生了变化。

在进行该配置之前,需要了解下hive和spark的匹配关系。

hive 4.0 版本的源码pom中已经看不到引用的spark版本了,有可能在4.0版本放弃了spark的支持。

经过查找4.0版本的官方文档,可以看到:

https://hive.apache.org/docs/latest/overview-of-major-changes_283118379/

可以看到直接就是移除了spark,还不是废弃。最新的版本hive4.0已经不支持spark集成了。这也是为什么在hive sql 会话下,执行

复制代码
set hive.execution.engine=spark;

会报错

复制代码
[42000][1] Error while processing statement: 'SET hive.execution.engine=spark' FAILED in validation : Invalid value.. expects one of [mr, tez].

如果想继续使用hive on spark 架构,就只能使用hive 4.0 以前的版本了。

在hive4.0之前的版本hive3.1.3中,依赖的spark 版本为2.3.0,太旧了。

但是可以尝试基于hive3.1.3的源码,修改saprk的版本为新版本重新编译。这里不再往下探究。

毕竟hive4.0 已经移除了spark,数仓搭建技术还是以hive为主,因为它稳定。官方提供了Tez的执行引擎替代MR。也能提高hive的执行效率。

经验

1 hive 4.0移除了saprk支持,只能使用MR和Tez,意味着往后版本,hive on spark就不存在了,若想使用,需要将hive换到4,0以前的版本;

2 spark on hive可以继续使用,但这个是以spark为主,利用hive的元数据服务;但总是感觉没有hive专业;

3 hive4.0往后当数仓使用,需要集成TEz引擎,以提升效率。

相关推荐
得物技术20 小时前
从“人治”到“机治”:得物离线数仓发布流水线质量门禁实践
大数据·数据仓库
沃达德软件1 天前
重点人员动态管控系统解析
数据仓库·人工智能·hive·hadoop·redis·hbase
xianyinsuifeng1 天前
RAG + Code Analysis 的标准路线
数据仓库·自动化·云计算·原型模式·aws
2501_927283581 天前
仓库升级进行时:当传统仓储遇到“四向穿梭车”
数据仓库·人工智能·自动化·wms·制造
Gain_chance1 天前
26-学习笔记尚硅谷数仓搭建-DIM层特殊的维度表——用户维度表的建表、分析及DIM层数据装载脚本
数据仓库·hive·笔记·学习
gis分享者1 天前
学习threejs,打造原生3D高斯溅落实时渲染器
spark·threejs·ply·高斯·splat·溅落·实时渲染器
鸿乃江边鸟1 天前
Spark Datafusion Comet 向量化Rust Native--读数据
rust·spark·native·arrow
看起来不那么蠢的昵称1 天前
Apache Spark 开发与调优实战手册 (Java / Spark 2.x)
java·spark
看起来不那么蠢的昵称1 天前
高性能 Spark UDF 开发手册
java·大数据·spark
亚林瓜子2 天前
AWS Glue任务中使用一个dynamic frame数据过滤另外一个dynamic frame数据
java·python·sql·spark·aws·df·py