写点什么

hive on spark 和 spark on hive

作者:飞哥
  • 2022 年 7 月 12 日
  • 本文字数:2516 字

    阅读完需:约 8 分钟

hive on spark 和 spark on hive

当前组件版本

hive 2.3.7

hadoop 2.7.2

spark 2.4.3

因为之前本地的环境为 spark 为 2.3.4 ,本次 spark 只是进行单独的升级和配置 spark on hive

Spark on hive


官方文档 spark on hive


Spark 通过 Spark-SQL 使用 hive 语句,操作 hive,底层运行的还是 spark rdd。

(1)就是通过 sparksql,加载 hive 的配置文件,获取到 hive 的元数据信息

(2)spark sql 获取到 hive 的元数据信息之后就可以拿到 hive 的所有表的数据

(3)接下来就可以通过 spark sql 来操作 hive 表中的数据


NOTE : 此时的客户端是 SparkSQL,Hive 目前的角色只是 Catalog 元数据的支持组件


Spark 有一个内置的 MateStore,使用 Derby 嵌入式数据库保存数据,但是这种方式不适合生产环境,因为这种模式同一时间只能有一个 SparkSession 使用,所以生产环境更推荐使用 Hive 的 MetaStore。


SparkSQL 整合 Hive 的 MetaStore 主要思路就是要通过配置能够访问它, 并且能够使用 HDFS 保存 WareHouse,所以可以直接拷贝 Hadoop 和 Hive 的配置文件到 Spark 的配置目录


安装配置


进入到 shell 窗口,执行以下命令

将 hive 目录下的 hive-site.xml 拷贝至 spark 安装目录下

cp /Applications/bigsoft/apache-hive-2.3.7-bin/conf/hive-site.xml   /Applications/bigsoft/spark-3.2.1-bin-hadoop2.7/conf
复制代码

将 hadoop 安装目录下的 core-site.xml 和 hdfs-site.xml 拷贝至 spark 安装目录下

cp /Applications/bigsoft/hadoop-2.7.2/etc/hadoop/core-site.xml /Applications/bigsoft/spark-3.2.1-bin-hadoop2.7/confcp /Applications/bigsoft/hadoop-2.7.2/etc/hadoop/hdfs-site.xml /Applications/bigsoft/spark-3.2.1-bin-hadoop2.7/conf
复制代码

此时,可以在 spark-shell 中尝试链接 hive

示例代码为:

import org.apache.spark.sql.SparkSession//配置可修改为自己的本地配置val spark = SparkSession.builder().appName("HiveSupport").master("local[*]").config("spark.sql.warehouse.dir", "hdfs://localhost:8020/user/hive/warehouse").config("hive.metastore.uris", "thrift://localhost:9083").enableHiveSupport().getOrCreate()//设置日志spark.sparkContext.setLogLevel("WARN")
复制代码


spark.sql("show databases").show()
复制代码



//查找数据spark.sql("select * from test.student")
复制代码



//查看spark sql的执行计划val test0=spark.sql("select name,count(1) from test.student group by name")test0.explain(mode="extended")
复制代码


关于 Explain 参数详解


  • simple 只展示物理执行计划

  • extended 展示物理执行计划和逻辑执行计划

  • codegen 展示要 Codegen 生成的可执行 Java 代码

  • cost 展示优化后的逻辑执行计划以及相关的统计

  • formatted 以分隔的方式输出,它会输出更易读的物理执行计划,并展示每个节点的详细信息


Hive on spark

官方文档 hive on spark

是把 hive 查询从 mapreduce 的 mr (Hadoop 计算引擎)操作替换为 spark rdd(spark 执行引擎) 操作。相对于 spark on hive,这个的实现起来必须重新编译你的 spark 和导入 jar 包。


NOTE: 此时的客户端是 Hive Cli,SPark 只是作为计算引擎


Hive 查询流程及原理

  1. 执行 HQL 时,先到 MySQL 元数据库中查找描述信息,然后解析 HQL 并根据描述信息生成 MR 任务

  2. Hive 将 SQL 转成 MapReduce 执行速度慢

  3. 使用 SparkSQL 整合 Hive 其实就是让 SparkSQL 去加载 Hive 的元数据库,然后通过 SparkSQL 执行引擎去操作 Hive 表内的数据


首先需要开启 Hive 的元数据库服务,让 SparkSQL 能够加载元数据。

安装配置


提交 hive sql 使用 spark 引擎进行执行

获取 spark 的源码,根据相对应的 hadoop 版本进行相关的编译,获取对应版本

Hive on Spark 官网详情:https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started

Hive&spark 版本

具体安装参考:Hive(一)【基本概念、安装】

安装和 Spark 对应版本一起编译的 Hive,当前官网推荐的版本关系如下:


Hive on spark 配置

一 、配置 Spark on Yarn


在 Hive 所在机器安装 Spark,配置 Spark on Yarn 模式。

安装的 spark,必须是一个不包含 hive 的 jar 包的版本。

但是一般 spark 发行版都是有 hive 依赖的,所以要手动编译源码来获得不包含 hive 相关 jar 的 spark 二进制包。

spark 源码包下载地址:http://archive.apache.org/dist/spark/


不同版本编译源码包的方式:

Spark 2.0.0 前

./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.4,parquet-provided"
复制代码


从 Spark 2.0.0 开始

./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"
复制代码


从 Spark 2.3.0 开始

./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"
复制代码


编译完成后,在目录下会出现 spark-2.4.3-bin-hadoop2-without-hive.gz。

将包解压即可。

可以将 spark 的日志,集成到 Yarn 上


二 、配置 Spark 的环境变量。

export SPARK_HOME=/Applications/bigsoft/spark-2.4.3-bin-hadoop2-without-hiveexport PATH=$PATH:$SPARK_HOME/binsource ~/.bash_profile
复制代码


具体安装参考:spark 配置


三、向 HDFS 上传 Spark 纯净版 jar 包


使用不带 hadoop 的 spark 的包:spark-2.4.3-bin-hadoop2-without-hive.tgz


①解压

tar -zxvf /Applications/bigsoft/spark-2.4.3-bin-hadoop2-without-hive.tgz
复制代码


②上传只 HDFS 的/spark-jars 目录,该目录在下面需要配置

hadoop fs -put /Applications/bigsoft/spark-2.4.3-bin-hadoop2-without-hive/jars/* /user/spark/jars
复制代码


四.修改 hive-site.xml 文件


<!--Spark依赖位置,上面上传jar包的hdfs路径--><property><name>spark.yarn.jars</name><value>hdfs://localhost:8020/user/spark/jars/*</value></property><!--Hive执行引擎,使用spark--><property><name>hive.execution.engine</name><value>spark</value></property><!--Hive和spark连接超时时间--><property> <name>hive.spark.client.connect.timeout</name> <value>10000ms</value></property>
复制代码


五 测试

①启动 hive 的 metstore 服务和 hive 客户端

hive --service metastore
复制代码


②创建一张测试表

create table student(id int, name string);
复制代码

③通过 insert 测试效果

insert into table student values(1,‘abc‘);
复制代码

运行结果如图



发布于: 刚刚阅读数: 3
用户头像

飞哥

关注

还未添加个人签名 2019.11.05 加入

还未添加个人简介

评论

发布
暂无评论
hive on spark 和 spark on hive_大数据_飞哥_InfoQ写作社区