为其他软件包或文件下载创建库集
如果要通过将库添加到从源 (不是通过 conda
或 pip
存储库) 访存的库集来定制实例,那么应使用基于脚本的定制。
如果仅使用一组 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>
) 中,以便它们成为库集的一部分,并存储在应用程序中以供稍后使用。
使用基于脚本的定制创建库集
执行以下步骤以使用基于脚本的定制来创建库集:
-
创建名为
customization_script.py
的 Python 文件。Analytics Engine的定制组件将查找具有此名称的 Python 模块。 -
在
customization_script.py
中,实现名为customize(<install_path>, <params>)
的函数,其中<install_path>
是将库下载到的预先指定的位置,即/home/spark/shared/user-libs/<libraryset_name>/custom/<subdir_if_applicable>
。 您无法更改此路径。<params>
是定制脚本所需的参数的列表。 -
将
customization_script.py
文件存储在 IBM Cloud Object Storage 或 GitHub中。 -
通过
"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上的目录下载多个文件,请参阅 样本脚本。