如何在 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 工作人员的地图函数中调试错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark Databricks 中注册 SQL 函数

在 Spark 的 map 函数中运行 ML 算法

如何在 Spark Udf 中传递地图?

用idea调试Spark独立集群

如何在 spark-sql 查询中引用地图列?

谷歌地图在发布apk中显示空白屏幕,在调试模式下工作正常