Hive on Spark遇到的问题总结

装了一个多星期的hive on spark 遇到了许多坑。还是写一篇随笔,免得以后自己忘记了。同事也给我一样苦逼的人参考。

先说明一下,这里说的Hive on Spark是Hive跑在Spark上,用的是Spark执行引擎,而不是MapReduce,和Hive on Tez的道理一样。

先看官网的资源Hive on Spark: Getting Started

要想在Hive中使用Spark执行引擎,第一步当前就是环境设置,我们需要在Hive启动的时候加载spark-assembly-1.5.0-hadoop2.6.0.jar,最简单的方法是把spark-assembly-1.5.0-hadoop2.6.0.jar包直接拷贝 到$HIVE_HOME/lib目录下。我采用的方法是在hive-site里面添加spark.home。具体给出官方的建议,这个不算坑,基本都能做好。

好了到这里开始讲我遇到的坑

第一个坑:直接使用spark pre-build版本,下来后按照上面配置弄结果报错

java.lang.NoSuchFieldError: SPARK_RPC_CLIENT_CONNECT_TIMEOUT

at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:46)

报了rpc错误,这个坑要好查点,发现是因为需要自己编译spark因为预编译的带了hive的支持也就是-Phive,这个参数是spark-sql对hive的支持用的,结果用在hive on spark就不行。没事,我们开始编译吧。接下来苦逼日子来了。

第二个坑:版本不对,刚开始以为hive 能使用 spark的任何版本,结果发现错了,hive对spark版本有着严格要求,具体对应版本你可以下载hive源码里面,搜索他pom.xml文件里面的spark版本,如果版本不对,启动hive后会报错。具体错误如下:

Failed to execute spark task, with except

<think>嗯,用户问的是如何实现Hive on Spark。我之前整理过大数据开发面试题,里面提到了HiveSpark的Shuffle机制对比,可能用户现在需要更具体的步骤来配置Hive使用Spark作为执行引擎。 首先,我需要回忆一下Hive on Spark的基本原理。Hive本身默认使用MapReduce作为执行引擎,但MapReduce在迭代计算和性能上不如Spark。所以Hive社区后来支持了Spark作为执行引擎,这样Hive的查询可以利用Spark的内存计算来加速执行。 接下来,用户可能需要详细的步骤,包括环境准备、配置修改、验证等。需要确认HiveSpark的版本兼容性,比如Hive 2.x和Spark 2.x是否兼容,或者Hive 3.x与Spark 3.x的组合。不同版本之间的配置可能有差异,所以版本兼容性很重要。 然后,安装和配置步骤。用户可能需要知道如何下载对应的HiveSpark,如何解压安装,设置环境变量。接着是Hive的配置文件修改,比如hive-site.xml中添加Spark相关的配置项,如hive.execution.engine设置为spark,以及Spark的主节点地址、应用程序名称等。 还需要将Spark的依赖包放到Hive的lib目录下,或者通过软链接的方式引用。可能还需要配置Spark的参数,比如executor的内存、核心数,以及Hive的参数如hive.spark.dynamicAllocation.enabled来启用动态资源分配。 验证部分,用户可能需要运行简单的Hive查询,比如select count(*) from table,来检查是否成功切换到Spark引擎。同,查看Spark的Web UI来确认任务是否正确执行。 另外,需要注意的常见问题,比如版本不兼容导致的错误,依赖包缺失,或者配置错误。比如,HiveSpark的版本必须匹配,否则可能会出现类冲突或者无法启动的情况。此外,日志文件的位置和如何查看日志来排查问题也是关键。 用户可能的深层需求是希望通过Hive on Spark来提升查询性能,特别是在处理复杂查询或大数据。他们可能已经遇到了Hive on MapReduce的性能瓶颈,想要迁移到Spark来获得更好的性能。因此,在回答中需要强调性能调优的相关参数,比如executor的数量、内存分配、Shuffle配置等。 最后,可能需要给出一些调优建议和最佳实践,比如如何根据集群资源调整Spark参数,如何处理数据倾斜,以及监控任务执行情况的方法。这样用户不仅能够成功配置Hive on Spark,还能优化其性能,满足实际业务需求。</think>实现 Hive on Spark 的核心目标是让 Hive 查询通过 Spark 引擎执行,从而利用 Spark 的内存计算优势提升性能。以下是完整步骤及注意事项: --- ### **1. 环境准备** #### **版本兼容性要求** - **Hive 版本 ≥ 2.0**(Hive 2.x 或 3.x) - **Spark 版本 ≥ 2.0**(推荐 Spark 2.4.x 或 3.0.x) - **Hadoop 版本 ≥ 2.7**(HiveSpark 均依赖 Hadoop) - **兼容性验证**: - Hive 3.x 通常兼容 Spark 3.x - Hive 2.x 兼容 Spark 2.4.x - 参考官方文档:[Hive on Spark 官方指南](https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark) #### **依赖组件** - **Hive 安装**:确保 Hive 已配置并能正常运行(如 HDFS 和 Metastore) - **Spark 安装**:部署 Spark 集群(Standalone、YARN 或 Kubernetes 模式) - **JDK 1.8+** - **Hadoop 集群**(HDFS 和 YARN) --- ### **2. 配置 Hive 使用 Spark 引擎** #### **步骤 1:下载并安装 HiveSpark** ```bash # Hive 安装示例(以 Hive 3.1.3 为例) wget https://downloads.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /usr/local/ mv /usr/local/apache-hive-3.1.3-bin /usr/local/hive # Spark 安装示例(以 Spark 3.1.2 为例) wget https://downloads.apache.org/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz tar -zxvf spark-3.1.2-bin-hadoop3.2.tgz -C /usr/local/ mv /usr/local/spark-3.1.2-bin-hadoop3.2 /usr/local/spark ``` #### **步骤 2:配置 Hive 使用 Spark** 修改 `hive-site.xml` 文件,添加以下配置: ```xml <configuration> <!-- 设置执行引擎为 Spark --> <property> <name>hive.execution.engine</name> <value>spark</value> </property> <!-- Spark 主节点地址(Standalone 模式) --> <property> <name>spark.master</name> <value>spark://spark-master:7077</value> </property> <!-- Spark 应用名称 --> <property> <name>spark.app.name</name> <value>Hive on Spark</value> </property> <!-- Spark 依赖的 Hive JAR 包路径 --> <property> <name>spark.sql.hive.hiveserde</name> <value>true</value> </property> <!-- Spark 动态资源分配(可选) --> <property> <name>hive.spark.dynamicAllocation.enabled</name> <value>true</value> </property> </configuration> ``` #### **步骤 3:复制 Spark 依赖到 Hive** 将 Spark 的 JAR 包软链接到 Hive 的 `lib` 目录: ```bash cd /usr/local/hive/lib for jar in /usr/local/spark/jars/*.jar; do ln -s $jar $(basename $jar); done ``` --- ### **3. 验证 Hive on Spark** #### **启动 Hive CLI 并执行查询** ```bash # 启动 Hive CLI hive # 在 Hive 中执行查询 hive> SELECT count(*) FROM your_table; ``` - **检查日志**:查看 Hive 日志(默认在 `/tmp/$USER/hive.log`)确认是否使用 Spark 引擎。 - **查看 Spark UI**:访问 Spark Web UI(默认 `http://spark-master:4040`)确认任务是否提交成功。 --- ### **4. 常见问题与解决方案** #### **问题 1:类冲突或版本不兼容** - **现象**:启动 Hive 抛出 `ClassNotFoundException` 或 `NoSuchMethodError` - **解决**: - 确保 HiveSpark 版本兼容(参考官方文档) - 使用 `spark-submit` 的 `--conf spark.driver.extraClassPath` 指定 Hive 依赖路径 #### **问题 2:Spark 无法访问 Hive Metastore** - **现象**:Hive 表元数据无法读取 - **解决**: - 确保 `hive-site.xml` 中配置了正确的 Metastore 地址: ```xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://metastore-host:3306/hive_metastore</value> </property> ``` #### **问题 3:资源不足导致任务失败** - **现象**:Spark 报错 `ExecutorLostFailure` 或 `OutOfMemoryError` - **解决**: - 增加 Executor 内存: ```bash SET spark.executor.memory=4g; ``` - 调整动态资源分配: ```bash SET hive.spark.dynamicAllocation.maxExecutors=10; ``` --- ### **5. 性能调优建议** 1. **Shuffle 分区数**: ```sql SET spark.sql.shuffle.partitions=200; -- 根据数据量调整 ``` 2. **内存分配**: ```sql SET spark.executor.memory=8g; SET spark.driver.memory=4g; ``` 3. **压缩与序列化**: ```sql SET spark.sql.compression.codec=snappy; -- 压缩中间数据 SET spark.serializer=org.apache.spark.serializer.KryoSerializer; -- 提升序列化效率 ``` --- ### **6. 完整流程图** ``` Hive CLI/Beeline ↓ Hive Driver (解析SQL) ↓ Hive Compiler (生成执行计划) ↓ Spark Execution Engine (提交 Spark 任务) ↓ Spark Cluster (执行 DAG 任务) ↓ HDFS/YARN (存储与资源调度) ``` --- ### **总结** Hive on Spark 的核心优势在于通过 Spark 引擎加速 Hive 查询,尤其适用于复杂查询和迭代计算。关键步骤包括版本匹配、配置修改、依赖管理及性能调优。实际生产环境中需结合集群资源和业务需求调整参数,例如动态资源分配、Shuffle 分区数等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值