一、问题现象说明:
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,分析问题时,需要了解每个组件的作用,这样分析问题会更加全面