如何在本地运行Apache Beam?

时间:2019-04-02 09:25:11

标签: python-3.x pandas google-cloud-platform apache-beam

我正在尝试在本地计算机上运行python apache Beam脚本进行一些模拟。我已将“ DirectRunner”放入选项中。但是p.run()给我一个错误“ TypeError:Receiver()不带参数”

为什么会发生这种情况?我正在使用Spyder作为IDE。

编辑:这是一个代码示例,它采用以下形式的消息列表:

{ "Val_1": 1, "Val_2": 56, "date": "2019-04-01T15:00:04.340778" }

将其拆分并以

的形式放置
(1, 56, 2019-04-01T15:00:04.340778)

然后将其保存到文本文件中。

p = beam.Pipeline('DirectRunner')
(p | 'ReadMessage' >>  beam.io.textio.ReadFromTextWithFilename('input/inputs.json')
                    | 'Processing' >> beam.ParDo(Split())
                    | 'Write' >> beam.io.WriteToText('input/results.txt'))
p.run().wait_until_finish() 

错误:

"TypeError: Receiver() takes no arguments"

2 个答案:

答案 0 :(得分:1)

您无需将“ DirectRunner”指定为参数,如果您未指定任何运行器,即将其保留为空白,则默认使用DirectRunner运行。 这应该运行良好。

    p = beam.Pipeline()
    (p | 'ReadMessage' >>  beam.io.textio.ReadFromTextWithFilename('input/inputs.json')
                        | 'Processing' >> beam.ParDo(Split())
                        | 'Write' >> beam.io.WriteToText('input/results.txt'))
    result = p.run()
    result.wait_until_finish()

if __name__ == "__main__":
    run()

答案 1 :(得分:0)

假设您将管道指定为DirectRunner,就可以像执行任何常规文件一样执行Python Beam文件

p = beam.Pipeline('DirectRunner')

Apache Beam当前对Python 3.x的支持有限。如果尝试运行word count example,它将产生相同的错误。由于他们目前正在致力于对Python 3的全面支持,因此它将在将来修复。

当您想通过Google Cloud Platform部署Python Beam代码时,强烈建议切换到Python 2.7。

您可以跟踪问题here

但是,我不能说您的Split函数到底能做什么,所以我为您提供了一个最小的工作示例,以便您可以测试Beam的安装。

import apache_beam as beam
import ast

# The DoFn to perform on each element in the input PCollection.
class Split(beam.DoFn):
    def process(self, element):
        val = ast.literal_eval(element[1])
        output ='('+','.join(map(str, val.values())) + ')'
        return [output]

def run():
    p = beam.Pipeline('DirectRunner')
    (p | 'ReadMessage' >>  beam.io.textio.ReadFromTextWithFilename('input/inputs.json')
                        | 'Processing' >> beam.ParDo(Split())
                        | 'Write' >> beam.io.WriteToText('input/results.txt'))
    result = p.run()
    result.wait_until_finish()

if __name__ == "__main__":
    run()