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

avatar
作者
猴君
阅读量:0

报错问题描述

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,怕以后遇到忘记怎么解决,记录自己的”遇坑“之路吧


    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!