簡體   English   中英

Google Cloud Dataflow:ModuleNotFoundError:運行集成測試時沒有名為“main”的模塊

[英]Google Cloud Dataflow: ModuleNotFoundError: No module named 'main' when running integration test

我有一個 apache 光束管道,在本地和雲模式下都可以正常工作。 但是,我在每個 MR 中運行端到端集成測試,並將 IT 提交給 Dataflow。

這一次,IT 拋出以下錯誤:

_import_module return __import__(import_name) ModuleNotFoundError: No module named 'main'

堆棧跟蹤根本沒有指向無法識別模塊的地方。 只是以下內容:

job-v2-test-20-08160911-vs73-harness-drt8
      Root cause: Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/apache_beam/internal/dill_pickler.py", line 285, in loads
    return dill.loads(s)
  File "/usr/local/lib/python3.8/site-packages/dill/_dill.py", line 275, in loads
    return load(file, ignore, **kwds)
  File "/usr/local/lib/python3.8/site-packages/dill/_dill.py", line 270, in load
    return Unpickler(file, ignore=ignore, **kwds).load()
  File "/usr/local/lib/python3.8/site-packages/dill/_dill.py", line 472, in load
    obj = StockUnpickler.load(self)
  File "/usr/local/lib/python3.8/site-packages/dill/_dill.py", line 826, in _import_module
    return __import__(import_name)
ModuleNotFoundError: No module named 'main'

我只在 IT 文件中使用的主模塊,它在管道的任何轉換中都不存在。 此外,當我運行 IT 時,一半的管道轉換成功運行,直到它因提供的錯誤而掛起

IT代碼:

from main import run
import argparse

import unittest
import logging


class PipelineIT(unittest.TestCase):

    def setUp(self):

        self.test_pipeline = TestPipeline(is_integration_test=True)

        parser = argparse.ArgumentParser()
        self.args, self.beam_args = parser.parse_known_args()
        self.pipeline_options = PipelineOptions(self.beam_args)
        self.client = get_bq_instance()
        self.tables_timestamp = datetime.now().strftime("%Y%m%d%H%M")

    def test_mc_end_to_end(self):

        state_verifier = PipelineStateMatcher(PipelineState.DONE)
        extra_opts = {
            'input': IT_BUCKET,
            'output_dataset': IT_DATASET,
            'output': IT_OUTPUT,
            'bq_timestamp': self.tables_timestamp,
            'on_success_matcher':
                all_of(state_verifier)
        }

        run(self.test_pipeline.get_full_options_as_args(**extra_opts), save_main_session=True)

# buch of asserts

我用來運行 IT 的命令

coverage run -m  pytest --log-cli-level=INFO integration_tests/end_to_end_it_test.py --job_name "end_to_end_it" --test-pipeline-options=" --run_mode=cloud --mode=test --setup_file=path_to_setup.py"

管道在生產模式下工作正常,但在測試模式下顯示該錯誤。 我只是想知道main是否僅用於從本地觸發集成測試,它怎么會因錯誤而中斷管道

經過深入調查,在我的管道中,我通過以下方式使用了beam.Filter

dropped_and_missing = all_recs | 'Filter Dropped and Missing recs' >> beam.Filter(lambda rec: rec['existing_status'] == 'Dropped' or rec['existing_status'] == 'Missing')

將代碼塊替換為基於條件if解決了問題的PTransformation

我不知道問題出在哪里,我試圖挖掘源代碼,檢查Filter function的主模塊中是否存在,但它不存在。

另外值得懷疑的是,僅在從命令行運行集成測試時才會發生錯誤。 管道與LocalRunnerDataflowRunner配合得很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM