Uso de bibliotecas Python con AWS Glue - AWS Glue

Uso de bibliotecas Python con AWS Glue

AWS Glue le permite instalar módulos y bibliotecas adicionales de Python para su uso con ETL de AWS Glue.

Instalación de módulos adicionales de Python en AWS Glue 2.0 con pip

AWS Glue utiliza el instalador de paquetes de Python (pip3) para instalar los módulos adicionales que serán utilizados por ETL de AWS Glue. Puede utilizar la opción --additional-python-modules con una lista de módulos Python separados por comas para agregar un nuevo módulo o cambiar la versión de un módulo existente. Puede transferir opciones adicionales especificadas por python-modules-installer-option a pip3 para instalar los módulos. Se aplicará cualquier incompatibilidad o limitación de pip3.

Por ejemplo, para actualizar o agregar un nuevo módulo scikit-learn utilice la siguiente clave/valor: "--additional-python-modules", "scikit-learn==0.21.3".

Además, dentro de la opción --additional-python-modules, puede especificar una ruta de Amazon S3 a un módulo de wheel de Python. Por ejemplo:

--additional-python-modules s3://aws-glue-native-spark/tests/j4.2/ephem-3.7.7.1-cp37-cp37m-linux_x86_64.whl,s3://aws-glue-native-spark/tests/j4.2/fbprophet-0.6-py3-none-any.whl,scikit-learn==0.21.3

Puede especificar la opción --additional-python-modules en los parámetro de trabajo DefaultArguments o NonOverridableArguments, o en el campo Job parameters (Parámetros de trabajo) de la consola de AWS Glue.

Módulos de Python ya soportados en AWS Glue, versión 2.0

AWS Glue, versión 2.0 soporta los siguientes módulos de Python listos para su uso:

  • boto3==1.12.4

  • botocore==1.15.4

  • certifi==2019.11.28

  • chardet==3.0.4

  • cycler==0.10.0

  • Cython==0.29.15

  • docutils==0.15.2

  • enum34==1.1.9

  • fsspec==0.6.2

  • idna==2.9

  • jmespath==0.9.4

  • Joblib==0.14.1

  • kiwisolver==1.1.0

  • matplotlib==3.1.3

  • mpmath==1.1.0

  • numpy==1.18.1

  • pandas==1.0.1

  • patsy==0.5.1

  • pmdarima==1.5.3

  • ptvsd==4.3.2

  • pyarrow==0.16.0

  • pydevd==1.9.0

  • pyhocon==0.3.54

  • PyMySQL==0.9.3

  • pyparsing==2.4.6

  • python_dateutil==2.8.1

  • pytz==2019.3

  • requests==2.23.0

  • s3fs==0.4.0

  • s3transfer==0.3.3

  • scikit-learn==0.22.1

  • scipy==1.4.1

  • setuptools==45.2.0

  • setuptools==45.2.0

  • six==1.14.0

  • statsmodels==0.11.1

  • subprocess32==3.5.4

  • sympy==1.5.1

  • tbats==1.0.9

  • urllib3==1.25.8

Compresión de bibliotecas para inclusión

Salvo que una biblioteca se encuentre en un único archivo .py, deberá empaquetarse en un archivo .zip. El directorio del paquete debe encontrarse en la raíz del archivo y debe contener un archivo __init__.py para el paquete. Posteriormente, Python podrá importar el paquete de la forma habitual.

Si la biblioteca se compone solamente de un único módulo de Python en un archivo .py, no será necesario comprimirlo en un archivo .zip.

Carga de bibliotecas Python en un punto de enlace de desarrollo

Si utiliza diferentes conjuntos de bibliotecas para distintos scripts de ETL, puede configurar puntos de enlace de desarrollo independientes para cada conjunto o bien, puede sobrescribir los archivos .zip de la biblioteca que carga el punto de enlace de desarrollo cada vez que usted cambia de script.

Puede utilizar la consola con el fin de especificar uno o varios archivos .zip para un punto de enlace de desarrollo cuando lo cree. Después de asignar un nombre y un rol de IAM, seleccione Script Libraries and job parameters (Bibliotecas de script y parámetros de trabajo) (opcional) y escriba la ruta de Amazon S3 completa para los archivos .zip de la biblioteca en el cuadro Python library path (Ruta de la biblioteca Python). Por ejemplo:

s3://bucket/prefix/site-packages.zip

También puede especificar varias rutas completas a los archivos; para ello, sepárelas con comas pero sin espacios, como sigue:

s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

Si actualiza estos archivos .zip más adelante, puede utilizar la consola para volver a importarlos en el punto de enlace de desarrollo. Vaya al punto de enlace del desarrollador que corresponda, marque la casilla junto al mismo y seleccione Update ETL libraries (Actualizar bibliotecas de ETL) desde el menú Action (Acción).

De forma similar, puede especificar archivos de biblioteca mediante las API de AWS Glue. Cuando crea un punto de enlace de desarrollo al invocar Acción CreateDevEndpoint (Python: create_dev_endpoint), puede especificar una o varias rutas completas para las bibliotecas en el parámetro ExtraPythonLibsS3Path, en una llamada con un formato similar al siguiente:

dep = glue.create_dev_endpoint( EndpointName="testDevEndpoint", RoleArn="arn:aws:iam::123456789012", SecurityGroupIds="sg-7f5ad1ff", SubnetId="subnet-c12fdba4", PublicKey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtp04H/y...", NumberOfNodes=3, ExtraPythonLibsS3Path="s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip")

Cuando actualice un punto de enlace de desarrollo, también puede actualizar las bibliotecas que carga con un objeto DevEndpointCustomLibraries y si establece el parámetro UpdateEtlLibraries en True a la hora de invocar UpdateDevEndpoint (update_dev_endpoint).

Si utiliza un bloc de notas Zeppelin con el punto de enlace de desarrollo, tendrá que invocar la siguiente función de PySpark antes de importar un paquete o paquetes desde el archivo .zip:

sc.addPyFile("/home/glue/downloads/python/yourZipFileName.zip")

Uso de bibliotecas Python en un flujo de trabajo o JobRun

Cuando crea un trabajo nuevo en la consola, puede especificar uno o más archivos .zip de la biblioteca si selecciona Script Libraries and job parameters (Bibliotecas de script y parámetros de trabajo) (opcional) y escribe las rutas completas de la biblioteca de Amazon S3, igual que cuando crea un punto de enlace de desarrollo:

s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

Si invoca CreateJob (create_job), puede especificar una o varias rutas completas para las bibliotecas predeterminadas mediante el parámetro predeterminado --extra-py-files , como se indica a continuación:

job = glue.create_job(Name='sampleJob', Role='Glue_DefaultRole', Command={'Name': 'glueetl', 'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'}, DefaultArguments={'--extra-py-files': 's3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip'})

Posteriormente, cuando inicie un JobRun, puede anular el valor predeterminado de la biblioteca con otro distinto:

runId = glue.start_job_run(JobName='sampleJob', Arguments={'--extra-py-files': 's3://bucket/prefix/lib_B.zip'})