IBM Cloud Docs
为其他软件包或文件下载创建库集

为其他软件包或文件下载创建库集

如果要通过将库添加到从源 (不是通过 condapip 存储库) 访存的库集来定制实例,那么应使用基于脚本的定制。

如果仅使用一组 JAR 文件或 PY 文件,那么应在 Spark 应用程序提交有效内容中使用 "application_details" > "conf" > "spark.submit.pyFiles""application_details" > "jars" 参数,并且仅当此方法不适用于您时才创建库集。 有关更多信息,请参阅 提交 Spark 应用程序

通过基于脚本的定制,您可以使用 IBM Analytics Engine期望的模块命名约定来创建 Python 脚本。 此外,您需要实现一个 Python 函数,该函数充当脚本的可执行入口点。 在此脚本中,您可以添加自己的逻辑,用于下载这些库并将它们放置在预先指定的目录 (即 /home/spark/shared/user-libs/<libraryset_name>/custom/<subdir_if_applicable>) 中,以便它们成为库集的一部分,并存储在应用程序中以供稍后使用。

使用基于脚本的定制创建库集

执行以下步骤以使用基于脚本的定制来创建库集:

  1. 创建名为 customization_script.py 的 Python 文件。Analytics Engine的定制组件将查找具有此名称的 Python 模块。

  2. customization_script.py 中,实现名为 customize(<install_path>, <params>) 的函数,其中 <install_path> 是将库下载到的预先指定的位置,即 /home/spark/shared/user-libs/<libraryset_name>/custom/<subdir_if_applicable>。 您无法更改此路径。<params> 是定制脚本所需的参数的列表。

  3. customization_script.py 文件存储在 IBM Cloud Object Storage 或 GitHub中。

  4. 通过 "application_details" > "conf" > "spark.submit.pyFiles" 参数将 customization_script.py 文件的位置传递到定制 Spark 应用程序。

    Spark 应用程序提交有效内容中的 "arguments" 部分必须包含具有详细信息的 "library_set" 部分,例如 "action""name",如以下样本有效内容中所示。

    有效内容示例:

    {
      "application_details": {
      "application": "/opt/ibm/customization-scripts/customize_instance_app.py",
        "arguments": ["{\"library_set\":{\"action\":\"add\",\"name\":\"customize_integration_custom_lib\",\"script\":{\"source\":\"py_files\",\"params\":[\"https://s3.direct.<CHANGEME_REGION>.cloud-object-storage.appdomain.cloud\",\"<CHANGEME_BUCKET_NAME>\",\"libcalc.so\",\"<CHANGEME_ACCESS_KEY>\",\"<CHANGEME_SECRET_KEY>\"]}}}"],
        "conf": {
          "spark.hadoop.fs.cos.dev-cos.endpoint":"https://s3.direct.<CHANGEME_REGION>.cloud-object-storage.appdomain.cloud",
          "spark.hadoop.fs.cos.dev-cos.access.key":"<CHANGEME_ACCESS_KEY>",
          "spark.hadoop.fs.cos.dev-cos.secret.key":"<CHANGEME_SECRET_KEY>",
          "spark.submit.pyFiles":"cos://<CHANGEME_BUCKET_NAME>.dev-cos/customization_script.py"
        }
      }
    }
    

    customization_script.py:

    import cos_utils
    import os
    import sys
    
    def customize(install_path, params):
      print ("inside base install_misc_package(), override this to implement your own implementation.")
      for param in params:
       print(param)
      endpoint = params[0]
      bucket_name = params[1]
      log_config_file = params[2]
      access_key = params[3]
      secret_key = params[4]
      cos = cos_utils.get_cos_object(access_key, secret_key, endpoint)
    
      retCode = cos_utils.download_file(log_config_file, cos, bucket_name, "{}/{}".format(install_path, log_config_file))
      if (retCode != 0):
           print("non-zero return code while downloading file    {}".format(str(retCode)))
           sys.exit(retCode)
      else:
           print("Successfully downloaded file...")
    

使用使用基于脚本的定制创建的库集

使用使用脚本创建的库集时,需要在某些环境变量中包含库的路径,以便 Spark 应用程序可以访问该库集。

例如,如果定制库是 .so 文件,那么需要将值为 /home/spark/shared/user-libs/<libraryset_name>/custom/<subdir_if_applicable>"EXTRA_LD_LIBRARY_PATH" 添加到 Spark 应用程序提交调用的 "env" 部分。 这会将 "EXTRA_LD_LIBRARY_PATH" 附加到 "LD_LIBRARY_PATH",确保这是搜索到的 .so 文件的第一个路径。

如果定制库是 JAR 文件,并且您需要在 Spark 类路径上对其进行访问,那么必须根据需要 JAR 文件的位置在驱动程序/执行程序的额外类路径中指定 JAR 文件。 例如,要将其添加到驱动程序类路径前面,请添加以下属性,其中库集名称为 java_library:

"spark.driver.extraClassPath":"/home/spark/shared/user-libs/java_library/custom/*"

如果定制库是证书文件,例如自签名 ICD Postgres 证书,那么可以通过以下方式在连接 URL 中指定该证书:

sslrootcert=/home/spark/shared/user-libs/customize_integration_custom_lib/custom/postgres.cert`

有关详细信息,请参阅 使用 IBM Cloud Databases for PostgreSQL 作为外部元存储

如果定制库是配置文件,那么它将自动可供 Spark 驱动程序和执行程序使用。

具有多文件下载的定制脚本的示例

参数,和上一节提到的脚本只是一个样本。 如果需要,可以实现其他逻辑,例如下载一个目录或多个文件或从不同源下载等等。

例如,要从 Cloud Object Storage上的目录下载多个文件,请参阅 样本脚本