我有通过Luigi连接的Spark作业序列,并在30台机器集群(每个15GB RAM)上运行S3,它们经常挂在各个阶段。今天是处理5 GB数据的时候。舞台花了3,5小时
这个挂起的阶段只是简单处理数据,后来对groupByKey对数据集(用户ID,1L)和reduceGroups来获取用户事件计数。 即使某些用户有1m事件(不太可能因为之前过滤机器人最大值为300K),单个节点上的7个分区不应该在休息时间内花费3个小时。
有什么想法吗? 也许问题是我们使用的数据集仍然是实验性的? 我们如何调试它?Thread dump from the executor taking 3 hours
答案 0 :(得分:0)
了解如何理解Spark UI。本书部分可以帮助您入门:https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-webui.html
从Spark UI中,您应该能够看到每个阶段/分区/节点等处理了多少数据(百分位数)。较新的Spark UI(从2.0版开始)在SQL选项卡下显示更细粒度的信息。这有助于您找到数据偏斜(如果存在)。有许多选项可以对抗数据偏差,其中大多数都是针对您的应用程序的。例如,看看Facebook如何通过自适应分区处理数据偏差: https://www.slideshare.net/SparkSummit/handling-data-skew-adaptively-in-spark-using-dynamic-repartitioning
您可能不会遇到数据偏差,但其中一个群集节点已被打破"。如果您发现它是相同的节点,恰好比其他节点慢,则会出现这种情况。我们在AWS环境中看到过这样的异常现象。在杀死节点并启动一个新节点后,一切都开始正常工作。