1. 问题描述
如下图所示项目结构,项目下存在main.py主文件,有自定义的python package(config以及utils两个module),希望能在dataworks上部署并调度、运行起来。
2. 解决方案
2.1. 方案1
参考dataworks官方文档:
如上图所示project结构,将time_config.py,local_vars.py通过【资源->新建资源->python】创建资源
将项目中的main.py的主文件,创建pyodps3的节点,并将代码复制进去,使用
##@resource_reference{"local_vars.py"} sys.path.append(os.path.dirname(os.path.abspath('local_vars.py'))) #引入资源至工作空间。 # from utils.local_vars import ali_name # 修改引用代码 如下 from local_vars import ali_name
的方式引用该python脚本并添加到sys path中确保可以后续进行import
2.2. 方案2
直接将project通过zip打包,通过【资源->新建资源->archive】 上传zip资源并提交到生产环境,这时候dataworks也会将这个zip包传到对应的odps的项目。
dataworks界面:
odps界面看下resource:
代码:需要把项目中的main方法复制出来,创建一个pyodps3的节点,并做一些代码改造,详细的看下面这段代码的注释
'''PyODPS 3 请确保不要使用从 MaxCompute下载数据来处理。下载数据操作常包括Table/Instance的open_reader以及 DataFrame的to_pandas方法。 推荐使用 PyODPS DataFrame(从 MaxCompute 表创建)和MaxCompute SQL来处理数据。 更详细的内容可以参考:https://help.aliyun.com/document_detail/90481.html ''' # This is a sample Python script. # Press ⌃R to execute it or replace it with your code. # Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings. # 这里要引入odps,从odps读这个archive的zip包,即自己写的package from odps import ODPS o = ODPS('ak','sk','<project_name>') # 这里通过get resource方法读到这个zip包 r = o.get_resource("dataworks_test01.zip") import sys, zipfile from odps.lib.importer import CompressImporter # append到sys path中 sys.meta_path.append(CompressImporter(zipfile.ZipFile(r.open("rb")))) # 这会引用的代码不需要方案1中的修改,zip文件解压后会保留这个文件的层级 from utils.local_vars import ali_name from config.time_config import time_zone def print_hi(name): # Use a breakpoint in the code line below to debug your script. print(f'Hi, {name}') # Press ⌘F8 to toggle the breakpoint. # Press the green button in the gutter to run the script. if __name__ == '__main__': print_hi(ali_name + 'time zone is ' + time_zone) # See PyCharm help at https://www.jetbrains.com/help/pycharm/
执行成功的结果见dataworks的那个页面。
2.3. 方案3
这个方案仅在打包的时候有所不同,如果客户除了自定义的package还借助了开源的package需要打包到zip里,可以参考下:https://pyodps.readthedocs.io/zh-cn/stable/pyodps-pack.html 用toml的方式指定,不过强烈建议客户使用独享资源组的运维助手通过pip直接安装开源包到资源组上。
除打包外其他操作过程同方案2