【Azkaban报错解决】FAILED SemanticException Failed to get a spark session

问题描述:

【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第1张图片
ods_to_dwd_log报以下错误
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第2张图片
ods_to_dim_db报一下错误
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第3张图片
可以看出都是相同报错,无法创建spark事务

Logging initialized using configuration in jar:file:/opt/module/hive/lib/hive-common-3.1.2.jar!/hive-log4j2.properties Async: true
05-05-2022 14:31:02 CST ods_to_dim_db INFO - Hive Session ID = 77b1dd10-3b70-44b7-8c41-96571c4a00c2
05-05-2022 14:31:04 CST ods_to_dim_db INFO - No Stats for gmall@ods_user_info, Columns: birthday, login_name, gender, create_time, nick_name, name, user_level, phone_num, id, email, operate_time
05-05-2022 14:32:36 CST ods_to_dim_db INFO - FAILED: SemanticException Failed to get a spark session: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to create Spark client for Spark session 6115db31-a456-4b8a-bd68-2b9defe20b95
05-05-2022 14:32:37 CST ods_to_dim_db INFO - Process with id 32405 completed unsuccessfully in 102 seconds.
05-05-2022 14:32:37 CST ods_to_dim_db ERROR - Job run failed!
java.lang.RuntimeException: azkaban.jobExecutor.utils.process.ProcessFailureException: Process exited with code 64
	at azkaban.jobExecutor.ProcessJob.run(ProcessJob.java:312)
	at azkaban.execapp.JobRunner.runJob(JobRunner.java:823)
	at azkaban.execapp.JobRunner.doRun(JobRunner.java:602)
	at azkaban.execapp.JobRunner.run(JobRunner.java:563)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	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)
Caused by: azkaban.jobExecutor.utils.process.ProcessFailureException: Process exited with code 64
	at azkaban.jobExecutor.utils.process.AzkabanProcess.run(AzkabanProcess.java:125)
	at azkaban.jobExecutor.ProcessJob.run(ProcessJob.java:304)
	... 8 more

排除问题

先对问题进行排除:
首先,在该服务器上尝试启动hive,并且手动执行该脚本。
ods_to_dwd_log执行成功。
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第4张图片
ods_to_dim_db也执行成功
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第5张图片如果执行成功,说明hive-on-spark搭建成功。如果失败,则搭建失败。就要考虑是版本兼容性问题还是配置文件出错。

解决方案一

尝试解决方法一:
可以尝试调整hadoop/etc/hadoop/capacity-scheduler.xml中yarn.scheduler.capacity.maximum-am-resource-percent参数,application master资源比例,默认为0.8,如果该值设置过大,就会导致mapreduce时内存不足,就会报上面错误。如果该值是默认值,在学习环境下application master分配内存较少,可能同时只能执行一个job,影响效率。可以尝试调整0.5,

  
    yarn.scheduler.capacity.maximum-am-resource-percent
    0.5
    
      Maximum percent of resources in the cluster which can be used to run
      application masters i.e. controls number of concurrent running
      applications.
    
  

成功执行。
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第6张图片
但是再运行一次还是失败,说明是存在偶然性。
然后去yarn的web:http://hadoop103:8088/cluster/apps界面查看具体的报错信息。
通过Hive Session ID = c1fbe469-6f9d-4dba-b7e8-d6092676f8b8找到对应的task
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第7张图片

【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第8张图片

2022-05-05 16:58:21,139 INFO yarn.ApplicationMaster: Final app status: FAILED, exitCode: 13, (reason: User class threw exception: java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf$ConfVars
at org.apache.hive.spark.client.rpc.RpcConfiguration.(RpcConfiguration.java:48)
at org.apache.hive.spark.client.RemoteDriver.(RemoteDriver.java:138)
at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:536)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:728)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf$ConfVars
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 8 more

后来发现这几个报错都有个共同点,就是任务都是在hadoop104的节点上进行的。然后在104的节点上手动跑了这个任务,确实发生了报错。
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第9张图片
查了好多资料都不知道为社么。

解决方案二

其实当出现报错的时候,就感觉是内存太小,以至于同时跑几个脚本都跑不了。
所以尝试关闭虚拟机,将虚拟机的内存由4G调升至8G。
再尝试跑一下,成功

然后我们再分析下hive on spark的具体内存开销是什么样的?

Hive on Spark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法,执行引擎变成了Spark,Spark负责采用RDD执行。
Spark on Hive : Hive只作为存储元数据,Spark负责SQL解析优化,语法是Spark SQL语法,Spark负责采用RDD执行。

当运行ods_to_dwd_log.sh数据装载脚本时,会启动hive,然后经过驱动器(解析器,编译器,优化器,装载器)就会向yarn提交spark任务。
当脚本执行前,jvm进程主要有Hadoop,azkaban进行
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第10张图片
然后当spark任务提交时
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第11张图片
当运行任务时
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第12张图片
Spark在Yarn-Cluster部署模式下,程序在提交之后会依次创建三个进程:SparkSubmit,ApplicationMaster和CoarseGrainedExecutorBackend。

Cluster 模式将用于监控和调度的 Driver 模块启动在 Yarn 集群资源中执行。一般应用于实际生产环境。
在 YARN Cluster 模式下,任务提交后会和 ResourceManager 通讯申请启动ApplicationMaster,
随后 ResourceManager 分配 container,在合适的 NodeManager 上启动 ApplicationMaster,此时的 ApplicationMaster 就是 Driver。
Driver 启动后向 ResourceManager 申请 Executor 内存,ResourceManager 接到ApplicationMaster 的资源申请后会分配 container,然后在合适的 NodeManager 上启动Executor 进程
Executor 进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行main 函数,
之后执行到 Action 算子时,触发一个 Job,并根据宽依赖开始划分 stage,每个 stage 生成对应的 TaskSet,之后将 task 分发到各个 Executor 上执行。

Executor参数设置

参考
在spark的的一个工作节点的上的一个jvm进程Executor,是整个集群专门用于计算的节点。在提交应用中,可以提供参数指定计算节点的个数,以及对应的资源。这里的资源一般指的是工作节点 Executor 的内存大小和使用的虚拟 CPU 核(Core)数量。

应用程序相关启动参数如下:
【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第13张图片

yarn-site相关调优

/opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml

  1. 调度器的选择,默认容量
  2. ResourceManager处理调度器请求的线程数量,默认50
  3. 是否让yarn自动检测硬件进行配置,默认是false
  4. 是否将虚拟核数当作CPU核数,默认是false,采用物理CPU核数
  5. 虚拟核数和物理核数乘数,默认是1.0
  6. NodeManager使用内存数 和 cpu核数
  7. 容器最大内存,最小内存,最小cpu核数,最大cpu核数
  8. 关闭虚拟内存检查
  9. 虚拟内存和物理内存设置比例,默认2.1
  10. 是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是 true
  11. 是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是 true

capacity-scheduler相关调优

/opt/module/hadoop-3.1.3/etc/hadoop/capacity-scheduler.xml

[atguigu@hadoop102 hadoop]$ vim capacity-scheduler.xml


    yarn.scheduler.capacity.maximum-am-resource-percent
    0.8

容量调度器对每个资源队列中同时运行的Application Master占用的资源进行了限制,该限制通过yarn.scheduler.capacity.maximum-am-resource-percent参数实现,其默认值是0.1,表示每个资源队列上Application Master最多可使用的资源为该队列总资源的10%,目的是防止大部分资源都被Application Master占用,而导致Map/Reduce Task无法执行。
生产环境该参数可使用默认值。但学习环境,集群资源总数很少,如果只分配10%的资源给Application Master,则可能出现,同一时刻只能运行一个Job的情况,因为一个Application Master使用的资源就可能已经达到10%的上限了。故此处可将该值适当调大

JVM相关调优

ERROR hdfs.HDFSEventSink: process failed
java.lang.OutOfMemoryError: GC overhead limit exceeded



export JAVA_OPTS="-Xms100m -Xmx2000m -Dcom.sun.management.jmxremote"

JVM heap一般设置为4G或更高
-Xmx与-Xms最好设置一致,减少内存抖动带来的性能影响,如果设置不一致容易导致频繁fullgc。
-Xms表示JVM Heap(堆内存)最小尺寸,初始分配;-Xmx 表示JVM Heap(堆内存)最大允许的尺寸,按需分配。如果不设置一致,容易在初始化时,由于内存不够,频繁触发fullgc。

hive ob spark的相关调优

【Azkaban报错解决】FAILED SemanticException Failed to get a spark session_第14张图片

容量调度器的调优

参考

hive-on-spark报错:org.apache.hadoop.hive.ql.parse.SemanticException:Failed to get a spark session

解决hive on spark中队列占用问题

Spark 中 JVM 内存使用及配置详情、spark报错与调优、Spark内存溢出OOM异常

你可能感兴趣的:(面试,学习路线,阿里巴巴,java,java进阶,后端)