关于Spark中的常见问题及解决方法(1)

 

 

 

前言

对于Spark的故障排除,很多因素都可能会影响Spark作业,我们无法涵盖所有内容。 但我们可以讨论一些更常见的Spark问题。

Spark作业无法启动

这个问题经常出现,特别是当我们刚开始使用新的部署或环境时。
主要症状

  • Spark作业无法启动
  • 除了驱动程序之外,Spark UI不会显示群集上的任何节点。
  • Spark UI显示的信息好像不正确。

可能的原因分析
这种情况通常发生在群集或应用程序的资源需求没有被正确配置。 在配置群集的过程中,我们可能错误地配置了某些内容(络,文件系统和其他资源),导致运行Driver的节点无法与Executor通信。 这可能是因为我们未指定打开特定的IP和端口号或使用了错误的IP和端口号。 另外,也可能是因为我们的应用程序为每个Executor请求的资源大于集群管理器当前空闲的资源,在这种情况下,Driver将会一直等待,直到Executor启动。

可能的解决方法

  • 确保机器可以在指定的端口上相互通信。 理想情况下,除非使用更严格的安全限制,否则应该打开工作节点之间的所有端口。
  • 确保Spark资源配置正确,并且集群管理器也被正确配置。 可以尝试先运行一个简单的应用程序,看看是否有效。 一个常见问题可能是每个Executor请求的内存多于集群管理器可以自由分配的内存,因此可以比较一下UI中显示的空闲内存和spark-submit提交的内存配置。

运行前的出现错误

这种问题很可能是因为我们修改了一些代码,导致程序无法正常运行。

主要症状

  • 命令根本无法运行,并且输出大量的错误消息。
  • 检查Spark UI时候发现没有任何jobs,stages或tasks运行。

可能的原因分析

在检查并确认Spark UI环境选项卡显示应用程序的信息都正确后,在仔细检查我们的Spark代码。 很多时候,可能会出现一个简单的拼写错误或不正确的列名,导致Spark作业无法编译到其底层的Spark计划中。

可能的解决方法

  • 查看Spark返回的错误,以确认代码中没有问题,例如提供错误的输入文件路径或字段名称。
  • 仔细检查群集的Driver,Executor和正在使用的存储系统之间的网络连接是否正常
  • 错误的库或CLASSPTH值可能存在导致加载库的版本不正确。 尝试简化应用程序,直到获得一个重现问题的较小版本(例如,只读取一个数据集)。

运行中出现错误

主要症状

  • 一个Spark作业在整个集群上成功运行,但下一个失败。
  • 多步查询中某一步的失败。
  • 一个定时作业,昨天运行成功,但今天失败了。

可能的解决方法

  • 检查数据格式是否存符合预期。 这可能是由于某些上游数据出现变化造成的。
  • 如果在运行查询时(即在启动任务之前)弹出错误,这意味着我们可能拼错了查询中引用的列名,或者引用的列,视图或表不存在。
  • 仔细查看堆栈跟踪,试图找到涉及哪些组件的线索(例如,运行时所用的算子和所处于的阶段)
  • 尝试通过逐步检查输入数据并确保数据格式正确。 还可以尝试删除部分逻辑来缩小排查范围。
  • 如果作业运行任务一段时间后失败,则可能是由于输入数据本身存在问题,其中可能是因为没有正确schema或数据与schema不匹配。 例如,指定的schema中表名数据不包含空值,但实际数据包含空值,这可能导致某些转换失败。
  • 也有可能是因为代码逻辑问题导致崩溃,在这种情况下,Spark显示代码抛出的异常。 在这种情况下,可以在Spark UI上查看标记为“失败”的任务,还可以查看该计算机上的日志以了解失败时正在执行的操作。 我们尝试在代码中添加更多日志来确定正在处理哪些数据记录,是哪些数据导致失败

参考资料

[BOOK] Spark - The Definitive Guide

 

posted @ 2019-03-26 14:20  LestatZ  阅读(1234)  评论(0编辑  收藏  举报