温锦文欧普厨电及净水器总代理 发表于 2024-7-25 00:30:10

Hive On Spark 概述、安装配置、计算引擎更换、应用、非常办理

前言: 本篇文章在已经安装 Hadoop 3.3.4 与 Hive 3.1.3 版本的底子上举行,与笔者版本不一致也没有关系,按照步调来就行了。
如果你不想使用低版本的 Spark(比方:Spark 2.x 系列),请直接跳转到本文目录【重编译源码】。
Hadoop 安装

详情查察我的这篇博客:Hadoop 完全分布式搭建(超具体)
Hive 安装

详情查察我的这篇博客:Hive 搭建(将 MySQL 作为元数据库)

Hive On Spark 与 Spark On Hive 区别

Hive On Spark

在 Hive 中集成 Spark,Hive 既作为元数据存储,又负责解析 HQL 语句,只是将 Hive 的运行引擎更换为 Spark,由 Spark 负责运算工作,而不再是默认的 MR 引擎,但摆设较为复杂。
Spark On Hive

Hive 只负责元数据存储,由 Spark 来解析与执行 SQL 语句,此中的 SQL 语法为 Spark SQL,且摆设简单。
Spark on Hive 的优点在于它提供了更机动的编程接口,实用于各种数据处理惩罚需求,但性能大概不如 Hive on Spark,特别是在处理惩罚复杂查询时。
摆设 Hive On Spark

查询 Hive 对应的 Spark 版本号

每个 Hive 版本适配的 Spark 都不雷同,使用的 Spark 版本必须与 Hive 源码中指定的版本一致,或者重新编译源码,更换成必要的版本。
我这里使用的 Hive 版本为 3.1.3,如今通过官方网站 —— Index of /hive 获取对应版本的 Hive 源码。
   https://img-blog.csdnimg.cn/6390e7598fe14bc7885c1a600605164b.png下载完成后,解压缩,在主目录下找到 pom.xml 文件:
   https://img-blog.csdnimg.cn/85aec3ef05854308b6b4cb2c97f9d5ba.png直接通过欣赏器打开该文件,搜索 spark.version 即可查询到对应的 Spark 版本。
   https://img-blog.csdnimg.cn/8e1ec999d1444344963ad8db327a9262.png可以看到 Hive 3.1.3 对应的 Spark 版本为 2.3.0,如果你不想使用该版本,那么使用 IDEA 打开该项目,在该 pom.xml 文件中修改你必要的 Spark 版本,然后使用 maven 重新打包,重新安装 Hive 即可。
我这里就不在重新编译了,该 Spark 版本已经可以满意我的使用需求。
下载 Spark

在 Spark 官方网站直接下载 —— Index of /dist/spark
找到对应版本举行下载,这里必要留意选择纯净版的包下载,如下所示:
   https://img-blog.csdnimg.cn/a82cfc917703493595b0ccee894ceb84.png选择 without-hadoop 没有集成 Hadoop 的 Spark 版本举行下载,如许 Spark 就会使用集群系统中安装的 Hadoop。
将下载好的包上传到集群中,下面开始安装摆设 Spark。
   留意,请将下列提到的路径更换为你本身现实的存储路径!!!不一定必要和我一样。
解压 Spark

tar -xvf spark-2.3.0-bin-without-hadoop.tgz -C /opt/module/
随手改个名字
cd /opt/module
mv spark-2.3.0-bin-without-hadoop/ spark-2.3.0
配置环境变量

vim /etc/profile
文件末端添加:
#SPAKR_HOME
export SPARK_HOME=/opt/module/spark-2.3.0
export PATH=$PATH:$SPARK_HOME/bin
刷新环境变量:source /etc/profile
指定 Hadoop 路径

因为我们的版本选择的纯净版,所以必要在 Spark 环境文件中指定已经安装的 Hadoop 路径。
cd $SPARK_HOME/conf

mv spark-env.sh.template spark-env.sh

vim spark-env.sh
在该文件末端添加,指定 Hadoop 路径:
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
添加完成之后,保存并退出。
此中 $(hadoop classpath) 的作用是获取 Hadoop 类路径的值 (必要提前配置 Hadoop 的环境变量,否则获取不到) ,我们可以直接打印看看它存储的内容:
   https://img-blog.csdnimg.cn/de8c65ff455443abbf918fea9ded7a1e.png在 Hive 配置 Spark 参数

进入 Hive 的 conf 目录中,创建 Spark 配置文件,指定相干参数。
cd $HIVE_HOME/conf

vim spark-default.conf
添加如下配置内容:
# 指定提交到 yarn 运行
spark.master                           yarn
# 开启日志并存储到 HDFS 上
spark.eventLog.enabled                   true
spark.eventLog.dir                     hdfs://hadoop120:8020/spark-logDir
# 指定每个执行器的内存
spark.executor.memory                  1g
# 指定每个调度器的内存
spark.driver.memory                                             1g
配置文件创建完成后,在 HDFS 上创建 Spark 的日记存储目录。
hadoop fs -mkdir /spark-logDir
拷贝 Hive Jar 包

将 Hive 中的 hive-exec-3.1.3.jar 包拷贝到 Spark 中。
cp $HIVE_HOME/lib/hive-exec-3.1.3.jar $SPARK_HOME/jars/
上传 Jar 包并更换引擎

因为只在一台呆板上安装了 Hive 和 Spark,所以当我们将任务提交到 Yarn 上举行调理时,大概会将该任务分配到其它节点,这就会导致任务无法正常运行,所以我们必要将 Spark 中的所有 Jar 包到 HDFS 上,并告知 Hive 其存储的位置。
上传文件
hadoop fs -mkdir /spark-jars

cd $SPARK_HOME

hadoop fs -put ./jars/* /spark-jars
在 Hive 的配置文件中指定 Spark jar 包的存放位置:
cd $HIVE_HOME/conf

vim hive-site.xml
在此中添加下列三项配置:
<!--Spark依赖位置-->
<property>
    <name>spark.yarn.jars</name>
    <value>hdfs://hadoop120:8020/spark-jars/*</value>
</property>

<!--Hive执行引擎-->
<property>
    <name>hive.execution.engine</name>
    <value>spark</value>
</property>

<!--提交任务超时时间,单位ms-->
<property>
    <name>hive.spark.client.connect.timeout</name>
    <value>5000</value>
</property>
配置项添加完成后,我们就配置好了 Hive On Spark,下面临其举行测试。
   如果你在配置前已经启动了 Hive 元数据服务,请重启再测试。
测试 Hive On Spark

进入 Hive 中创建测试表:
drop table if exists books;
create table books(id int,book_name string);
写入测试数据:
insert into books values (1,'bigdata');
insert into books values (2,'hive');
insert into books values (3,'spark');
https://img-blog.csdnimg.cn/e49117cb95ea449387b74b7be7889049.png
   留意,每次打开终端的首次 MR 操作会消耗比较多的时间,要去与 Yarn 创建连接、分配资源等,大概 30s 至 1m 左右。
步伐运行时,可以访问其给出的 WEB URL 地址(http://hadoop120:45582 不固定),访问后如下所示:
   https://img-blog.csdnimg.cn/428bfa3becd74f02ac042d34a079ba79.png可以看到运行速率照旧嘎嘎快的(真是受够了 MR!):
https://img-blog.csdnimg.cn/521765092aeb4efd96057763bd8bc6c8.png
查询效果:
select * from books;
https://img-blog.csdnimg.cn/08aa4813de974dc283f810a605880505.png
数据插入完成,测试成功。
Yarn 资源分配设置

当我们在 Hive On Spark 模式下同时启用多个 Hive 客户端举行操作时,会发现,后启动的多个 Hive 执行任务时(大概)会卡住,如下所示:
   https://img-blog.csdnimg.cn/ef53d08a8b224909a860c5e1ecc41715.png进入历史服务器,查察该任务的执行详情,会发现如下提示:
https://img-blog.csdnimg.cn/498c9658c907419aafc3aef8d9cfd0f1.png
提示任务已经添加但是未激活,缘故原由是 AM 资源溢出。
Yarn 默认使用的是容量调理器 Capacity Scheduler(队列),该队列的总容量默认为 Yarn 总资源的 %10(1024的倍数),当前我的 Yarn 集群环境分配的总资源为 18G,所以这里队列的最大容量为 2048MB,也就是 2G。
我启动第一个 Hive 客户端运行步伐后,Yarn 成功的为其分配了 AM 资源,当我又启动了其它的 Hive 客户端运行步伐时,就会导致 AM 资源分配失败,因为两个 AM 的总资源相加已经达 3G 左右,所以会导致任务卡顿或失败。
办理方法:进步 Yarn 为队列分配的总资源,修改 Hadoop 配置文件目录下的 capacity-scheduler.xml 文件,调解资源分配比例,默认为 0.1,对学习环境不太友爱,建议调解为 0.8。
cd $HADOOP_HOME/etc/hadoop

vim capacity-scheduler.xml
   https://img-blog.csdnimg.cn/14288c45b4124b6ab5853cab2172685c.png修改完成后,留意将该文件同步到集群中的其它呆板,然后重启 Yarn 即可。
办理依赖辩论题目

当我们在使用 Hive On Spark 时,大概会发生如下依赖辩论题目:
Job failed with java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapreduce.lib.input.FileInputFormat
        at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:262)
        at org.apache.hadoop.hive.shims.Hadoop23Shims$1.listStatus(Hadoop23Shims.java:134)
        at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:217)
        at org.apache.hadoop.mapred.lib.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:75)
        at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileInputFormatShim.getSplits(HadoopShimsSecure.java:321)
        at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getCombineSplits(CombineHiveInputFormat.java:444)
        at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getSplits(CombineHiveInputFormat.java:564)
        at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:200)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
        at scala.Option.getOrElse(Option.scala:121)
        at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
        at org.apache.spark.rdd.RDD.getNumPartitions(RDD.scala:267)
        at org.apache.spark.api.java.JavaRDDLike$class.getNumPartitions(JavaRDDLike.scala:65)
        at org.apache.spark.api.java.AbstractJavaRDDLike.getNumPartitions(JavaRDDLike.scala:45)
        at org.apache.hadoop.hive.ql.exec.spark.SparkPlanGenerator.generateMapInput(SparkPlanGenerator.java:215)
        at org.apache.hadoop.hive.ql.exec.spark.SparkPlanGenerator.generateParentTran(SparkPlanGenerator.java:142)
        at org.apache.hadoop.hive.ql.exec.spark.SparkPlanGenerator.generate(SparkPlanGenerator.java:114)
        at org.apache.hadoop.hive.ql.exec.spark.RemoteHiveSparkClient$JobStatusJob.call(RemoteHiveSparkClient.java:359)
        at org.apache.hive.spark.client.RemoteDriver$JobWrapper.call(RemoteDriver.java:378)
        at org.apache.hive.spark.client.RemoteDriver$JobWrapper.call(RemoteDriver.java:343)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Spark job failed during runtime. Please check stacktrace for the root cause.
这是由于 Hive 中的 guava 包版本比较高,与 Spark 不太兼容,所以我们必要更换为低一点的版本,建议使用 guava-13.0.jar 版本。
Jar 包获取地址:Maven 堆栈
# 备份 Hive 的高版本
cd $HIVE_HOME/lib
mv guava-19.0.jar guava-19.0.jar.bak

# 将低版本放入 Hive 与 Spark 中
cp guava-13.0.jar $HIVE_HOME/lib
cp guava-13.0.jar $SPARK_HOME/jars

# 还需上传到 HDFS 中存储 Spark Jars 的目录下
hadoop fs -put guava-13.0.jar /spark-jars
重新启动 Hive 终端就可以生效啦。
重编译源码

如果你不想使用 Hive 如今指定的 Spark 版本,想要更换更高或者更低的版本,则必要去修改 Hive 源码,手动指定其版本,然后重新举行打包,重新安装 Hive。
具体操作可以参考这篇博客:从源代码编译构建Hive3.1.3

如果你不想手动重新编译,可以使用下列已经编译好的 Hive 版本:


[*] hive-3.1.3-with-spark-3.3.1.tar.gz
[*] spark-3.3.1-bin-without-hadoop.tgz
Hive 版本为 3.1.3,重编译后支持 Spark 3.3.1 版本,与 Hadoop 3.3.4 系列兼容良好,亲测有用。
https://img-blog.csdnimg.cn/95390143c8074264a3c572300d013530.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Hive On Spark 概述、安装配置、计算引擎更换、应用、非常办理