向Dataproc作业提交Python项目
我有一个python项目,其文件夹具有向Dataproc作业提交Python项目,python,pyspark,google-cloud-dataproc,Python,Pyspark,Google Cloud Dataproc,我有一个python项目,其文件夹具有 main_directory - lib - lib.py - run - script.py script.py from lib.lib import add_two spark = SparkSession \ .builder \ .master('yarn') \ .appName('script') \ .getOrCreate() print(add_two(1,2)) 而l
main_directory - lib - lib.py
- run - script.py
script.py
from lib.lib import add_two
spark = SparkSession \
.builder \
.master('yarn') \
.appName('script') \
.getOrCreate()
print(add_two(1,2))
而lib.py
def add_two(x,y):
return x+y
我想在GCP中作为Dataproc作业启动。我在网上查过了,但我不太明白怎么做。我正在尝试用
gcloud dataproc作业提交pyspark--cluster=$cluster\u NAME--region=$region\
运行/script.py
但我收到以下错误消息:
from lib.lib import add_two
ModuleNotFoundError: No module named 'lib.lib'
你能帮助我如何在Dataproc上启动作业吗?我发现的唯一方法是删除绝对路径,将此更改为script.py
:
from lib import add_two
并以
gcloud dataproc作业提交pyspark--cluster=$cluster\u NAME--region=$region\
--文件/lib/lib.py\
/运行/script.py
但是,我希望避免每次手动列出文件的繁琐过程
按照@Igor的建议,我发现打包成一个zip文件
zip -j --update -r libpack.zip /projectfolder/* && spark-submit --py-files libpack.zip /projectfolder/run/script.py
工作。但是,这会将所有文件放在libpack.zip的同一根文件夹中,因此如果子文件夹中有同名文件,则此操作将不起作用
有什么建议吗?如果在提交Dataroc作业时希望保留项目结构,则应将项目打包到
.zip
文件中,并在提交作业时在参数中指定它:
gcloud dataproc作业提交pyspark--cluster=$cluster\u NAME--region=$region\
--py文件lib.zip\
运行/script.py
要创建zip存档,您需要运行脚本:
cd主目录/
zip-x run/script.py-r libs.zip。
有关如何在PySpark作业的zip存档中打包依赖项的更多详细信息,请参阅。要压缩依赖项,请执行以下操作-
cd base-path-to-python-modules
zip -qr deps.zip ./* -x script.py
将deps.zip复制到hdfs/gs。提交作业时使用uri,如下所示
使用Dataproc的python连接器提交python项目(pyspark)
from google.cloud import dataproc_v1
from google.cloud.dataproc_v1.gapic.transports import (
job_controller_grpc_transport)
region = <cluster region>
cluster_name = <your cluster name>
project_id = <gcp-project-id>
job_transport = (
job_controller_grpc_transport.JobControllerGrpcTransport(
address='{}-dataproc.googleapis.com:443'.format(region)))
dataproc_job_client = dataproc_v1.JobControllerClient(job_transport)
job_file = <gs://bucket/path/to/main.py or hdfs://file/path/to/main/job.py>
# command line for the main job file
args = ['args1', 'arg2']
# required only if main python job file has imports from other modules
# can be one of .py, .zip, or .egg.
addtional_python_files = ['hdfs://path/to/deps.zip', 'gs://path/to/moredeps.zip']
job_details = {
'placement': {
'cluster_name': cluster_name
},
'pyspark_job': {
'main_python_file_uri': job_file,
'args': args,
'python_file_uris': addtional_python_files
}
}
res = dataproc_job_client.submit_job(project_id=project_id,
region=region,
job=job_details)
job_id = res.reference.job_id
print(f'Submitted dataproc job id: {job_id}')
从google.cloud导入dataproc\u v1
从google.cloud.dataproc_v1.gapic.transports导入(
作业(控制器、grpc、运输)
地区=
群集名称=
项目id=
工作与运输=(
作业\u控制器\u grpc\u传输。作业控制器RpcTransport(
地址='{}-dataproc.googleapis.com:443'.格式(区域)))
dataproc_作业客户端=dataproc_v1.JobControllerClient(作业传输)
作业\u文件=
#主作业文件的命令行
args=['args1','arg2']
#仅当主python作业文件已从其他模块导入时才需要
#可以是.py、.zip或.egg中的一个。
附加的python文件=['hdfs://path/to/deps.zip“,”gs://path/to/moredeps.zip']
作业单元详细信息={
“安置”:{
“群集名称”:群集名称
},
“Pypark_job”:{
'main_python_file_uri':作业文件,
“args”:args,
“python文件”:附加的python文件
}
}
res=dataproc\u job\u client.submit\u job(project\u id=project\u id,
区域=区域,
作业=作业(详细信息)
job\u id=res.reference.job\u id
打印(f'SubmittedDataProc作业id:{job_id}')
这是一个很好的建议。但是,如何从script.py文件调用add_two函数?我认为在创建zip存档时需要添加-r
选项,它将保留项目结构-请参阅更新的答案。