如何调试传递给mapPartitions的函数

时间:2017-11-30 21:37:24

标签: apache-spark mapreduce pyspark partitioning

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

考虑一下这个例子:

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中有多余的变量。

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

1 个答案:

答案 0 :(得分:2)

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

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

    print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
    
  • 使用远程调试器 - How can pyspark be called in debug mode?

但最重要的是 - Spark之外的测试功能。与mapPartitions一起使用的函数应接受Iterable(具体实现通常为itertools.chain)并返回Iterable