【问题标题】:Google Cloud DataFlow: ModuleNotFoundError: No module named 'main'Google Cloud DataFlow:ModuleNotFoundError:没有名为“main”的模块
【发布时间】:2020-02-16 01:57:34
【问题描述】:

我正在尝试在云 Dataflow 上运行 apache-beam 管道。原始功能已部署为云功能,它应该创建一个读取文本文件并插入大查询的 Dataflow 作业。但它无法在 Dataflow 上运行。下面给出函数和错误。

from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.options.pipeline_options import GoogleCloudOptions
from apache_beam.options.pipeline_options import StandardOptions
import apache_beam as beam

class Split(beam.DoFn):

    def process(self, element):

        element = element.split(',')

        return [{
            'field_1': element[0],
            'field_2': element[1],
            'field_3': element[2]}]

def main(data, context):

    options = PipelineOptions()

    google_cloud_options = options.view_as(GoogleCloudOptions)
    google_cloud_options.project = my-project
    google_cloud_options.job_name = job_name
    google_cloud_options.staging_location = staging_location
    google_cloud_options.temp_location = temp_location
    google_cloud_options.service_account_email = service_account_email
    options.view_as(StandardOptions).runner = 'DataflowRunner'

    p = beam.Pipeline(options=options)

    with p:
        (
            p
            | 'ReadData' >> beam.io.ReadFromText(gs://source_file_location)
            | 'ParseCSV' >> beam.ParDo(Split())
            | 'WriteToBigQuery' >> beam.io.WriteToBigQuery(table=bq_table,
                                                           schema=schema,
                                                           write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND)
        )

    result = p.run()
    result.wait_until_finish()

if __name__ == '__main__':

    main('data', 'context')

我在 Dataflow 上遇到的错误是

Error message from worker: Traceback (most recent call last): 
File "/usr/local/lib/python3.7/site-packages/apache_beam/internal/pickler.py", 
line 286, in loads return dill.loads(s) File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", 
line 275, in loads return load(file, ignore, **kwds) File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", 
line 270, in load return Unpickler(file, ignore=ignore, **kwds).load() File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", 
line 472, in load obj = StockUnpickler.load(self) File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", 
line 462, in find_class return StockUnpickler.find_class(self, module, name) ModuleNotFoundError: 
No module named 'main' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/dataflow_worker/batchworker.py", line 648, in do_work work_executor.execute() File "/usr/local/lib/python3.7/site-packages/dataflow_worker/executor.py", line 176, in execute op.start() File "apache_beam/runners/worker/operations.py", 
line 649, in apache_beam.runners.worker.operations.DoOperation.start File "apache_beam/runners/worker/operations.py", 
line 651, in apache_beam.runners.worker.operations.DoOperation.start File "apache_beam/runners/worker/operations.py", 
line 652, in apache_beam.runners.worker.operations.DoOperation.start File "apache_beam/runners/worker/operations.py", 
line 261, in apache_beam.runners.worker.operations.Operation.start File "apache_beam/runners/worker/operations.py", 
line 266, in apache_beam.runners.worker.operations.Operation.start File "apache_beam/runners/worker/operations.py", 
line 597, in apache_beam.runners.worker.operations.DoOperation.setup File "apache_beam/runners/worker/operations.py", 
line 602, in apache_beam.runners.worker.operations.DoOperation.setup File "/usr/local/lib/python3.7/site-packages/apache_beam/internal/pickler.py", 
line 290, in loads return dill.loads(s) File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", 
line 275, in loads return load(file, ignore, **kwds) File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", line 270, in load return Unpickler(file, ignore=ignore, **kwds).load() File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", 
line 472, in load obj = StockUnpickler.load(self) File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", 
line 462, in find_class return StockUnpickler.find_class(self, module, name) 
ModuleNotFoundError: No module named 'main'

【问题讨论】:

  • 你解决了吗?

标签: google-cloud-functions google-cloud-dataflow apache-beam


【解决方案1】:

您可能必须将您的代码(包括您的 DoFn)作为依赖项捆绑在一个单独的文件中;见https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/

在这种情况下,听起来云函数会从名为 main.py 的文件中执行您的文件;这会产生这种错误。我建议将您的代码打包为依赖项,这里的代码就是from my_lib import main

【讨论】:

  • 我确实有一个 requirements.txt 文件,其中包含 apache-beam[gcp] 作为依赖项
  • 我的管道运行良好,如果在云 shell 上执行或部署为 gke 上的容器,它只会在云函数执行时失败
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 2016-07-11
相关资源
最近更新 更多