0


关于hive on spark部署后insert报错Error code 30041问题

报错问题描述

ERROR : FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask.
[wyh@hadoop1002 spark]$ *************************************************​
ERROR : FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask.

Failed to execute spark task, with exception ‘org.apache.hadoop.hive.ql.metadata.HiveException(Failed
to create Spark client for Spark session 2df0eb9a-15b4-4d81-aea1-24b12094bf44)’
FAILED: Execution Error, return code 30041 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Failed to 
create Spark client for Spark session 2df0eb9a-15b4-4d81-aea1-24b12094bf44

​

原因分析

  1.  Spark没有启动;      需在/opt/module/spark路径下输入以下内容启动spark: ```[wyh@hadoop1002 spark]$ ./sbin/start-all.sh```
    
  2. Spark与hive的版本不一致造成的问题(这里我找到了部分spark和hive对应的版本):
  3.  注意:官网下载的 Hive 3.1.2 和 Spark 3.0.0 默认是不兼容的。因为 Hive3.1.2 支持的            Spark版本是2.4.5,所以需要我们重新编译Hive3.1.2版本。      编译步骤:      官网下载Hive3.1.2源码,修改pom文件中引用的Spark版本为3.0.0,如果编译通过,直接打包获取jar包。如果报错,就根据提示,修改相关方法,直到不报错,打包获取jar包。
    
  4.  内存资源不足,导致hive连接spark客户端超时。
    
      可以选择在配置文件里增加executor内存或减少每个executor的线程数等
    

解决方案:

按照所需时间查看hive日志:

默认路径/tmp/${user.name}/hive.log(具体根据自己的情况路径查看)

如果它

提示timed out waiting for client connection.
详细:
Caused by: java.lang.RuntimeException:java.util.concurrent.ExecutionException:java.util.concurrent.TimeoutException:Timed out waiting for client connection.

表示hive与spark连接时间超时!

1). 将/opt/module/spark/conf/目录下spark-env.sh.template文件改成spark-env.sh,

  之后添加内容:
export SPARK_DIST_CLASSPATH=$(hadoop classpath);

2). 将/opt/module/hive/conf目录下hive-site.xml修改hive和spark的连接时间

<!--Hive和Spark连接超时时间>
<property>
    <name>hive.spark.client.server.connect.timeout</name>
    <value>100000ms</value>
</property>

再次执行insert语句,基本可以成功!

3).或者是异常提示语句显示在与spark创建会话的过程失败,我猜想定时hive与yarn上的某项参数被我调整后变得不兼容了,这里给一下相关的配置:

# yarn配置里,表示能够申请的容器最大容量为20G
yarn.scheduler.maximum-allocation-mb = 20G

# hive配置里,Spark 执行程序最大 Java 堆栈大小
spark.executor.memory = 17G

#  Spark 执行程序内存开销,这是每个执行程序进程可从 YARN 请求的额外堆外内存量。它与 spark.executor.memory 一起构成 YARN 可用来为执行程序进程创建 JVM 的总内存。
spark.yarn.executor.memoryOverhead =3090MB

解析:“yarn.scheduler.maximum-allocation-m“”参数我是做了修改的 ,之前的因为不合适,所以我将其下调为20G

源配置:

yarn.scheduler.maximum-allocation-mb = 20G
spark.executor.memory = 17G
spark.yarn.executor.memoryOverhead =3090MB

修改为:

yarn.scheduler.maximum-allocation-mb = 20G
spark.executor.memory = 13G
spark.yarn.executor.memoryOverhead =3090MB

如果结果不能立即解决可以根据实际情况进行调整

总内存 = Spark Executor内存 + Spark Executor的JVM堆内存 + Spark Executor的JVM非堆内存

其中,Spark Executor内存是Spark配置中设置的executor总内存,包括堆内存和非堆内存。因此,将JVM堆内存和非堆内存加起来即可得到JVM的总内存使用量。

4).hive 创建的 spark 配置文件

[wyh@hadoop1002 software]$ vim /opt/module/hive/conf/spark-defaults.conf
# 添加如下内容(在执行任务时,会根据如下参数执行)
spark.master                               yarn
spark.eventLog.enabled                   true
spark.eventLog.dir                        hdfs://hadoop102:8020/spark-history
spark.executor.memory                    1g
spark.driver.memory                       1g

5). 确认是否创建 hdfs 存储历史日志路径

[wyh@hadoop1002 software]$ hadoop fs -mkdir /spark-history

6).确认是否上传 Spark 纯净版 jar 包

[wyh@hadoop1002 software]$ hadoop fs -mkdir /spark-jars
[wyh@hadoop1002 software]$ hadoop fs -put spark-3.0.0-bin-without-hadoop/jars/* /spark-jars

7).确认 hive-site.xml 配置文件

[wyh@hadoop1002 software]$ vim /opt/module/hive/conf/hive-site.xm

检查配置文件是否配置正确

<!--Spark依赖位置(注意:端口号8020必须和namenode的端口号一致)-->
<property>
    <name>spark.yarn.jars</name>
    <value>hdfs://hadoop102:8020/spark-jars/*</value>
</property>
  
<!--Hive执行引擎-->
<property>
    <name>hive.execution.engine</name>
    <value>spark</value>
</property>

8).在

hive/conf/hive-site.xml

中追加:

<!--Hive和spark连接超时时间-->
<property>
    <name>hive.spark.client.connect.timeout</name>
    <value>100000ms</value>
</property>
 然后重新启动hive服务端,执行insert
hive (default)> insert into table student values(1,'abc');
Query ID = hadoop_20220728201636_11b37058-89dc-4050-a4bf-1dcf404bd579
Total jobs = 1
Launching Job 1 out of 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Running with YARN Application = application_1659005322171_0009
Kill Command = /datafs/module/hadoop-3.1.3/bin/yarn application -kill application_1659005322171_0009
Hive on Spark Session Web UI URL: http://hadoop104:38030

Query Hive on Spark job[0] stages: [0, 1]
Spark job[0] status = RUNNING
--------------------------------------------------------------------------------------
          STAGES   ATTEMPT        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED
--------------------------------------------------------------------------------------
Stage-0 ........         0      FINISHED      1          1        0        0       0
Stage-1 ........         0      FINISHED      1          1        0        0       0
--------------------------------------------------------------------------------------
STAGES: 02/02    [==========================>>] 100%  ELAPSED TIME: 40.06 s
--------------------------------------------------------------------------------------
Spark job[0] finished successfully in 40.06 second(s)
WARNING: Spark Job[0] Spent 16% (3986 ms / 25006 ms) of task time in GC
Loading data to table default.student
OK
col1    col2
Time taken: 127.46 seconds
hive (default)> 

无异常报错,解决

说明:因为执行insert语句运行速度会很慢,所以需要耐心等待一会,如果依次执行不成功可以重新多试几次,本人亲测,重新执行几次真的会成功,好像存在概率问题,很玄乎。

本篇文章是记录我遇到的bug,怕以后遇到忘记怎么解决,记录自己的”遇坑“之路吧


标签: hive spark hadoop

本文转载自: https://blog.csdn.net/weixin_60309887/article/details/135401470
版权归原作者 航的码农之路 所有, 如有侵权,请联系我们删除。

“关于hive on spark部署后insert报错Error code 30041问题”的评论:

还没有评论