如何调试传递给mapPartitions的函数

问题描述 投票:0回答:1

如何处理无法使用传递给 pyspark 中的 mapPartitions() 的函数内的 print 语句调试代码的问题?

考虑这个例子:

def func(kv_iterator):
    for key, value in iterator:
        #do fancy stuff
        print('This print statement does not reach the driver program')
    return [result]

result = someRdd.mapPartitions(func)

在 func 内部,我想对可迭代和索引进行大量工作,但我可以测试我的代码,而无需在 func 内部使用过多的变量。

是否可以以某种方式将打印语句从一个分区重定向到我的驱动程序/输出通道?

apache-spark mapreduce pyspark partitioning
1个回答
5
投票

您可以使用以下其中一项:

  • 使用
    local
    模式。所有输出都应该在控制台中可见。如果不是,您的代码可能永远不会执行 - 尝试
    result.count()
    result.foreach(lambda _: None)
    或其他操作 - 这可能就是这里的问题。
  • 将 stdout(以及 stderr,如果需要)重定向到文件。对于基本

    prints
    使用
    file
    参数:

    print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
    
  • 使用远程调试器 - 如何在调试模式下调用pyspark?

但最重要的是——在 Spark 之外测试功能。与

mapPartitions
一起使用的函数应该接受
Iterable
(具体实现通常是
itertools.chain
)并返回
Iterable

© www.soinside.com 2019 - 2024. All rights reserved.