如何调试传递给mapPartitions的函数

Joh*_*nyS 7 partitioning mapreduce apache-spark pyspark

如何处理无法使用传递给 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)
Run Code Online (Sandbox Code Playgroud)

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

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

hi-*_*zir 5

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

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

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

但最重要的是——在 Spark 之外测试功能。与函数一起使用的函数mapPartitions应该是accept Iterable(具体实现通常是itertools.chain)和return Iterable