在服务卷实例中自定义 Spark 应用程序

您可以在服务卷实例中持久存储要在 Spark 应用程序中使用的软件包。

在服务卷实例中使用自定义的 Python 包

本节介绍如何将自定义的 Python 包加载到服务卷实例中,并在将 PySpark 应用程序作为Spark作业提交时使用这些包。

假定您要在 PySpark 应用程序中使用 wget Python 包,该应用程序已下载到其中一个实例卷中的文件夹中:

  1. 生成授权令牌。 有关更多信息,请参阅 生成 API 授权令牌

  2. 通过运行以下 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": {}}'
    
  3. 在您希望上传 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'
    
  4. 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 是您本地工作站上要上传的包所在的位置。 请注意,您需要指定要上载的本地工作站上包的绝对路径。

  5. 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 目录。

  6. 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'
    
  7. 将您使用上传至卷 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.json for 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/pippackages PYTHONPATH 指向的是上传 Python 包的位置。

    除了在作业有效载荷中设置 PYTHONPATH 之外,还有另一种方法可以让您的 PySpark 应用程序识别 Python 包,即在您的 PySpark 应用程序开头添加以下几行代码:

    import sys
    sys.path.append('/myapp/pippackages/')