如何在 Spark 工作人员的地图函数中调试错误?
Posted
技术标签:
【中文标题】如何在 Spark 工作人员的地图函数中调试错误?【英文标题】:How can I debug errors in a map function on Spark workers? 【发布时间】:2016-10-06 07:54:08 【问题描述】:我是 Spark 的新手,正在努力寻找自己的方式。
我有一个 spark 应用程序,它在 数据集 上运行复杂的地图功能。此地图功能可能主要由于数据相关原因而失败。我怎样才能得到一些关于出了什么问题的有意义的信息?我不知道从哪里开始。
非常感谢!
【问题讨论】:
【参考方案1】:如果你想编写单元测试,你可以从一个集合中生成一个数据集,使用你的 map 函数映射它,然后使用你最喜欢的测试套件通过一个集合来测试结果。
如果您使用的是 PySpark,我真的不知道如何调试 Spark 作业,但使用分布式计算引擎,调试模式总是一团糟,所以我什至认为不值得探索这条路。
在我的公司,当我们想要测试特定功能的逻辑时,我们通常会进行单元测试,所以你应该很高兴。
这个答案应该涵盖你所需要的:How do I unit test PySpark programs?
【讨论】:
代码在特定的测试数据集上运行良好。当我在大型输入数据集上运行时,其中存在导致逻辑失败的特定值。我想知道这些值是什么。可能只有千分之一的输入集失败,因此抽查一些没有帮助。我可能只是在数据集中有错误的值。 “失败”是什么意思?如果它抛出异常,请尝试捕获它。如果它产生错误的值,只返回 (input, output) 而不是只返回 (output) 并观察(可能使用过滤器)什么样的输入在输出中产生了异常。 可以说它抛出了一个异常,我在 map 函数中捕获了它。那能用它做什么呢?我可以登录吗?这些日志去哪里了? 这取决于您的日志记录配置。无论如何,您可以捕获它们并输出它们(将它们与输入捆绑在一起),以便您可以在计算结果中找到它们。【参考方案2】:好的,所以这确实是可能的,但是有一些陷阱。
从广义上讲,创建一个类来封装 map 函数的结果,例如
class CalcResult(object):
def __init__(self):
self.dataResult=None
self.TraceBackStr=None
self.wasError=None
然后您可以测试 wasError 字段以记录异常。
异常对象不能是回溯对象,因为它们不可拾取。所以,我建议使用格式化字符串。
【讨论】:
以上是关于如何在 Spark 工作人员的地图函数中调试错误?的主要内容,如果未能解决你的问题,请参考以下文章