在服务卷实例中自定义 Spark 应用程序
您可以在服务卷实例中持久存储要在 Spark 应用程序中使用的软件包。
在服务卷实例中使用自定义的 Python 包
本节介绍如何将自定义的 Python 包加载到服务卷实例中,并在将 PySpark 应用程序作为Spark作业提交时使用这些包。
假定您要在 PySpark 应用程序中使用 wget Python 包,该应用程序已下载到其中一个实例卷中的文件夹中:
生成授权令牌。 有关更多信息,请参阅 生成 API 授权令牌。
通过运行以下 cURL 命令,创建名为
appvol的新卷。 如果在集群上设置了 NFS 存储器,那么将storageClass指定为managed-nfs-storage,如果在集群上设置了 OCS 存储器,那么将ocs-storagecluster-cephfs指定为。curl -vk -iv -X POST "https://<CloudPakforData_URL>/zen-data/v3/serviceInstance" -H "Authorization: ZenApiKey ${TOKEN}" -H 'Content-Type: application/json' -d '{"createArguments": {"metadata": {"storageClass": "managed-nfs-storage", "storageSize": "2Gi"}, "resources": {}, "serviceInstanceDescription": "volume 1"}, "preExistingOwner": false, "serviceInstanceDisplayName": "appvol", "serviceInstanceType": "volumes", "serviceInstanceVersion": "-", "transientFields": {}}'在您希望上传 Python 软件包的卷上
appvol,使用以下 cURL 命令启动文件服务器:curl -v -ik -X POST 'https://<CloudPakforData_URL>/zen-data/v1/volumes/volume_services/appvol' -H "Authorization: ZenApiKey ${TOKEN}" -d '{}' -H 'Content-Type: application/json' -H 'cache-control: no-cache'pippackages将 Python 软件包从您的本地工作站上传到位于以下位置的卷appvol:curl -v -ik -X PUT 'https://<CloudPakforData_URL>/zen-volumes/appvol/v1/volumes/files/pippackages%2Fwget.py' -H "Authorization: ZenApiKey ${TOKEN}" -H 'cache-control: no-cache' -H 'content-type: multipart/form-data' -F 'upFile=@/root/packages/anaconda3/lib/python3.7/site-packages/wget.py'在示例代码中,
/root/packages/anaconda3/lib/python3.7/site-packages/wget.py是您本地工作站上要上传的包所在的位置。 请注意,您需要指定要上载的本地工作站上包的绝对路径。appvol或者,将 Python 软件包作为ZIP文件上传,并在卷上解压:curl -k -X PUT <https://<CloudPakforData_URL>/zen-volumes/appvol/v1/volumes/files/pippackages?extract=true> -H "Authorization: ZenApiKey ${TOKEN}" -H 'Content-Type: multipart/form-data' -F upFile='@/Users/test-user/test-data/upload_extract.tar.gz'在样本代码中,
/Users/test-user/test-data/upload_extract.tar.gz是本地工作站上的 ZIP 文件,上载并解压缩到卷appvol上的 pippackages 目录。customApps请将您的 PySpark 应用程序上传至位于以下位置的卷appvol:curl -v -ik -X PUT 'https://<CloudPakforData_URL>/zen-volumes/appvol/v1/volumes/files/customApps%2Fexample.py' -H "Authorization: ZenApiKey ${TOKEN}" -H 'cache-control: no-cache' -H 'content-type: multipart/form-data' -F 'upFile=@/root/jobs/HBCPT/wgetExample/example.py'将您使用上传至卷
appvol位置pippackages的包编写的 PySpark 申请作为Spark作业提交:curl -ivk -X POST -d @payload.json -H "Authorization: ZenApiKey ${TOKEN}" <job_API_endpoint>您可以在服务实例详情页面中获取 Spark 提交作业的端点。 请参阅《 管理 Analytics Engine powered by Apache Spark 实例》。
payload.jsonfor Python 3.9:{ "application_details": { "application": "/myapp/customApps/example.py", "arguments": ["<your_application_arguments>"], "conf": { "spark.app.name": "MyJob", "spark.eventLog.enabled": "true" }, "env": { "RUNTIME_PYTHON_ENV": "python39", "PYTHONPATH": "/myapp/pippackages:/home/spark/space/assets/data_asset:/home/spark/user_home/python-3:/cc-home/_global_/python-3:/home/spark/shared/user-libs/python:/home/spark/shared/conda/envs/python/lib/python/site-packages:/opt/ibm/conda/miniconda/lib/python/site-packages:/opt/ibm/third-party/libs/python3:/opt/ibm/image-libs/python3:/opt/ibm/image-libs/spark2/metaindexmanager.jar:/opt/ibm/image-libs/spark2/stmetaindexplugin.jar:/opt/ibm/spark/python:/opt/ibm/spark/python/lib/py4j-0.10.7-src.zip" } }, "volumes": [{ "name": "appvol", "mount_path": "/myapp", "source_sub_path": "" }] }您可以通过在 Spark 作业驱动程序日志中输出 PYTHONPATH 的值,来获取该环境变量的值。 在示例有效载荷中,
/myapp/pippackagesPYTHONPATH 指向的是上传 Python 包的位置。除了在作业有效载荷中设置 PYTHONPATH 之外,还有另一种方法可以让您的 PySpark 应用程序识别 Python 包,即在您的 PySpark 应用程序开头添加以下几行代码:
import sys sys.path.append('/myapp/pippackages/')