(数据流)Apache Beam Python requirements.txt文件未安装在工作机上

yws3nbqq  于 2023-02-28  发布在  Python
关注(0)|答案(1)|浏览(110)

我尝试在Google Dataflow上运行Apache Beam管道,该管道从Google BigQuery读取数据,添加模式,将其转换为Dataframe,并使用第三方库(scrubadub)对该 Dataframe 执行转换。
在GCP上的Google Code CLI中,我运行:

/usr/bin/python /home/test_user/dataflow_beam_test.py --requirements_file /home/test_user/requirements.txt

按照under "PyPi Dependencies" here的说明,我的requirements.txt文件包含(以及其他包):

scrubadub==2.0.0

我无法获得管道来将我正在使用的第三方Python库(scrubadub)安装到远程工作者上。我已经验证了这个包可以在本地工作。
下面是相关代码:

with beam.Pipeline(argv=argv) as p:
        pcoll = (p | 'read_bq_view' >> 
        beam.io.ReadFromBigQuery(query=BIGQUERY_SELECT_QUERY,use_standard_sql=True) 
        | 'ToRows' >> beam.Map(lambda x: beam.Row(id=x['id'], user_id=x['user_id'],query=x['query']))
        )
        df = beam_convert.to_dataframe(pcoll)
        df['query'] = df['query'].apply(lambda x: scrubadub.clean(x))

这个代码块中的最后一行是导致错误的原因(我已经通过注解它并成功运行管道进行了确认)。
我尝试过在文件的顶层导入scrubadub,并将其作为run()函数的一部分;都会抛出相同的错误:

/usr/local/lib/python3.9/site-packages/dill/_dill.py", line 826, in _import_module return __import__(import_name) ModuleNotFoundError: No module named 'scrubadub'

值得注意的是,pip install -r requirements.txt似乎从未在工作线程上运行过。

htrmnn0y

htrmnn0y1#

要解决您的问题并将PyPi包与Beam一起使用,我建议您使用setup.py文件,例如:

from setuptools import find_packages, setup

setup(
    name="dataflow_job",
    version="0.0.1",
    install_requires=[
        'scrubadub==2.0.0'
    ],
    packages=find_packages(),
)

例如,将此文件放在项目的根目录下。
然后,在使用Dataflow启动Beam作业的命令行中,使用setup_file程序参数:

python -m your_module.your_folder.main \
        --runner=DataflowRunner \
        --setup_file=./setup.py \
        ....

请务必遵循以下步骤以正确启动作业:

  • 作业的运行者(可能是您的本地计算机)应该使用安装了相同包的虚拟环境(例如2.45.0):apache_beam==2.45.0scrubadub==2.0.0包的版本应该与工作进程使用的包相同。runner将示例化作业。
  • 然后工作者将使用setup.py文件提供的包(与runner使用的包版本相同)。在setup.py中,您不必安装Beam,因为它已经提供了运行时环境。

相关问题