大数据

Spark执行错误-->数据量大时导致yarn崩溃

2019-12-16  本文已影响0人  勤奋的超跑

一、问题现象说明:

1, IQL在执行数据量超过1亿条数据的时候,执行不出来结果

2, 在执行超过四秒以后Yarn的node节点开始出问题

3,关闭执行以后查看CPU、内存 资源没有被占满

二、分析问题思路:

1, 通过 client 模式 将数据打印的日志展现出来,并重定向到本地保存日志

2,查看日志中的内容分析Error 如下:

ERROR TransportRequestHandler: Error sending result StreamResponse{streamId=/jars/iql-engine.jar, byteCount=145685437, body=FileSegmentManagedBuffer{file=/home/app/iqlEngine/iql-engine.jar, offset=0, length=145685437}} to /79.12.72.8:6862; closing connection

java.io.IOException: Connection reset by peer

该ERROR是报连接错误,有些错误信息可能是之前的问题导致的后果,所以继续往前查看信息 

3,查看前面的WARN信息如下:

WARN YarnSchedulerBackend$YarnSchedulerEndpoint: Requesting driver to remove executor 22 for reason Container marked as failed: container_1555493438863_1260_01_000023 on    host: centos5. Exit status: 1. Diagnostics: Exception from container-launch.

Container id: container_1555493438863_1260_01_000023

Exit code: 1

Stack trace: ExitCodeException exitCode=1: 

 at org.apache.hadoop.util.Shell.runCommand(Shell.java:601)

 at org.apache.hadoop.util.Shell.run(Shell.java:504)

 at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:786)

 at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:213)

 at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)

 at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)

 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)

 该WARN上说yarn的YarnSchedulerBackend创建容器失败,于是请求Driver移除编号为22的执行器,但是为什么容器创建失败呢,创建容器失败最主要的的就是资源分配问题。但是在执行命令时已经给定了 excutor 的资源为 --num-executors 8   --executor-memory 8g  好像没有生效  于是手动写一个Test类测试查询。

 依旧是同样的问题,于是查看SparkSession的配置 发现有个动态配置开启了,于是尝试将之前的动态分配给关闭,然后再测试一下,并且在执行命令时给定同样的命令 发现执行成功了。

三、出现该问题的原因:

执行命令中给定  --num-executors 8 命令和  spark.dynamicAllocation.enabled true 冲突了  导致 --num-executors 8没有生效,并且yarn集群的动态调用资源可能会把自己的资源占满,导致NodeManager相继挂掉。

四、总结

1,在出现问题时,需要认真分析日志,如果ERROR提示不明确时,应考虑分析整个执行流程的日志

2,通过yarn执行动态资源调度的时候可能会导致将资源占满

3,spark2.X以后 代码中的配置的属性和执行命令中配置的属性有冲突,会优先选择代码中的配置

4,分析问题时,需要了解每个组件的作用,这样分析问题会更加全面

上一篇 下一篇

猜你喜欢

热点阅读