Creación de un conjunto de bibliotecas para otros paquetes o descarga de archivos
Si desea personalizar la instancia añadiendo bibliotecas a un conjunto de bibliotecas que obtiene de orígenes distintos de los repositorios de conda o pip, debe utilizar la personalización basada en scripts.
Si sólo utiliza un conjunto de archivos JAR o archivos PY, debe utilizar los argumentos "application_details" > "conf" > "spark.submit.pyFiles" o "application_details" > "jars" en la carga útil de envío de la aplicación Spark y crear sólo un conjunto de bibliotecas si este método no funciona automáticamente. Para obtener más información, consulte Envío de una aplicación Spark
Con la personalización basada en scripts, se crea un script de Python utilizando el convenio de denominación de módulos esperado por IBM Analytics Engine. Además, debe implementar una función de Python que actúe como punto de entrada ejecutable
en el script. En este script, puede añadir su propia lógica para descargar las bibliotecas y colocarlas en un directorio predesignado, que es /home/spark/shared/user-libs/<libraryset_name>/custom/<subdir_if_applicable>,
para que pasen a formar parte del conjunto de bibliotecas y se almacenen para su posterior consumo en la aplicación.
Creación de un conjunto de bibliotecas mediante la personalización basada en scripts
Realice estos pasos para crear un conjunto de bibliotecas utilizando la personalización basada en scripts:
-
Cree un archivo de Python denominado
customization_script.py. El componente de personalización de Analytics Enginebusca un módulo de Python con ese nombre. -
En
customization_script.py, implemente una función denominadacustomize(<install_path>, <params>), donde<install_path>es la ubicación designada previamente en la que se descargan las bibliotecas, es decir,/home/spark/shared/user-libs/<libraryset_name>/custom/<subdir_if_applicable>. No puede cambiar esta vía de acceso.<params>es una lista de los parámetros necesarios para el script de personalización. -
Almacene el archivo
customization_script.pyen IBM Cloud Object Storage o en GitHub. -
Pase la ubicación del archivo
customization_script.pya la aplicación de Spark de personalización a través del parámetro"application_details" > "conf" > "spark.submit.pyFiles".La sección
"arguments"de la carga útil de envío de la aplicación de Spark debe contener una sección"library_set"con detalles, como"action"y"name", tal como se muestra en la siguiente carga útil de ejemplo.Ejemplo de carga útil:
{ "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" } } }Ejemplo de 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...")
Uso del conjunto de bibliotecas creado mediante la personalización basada en scripts
Cuando utiliza un conjunto de bibliotecas que ha creado utilizando un script, debe incluir la vía de acceso de la biblioteca en determinadas variables de entorno para que la aplicación de Spark pueda acceder al conjunto de bibliotecas.
Por ejemplo, si la biblioteca personalizada es un archivo .so, debe añadir "EXTRA_LD_LIBRARY_PATH" a la sección "env" de la llamada de envío de la aplicación de Spark, con el valor /home/spark/shared/user-libs/<libraryset_name>/custom/<subdir_if_applicable>.
De este modo, se añade "EXTRA_LD_LIBRARY_PATH" a "LD_LIBRARY_PATH", asegurándose de que es la primera vía de acceso al archivo .so que se busca.
Si la biblioteca personalizada es un archivo JAR y necesita que sea accesible en la vía de acceso de clases Spark, debe especificar el archivo JAR en la vía de acceso de clases adicional para el controlador/ejecutor en función de dónde necesite
el archivo JAR. Por ejemplo, para añadirlo delante de la vía de acceso de clases del controlador, añada la propiedad siguiente, donde el nombre del conjunto de bibliotecas es java_library:
"spark.driver.extraClassPath":"/home/spark/shared/user-libs/java_library/custom/*"
Si la biblioteca personalizada es un archivo de certificado, por ejemplo un certificado ICD Postgres autofirmado, puede especificarlo en el URL de conexión de la siguiente manera:
sslrootcert=/home/spark/shared/user-libs/customize_integration_custom_lib/custom/postgres.cert`
Para obtener detalles, consulte Utilización de IBM Cloud Databases for PostgreSQL como almacén de metadatos externo.
Si la biblioteca personalizada es un archivo de configuración, se pone a disposición de los controladores y ejecutores de Spark automáticamente.
Ejemplo de script de personalización con una descarga de varios archivos
Los parámetros y el script mencionados en la sección anterior son sólo una muestra. Puede implementar lógica adicional si lo necesita, como por ejemplo para descargar un directorio o varios archivos o para descargar desde un origen diferente, y así sucesivamente.
Por ejemplo, para descargar varios archivos desde un directorio en Cloud Object Storage, consulte Script de ejemplo.