Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向Dataproc作业提交Python项目_Python_Pyspark_Google Cloud Dataproc - Fatal编程技术网

向Dataproc作业提交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

我有一个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))
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
选项,它将保留项目结构-请参阅更新的答案。