【数据仓库】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引擎,以提升效率。

相关推荐
快手技术10 小时前
Blaze RangePartitioning 算子Native实现全解析
spark·naive
yuanbenshidiaos14 小时前
【数据挖掘】数据仓库
数据仓库·笔记·数据挖掘
不剪发的Tony老师1 天前
Apache Hop:开源版本的Kettle
数据仓库·etl
知初~1 天前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database
努力的小T1 天前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
Java资深爱好者2 天前
在Spark中,如何使用DataFrame进行高效的数据处理
大数据·分布式·spark
阿里云大数据AI技术2 天前
美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台
大数据·阿里云·spark·serverless·emr
python资深爱好者2 天前
什么容错性以及Spark Streaming如何保证容错性
大数据·分布式·spark
猪猪果泡酒2 天前
spark
spark
专注API从业者2 天前
分布式电商系统中的API网关架构设计
大数据·数据仓库·分布式·架构