hive on spark 遇到的坑

本文详细记录了作者在安装配置 Hive on Spark 过程中遇到的各种问题及解决办法,包括环境配置、版本匹配、编译过程中的常见错误处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装了一个多星期的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 exception 'org.apache.hadoop.hive.ql.metadata.HiveException(Failed to create spark client.)' FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.spark.SparkTask

第三个坑:spark的编译,在这里我使用的是hive稳定版本2.01,查看他的pom.xml需要的spark版本是1.5.0.接着讲诉我遇到坑爹的事情,直接让我快一个星期时间白费。在编译的时候使用了hive 官网提供的命令,悲催的事情发生了,使用的命令是:

./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6"

然后将 lib/spark-assembly-1.5.0-hadoop2.6.0.jar 这个包拷到你现在的spark/lib 下另外一个相同的注意备份

但是当启动spark集群的时候报错了,错误如下

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

这个时候坑爹了,网上找来找去都没找到这个问题解决方案,上面错误原因就是说slf4j这个包找不到,你妹,完全按照官网来的,官网是怎么测试的呀,悲催了。接下来就是苦恼我一周的安装过程。

在网上找呀找,稍微看到一个靠谱的说法是编译的时候没有讲hadoop的jar包导进来,但是给出解决办法是在spark-env.sh里面添加

export SPARK_DIST_CLASSPATH=$(hadoop classpath)

好了添加了这个,spark master可以起来了,但是slaves仍然是上面错误,又开始找资料了。每天都在痛苦的阅读英文文档,差点抑郁了。而且国内google这不给力,用vpn时断时续,差点砸电脑。最后快绝望的时候回到spark官网,仔细阅读他提供的编译命令,死马当活马医吧。按照官网提供的编译命令再次编译spark.官网地址:http://spark.apache.org/docs/1.5.0/building-spark.html。他默认1.5.0使用是scala2.10进行编译,但是我安装的scala是2.11所以使用了以下命令

./dev/change-scala-version.sh 2.11
mvn -Pyarn -Phadoop-2.4 -Dscala-2.11 -DskipTests clean package

这次编译的spark-assembly-1.5.0-hadoop2.6.0.jar 包有140mb左右比上次的多了40mb,感觉有点靠谱了,将这个包移过去,ok了!太开心了,一切都跑起来了。泪奔了,hive官网害人呀。

第四个坑,这个坑也算一个不大不小的坑,因为我偶然想装一下hue,在装hue遇到的错误,现在记录一下。
首先坑是hadoop的坑,如果在hadoop core-site.xml下面没有配置

<property>
    <name>hadoop.proxyuser.hdfs.hosts</name>
    <value>*</value>
    <description>Defines the Unix user, hdfs, that will run the HttpFS server as
      a proxyuser.</description>
  </property>
  <property>
    <name>hadoop.proxyuser.hdfs.groups</name>
    <value>*</value>
    <description>Replaces hdfs with the Unix user that will start the HttpFS server.
      </description>
  </property>
httpfs-site.xml
  <property>
    <name>hadoop.proxyuser.hue.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.hue.groups</name>
    <value>*</value>
</property>
hdfs-site.xml

<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>

这三个配置没配好的你讲没有权限访问hadoop,但是这个都是小事情,网上教程多,不怎么算坑。
接下来hive配置才是一个不大不小的坑,因为网上基本没有什么资料,对应版本是hive是2.0.1
网上基本的版本都教了怎么连接,但是用网上连接方法hive.log老是显示 old version ? 我一直以为我hive版本过高了,但是换成1.2.1这个版本一样错误。
于是又开始看google,看的又快奔溃了。开始网上有人叫把hive.server2.authentication这个属性改为NOSASL,但是改来改去没啥卵用,好了我就不卖关子了,
hue要连接hive其实还需要修改两个属性
第一个属性是hive.server2.authentication 这个要是NONE
第二个属性是hive.server2.enable.doAs 一定要是flase 不然就会报 old version?
看到可视化界面的时候还是有点成就感的。

第五个坑,装好了那么多东西,肯定想跑跑试试,于是觉得对nginx 日志进行分析,这时候对网上hive 分析 nginx进行了搜索,搜了一大堆,但是按他们的正则建表都不可以用,又开始泪奔了。
不停百度,资料结果全是千篇一律,好像大家抄的都是一篇。结果还是找呀找,终于找到原因了
原来正则必须不是一根斜杠,原来java必须是两根\把我建表sql展示一下,不然还是太空了。其中不需要out那一行,直接用input就行
create table logs(ipaddress STRING,identity STRING,user STRING,time STRING,request STRING,status STRING,size STRING,host STRING,referer STRING,rbody STRING,agent STRING,forwarded STRING,uaddr STRING,ustatus STRING,urtime STRING,rtime STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ('input.regex' =
'([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) (-) (-) (\[.\]) (\"[^\"]\") (\d{3}) (\d{1,}) (\"[^\"]\") (\"[^\"]\") (-|[^\s]) (\"[^\"]\") (\"[^\"]*\") ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5}) (\d{3}) ([\d]{1,}\.[\d]{1,}) ([\d]{1,}\.[\d]{1,})')
接下来可以跑了,扔了一个sql,你妹又报错了
return code 3 from org.apache.hadoop.hive.ql.exec.spark.SparkTask

这个坑不算大,因为通过查找hive,spark日志发现原来spark找不到org.apache.hadoop.hive.contrib.serde2.RegexSerDe
这个网上解决方法就多了,就是加上hive.aux.jars.path 这个属性里面你这个jar包地址如果是本地的记住前面要加file://哦不然找不到

好了这是安装hive on spark 遇到的一些坑,希望我的资料能对需要的人有些帮助吧。个人总结:遇到不会的别看网上的文章了,全是千篇一律,还是看官网的资料跟官网论坛,比看那些安装篇强上太多。


作者: 暗瞳 
链接:http://www.imooc.com/article/8613
<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、付费专栏及课程。

余额充值