![](/img/trans.png)
[英]ModuleNotFoundError: No module named 'oracledb' when running GCP Dataflow jobs
[英]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的主模塊中是否存在,但它不存在。
另外值得懷疑的是,僅在從命令行運行集成測試時才會發生錯誤。 管道與LocalRunner
和DataflowRunner
配合得很好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.