Menggunakan pustaka Python dengan Glue AWS - AWS Glue

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan pustaka Python dengan Glue AWS

Anda dapat menginstal modul dan pustaka Python tambahan untuk digunakan dengan Glue AWS ETL. Untuk AWS Glue 2.0 ke atas, AWS Glue menggunakan Python Package Installer (pip3) untuk menginstal modul tambahan yang digunakan oleh Glue ETL. AWS AWS Glue menyediakan beberapa opsi untuk membawa modul Python tambahan ke lingkungan kerja AWS Glue Anda. Anda dapat menggunakan parameter “-additional-python-modules” untuk membawa modul menggunakan file roda Python, file Persyaratan (requirement.txt, AWS Glue 5.0 dan yang lebih baru), atau daftar modul Python yang dipisahkan koma.

Di bawah model tanggung jawab AWS bersama, Anda bertanggung jawab atas pengelolaan modul Python tambahan, pustaka, dan dependensinya yang Anda gunakan dengan pekerjaan Glue ETL Anda. AWS Ini termasuk menerapkan pembaruan dan patch keamanan.

AWS Glue tidak mendukung kompilasi kode asli di lingkungan kerja. Namun, pekerjaan AWS Glue berjalan dalam lingkungan Linux yang dikelola Amazon. Anda mungkin dapat memberikan dependensi asli Anda dalam bentuk yang dikompilasi melalui file roda Python. Silakan lihat tabel di atas untuk detail kompatibilitas versi AWS Glue.

Jika dependensi Python Anda secara transitif bergantung pada kode asli yang dikompilasi, Anda dapat menghadapi batasan berikut: AWS Glue tidak mendukung kompilasi kode asli di lingkungan pekerjaan. Namun, pekerjaan AWS Glue berjalan dalam lingkungan Linux yang dikelola Amazon. Anda mungkin dapat memberikan dependensi asli Anda dalam bentuk yang dikompilasi melalui distribusi roda. Silakan lihat tabel di atas untuk detail kompatibilitas versi AWS Glue.

penting

Menggunakan dependensi yang tidak kompatibel dapat mengakibatkan masalah runtime, terutama untuk pustaka dengan ekstensi asli yang harus cocok dengan arsitektur lingkungan target dan pustaka sistem. Setiap versi AWS Glue berjalan pada versi Python tertentu dengan pustaka pra-instal dan konfigurasi sistem.

Menginstal modul Python tambahan dengan pip di AWS Glue 2.0 atau yang lebih baru

AWS Glue menggunakan Python Package Installer (pip3) untuk menginstal modul tambahan yang akan digunakan oleh Glue ETL. AWS Anda dapat menggunakan --additional-python-modules parameter dengan daftar modul Python yang dipisahkan koma untuk menambahkan modul baru atau mengubah versi modul yang ada. Anda dapat menginstal distribusi kustom pustaka dengan mengunggah distribusi ke Amazon S3, lalu menyertakan jalur ke objek Amazon S3 dalam daftar modul Anda.

Anda dapat meneruskan opsi tambahan ke pip3 dengan parameter. --python-modules-installer-option Misalnya, Anda dapat meneruskan "--upgrade" untuk memutakhirkan paket yang ditentukan oleh"--additional-python-modules". Untuk contoh lainnya, lihat Membangun modul Python dari roda untuk beban kerja Spark ETL menggunakan Glue 2.0. AWS

AWS Glue mendukung penginstalan paket Python khusus menggunakan file wheel (.whl) yang disimpan di Amazon S3. Untuk menyertakan file roda dalam pekerjaan AWS Glue Anda, berikan daftar terpisah koma dari file roda Anda yang disimpan di s3 ke parameter pekerjaan. --additional-python-modules Misalnya:

--additional-python-modules s3://amzn-s3-demo-bucket/path/to/package-1.0.0-py3-none-any.whl,s3://your-bucket/path/to/another-package-2.1.0-cp311-cp311-linux_x86_64.whl

Pendekatan ini juga mendukung ketika Anda memerlukan distribusi khusus, atau paket dengan dependensi asli yang telah dikompilasi sebelumnya untuk sistem operasi yang benar. Untuk contoh lainnya, lihat Membangun modul Python dari roda untuk beban kerja Spark ETL menggunakan Glue 2.0. AWS

Anda menentukan --additional-python-modules bidang parameter Job pada konsol AWS Glue atau dengan mengubah argumen pekerjaan di AWS SDK. Untuk informasi selengkapnya tentang pengaturan parameter pekerjaan, lihat Menggunakan parameter pekerjaan di pekerjaan AWS Glue.

Di AWS Glue 5.0, Anda dapat memberikan standar defacto untuk requirements.txt mengelola dependensi pustaka Python. Untuk melakukan itu, berikan dua parameter pekerjaan berikut:

  • Kunci: --python-modules-installer-option

    Nilai: -r

  • Kunci: --additional-python-modules

    Nilai: s3://path_to_requirements.txt

AWS Glue 5.0 node awalnya memuat pustaka python yang ditentukan dalam. requirements.txt

Berikut contoh requirements.txt:

awswrangler==3.9.1 elasticsearch==8.15.1 PyAthena==3.9.0 PyMySQL==1.1.1 PyYAML==6.0.2 pyodbc==5.2.0 pyorc==0.9.0 redshift-connector==2.1.3 scipy==1.14.1 scikit-learn==1.5.2 SQLAlchemy==2.0.36
penting

Harap hindari versi pustaka yang tidak disematkan di requirements.txt Anda untuk memastikan Anda memiliki lingkungan AWS Glue yang andal dan deterministik untuk pekerjaan Anda.

Saat Anda menggunakan roda untuk dependensi langsung, Anda dapat membawa versi dependensi transitif yang tidak kompatibel jika tidak disematkan dengan benar. Sebagai praktik terbaik, semua versi pustaka harus disematkan untuk konsistensi dalam pekerjaan AWS Glue. AWS Glue merekomendasikan untuk mengemas lingkungan python Anda ke dalam file roda untuk memastikan konsistensi dan keandalan beban kerja produksi Anda.

Untuk memperbarui atau menambahkan modul Python baru AWS Glue memungkinkan melewati --additional-python-modules parameter dengan daftar modul Python yang dipisahkan koma sebagai nilai. Misalnya untuk memperbarui/menambahkan modul scikit-learn gunakan kunci/nilai berikut:. "--additional-python-modules", "scikit-learn==0.21.3" Anda memiliki dua opsi untuk langsung mengkonfigurasi modul python.

  • Modul Python yang disematkan (disarankan)

    "--additional-python-modules", "scikit-learn==0.21.3,ephem==4.1.6"

  • Modul Python yang tidak disematkan: (Tidak disarankan untuk Beban Kerja Produksi)

    "--additional-python-modules", "scikit-learn>==0.20.0,ephem>=4.0.0"

    ATAU

    "--additional-python-modules", "scikit-learn,ephem"

penting

Saat mengonfigurasi modul python secara langsung, --additional-python-modules AWS Glue merekomendasikan untuk menggunakan versi pustaka yang disematkan untuk memastikan konsistensi dalam lingkungan kerja AWS Glue. Menggunakan versi pustaka yang tidak disematkan, menarik versi terbaru dari modul python, namun ini dapat memperkenalkan perubahan yang melanggar atau membawa modul python yang tidak kompatibel yang menyebabkan kegagalan pekerjaan karena kegagalan instalasi python di lingkungan kerja Glue. AWS Kami menyarankan pelanggan untuk tidak menggunakan versi pustaka yang tidak disematkan untuk beban kerja produksi. Sebagai praktik terbaik, AWS Glue merekomendasikan untuk mengemas lingkungan python Anda ke dalam file roda untuk memastikan konsistensi dan keandalan beban kerja produksi Anda.

Praktik Terbaik untuk Menginstal pustaka Python tambahan di Glue AWS

(Disarankan) Mengemas lingkungan Python ke dalam file roda tunggal

Untuk lingkungan yang aman dan konsisten, AWS Glue merekomendasikan agar Anda memotret dan mengemas lingkungan python Anda ke dalam file roda. Manfaat dari ini adalah bahwa lingkungan python Anda untuk modul python referensi dan dependensi transitifnya akan dikunci. Ini memastikan bahwa pekerjaan AWS Glue Anda tidak terpengaruh ketika repositori upstream seperti PyPI atau dependensi memperkenalkan pembaruan yang tidak kompatibel.

File ini kemudian dapat digunakan dalam pekerjaan AWS Glue Anda menggunakan --additional-python-modules bendera.

penting

Anda harus menjalankan skrip berikut di lingkungan yang sama dengan versi AWS Glue yang Anda jalankan. Silakan lihat tabel detail lingkungan lem dan pastikan Anda menggunakan gambar OS dasar dan versi python yang sama.

#!/bin/bash set -e REQUIREMENTS_FILE="requirements.txt" FINAL_WHEEL_OUTPUT_DIRECTORY="." PACKAGE_NAME=$(basename "$(pwd)") PACKAGE_VERSION="0.1.0" # Help message show_help() { echo "Usage: $0 [options]" echo "" echo "Options:" echo " -r, --requirements FILE Path to requirements.txt file (default: requirements.txt)" echo " -o, --wheel-output DIR Output directory for final wheel (default: current directory)" echo " -n, --name NAME Package name (default: current directory name)" echo " -v, --version VERSION Package version (default: 0.1.0)" echo " -h, --help Show this help message" echo " -g, --glue-version Glue version (required)" echo "" echo "Example:" echo " $0 -r custom-requirements.txt -o dist -n my_package -v 1.2.3 -g 4.0" } # Parse command line arguments while [[ $# -gt 0 ]]; do key="$1" case $key in -r | --requirements) REQUIREMENTS_FILE="$2" shift 2 ;; -o | --wheel-output) FINAL_WHEEL_OUTPUT_DIRECTORY="$2" shift 2 ;; -n | --name) PACKAGE_NAME="$2" shift 2 ;; -v | --version) PACKAGE_VERSION="$2" shift 2 ;; -g | --glue-version) GLUE_VERSION="$2" shift 2 ;; -h | --help) show_help exit 0 ;; *) echo "Unknown option: $1" show_help exit 1 ;; esac done # If package name has dashes, convert to underscores and notify user. We need to check this since we cant import a package with dashes. if [[ "$PACKAGE_NAME" =~ "-" ]]; then echo "Warning: Package name '$PACKAGE_NAME' contains dashes. Converting to underscores." PACKAGE_NAME=$(echo "$PACKAGE_NAME" | tr '-' '_') fi UBER_WHEEL_NAME="${PACKAGE_NAME}-${PACKAGE_VERSION}-py3-none-any.whl" # Check if glue version is provided if [ -z "$GLUE_VERSION" ]; then echo "Error: Glue version is required." exit 1 fi # Validate version format (basic check) if [[ ! "$PACKAGE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && [[ ! "$PACKAGE_VERSION" =~ ^[0-9]+\.[0-9]+$ ]]; then echo "Warning: Version '$PACKAGE_VERSION' doesn't follow semantic versioning (x.y.z or x.y)" fi # Check if requirements file exists if [ ! -f "$REQUIREMENTS_FILE" ]; then echo "Error: Requirements file '$REQUIREMENTS_FILE' not found." exit 1 fi # Get relevant platform tags/python versions based on glue version if [[ "$GLUE_VERSION" == "5.0" ]]; then PYTHON_VERSION="3.11" GLIBC_VERSION="2.34" elif [[ "$GLUE_VERSION" == "4.0" ]]; then PYTHON_VERSION="3.10" GLIBC_VERSION="2.26" elif [[ "$GLUE_VERSION" == "3.0" ]]; then PYTHON_VERSION="3.7" GLIBC_VERSION="2.26" elif [[ "$GLUE_VERSION" == "2.0" ]]; then PYTHON_VERSION="3.7" GLIBC_VERSION="2.17" elif [[ "$GLUE_VERSION" == "1.0" ]]; then PYTHON_VERSION="3.6" GLIBC_VERSION="2.17" elif [[ "$GLUE_VERSION" == "0.9" ]]; then PYTHON_VERSION="2.7" GLIBC_VERSION="2.17" else echo "Error: Unsupported glue version '$GLUE_VERSION'." exit 1 fi echo "Using Glue version $GLUE_VERSION" echo "Using Glue python version $PYTHON_VERSION" echo "Using Glue glibc version $GLIBC_VERSION" PIP_PLATFORM_FLAG="" is_glibc_compatible() { # assumes glibc version in the form of major.minor (ex: 2.17) # glue glibc must be >= platform glibc local glue_glibc_version="$GLIBC_VERSION" local platform_glibc_version="$1" # 2.27 (platform) can run on 2.27 (glue) if [[ "$platform_glibc_version" == "$glue_glibc_version" ]]; then return 0 fi local glue_glibc_major="${glue_glibc_version%%.*}" local glue_glibc_minor="${glue_glibc_version#*.}" local platform_glibc_major="${platform_glibc_version%%.*}" local platform_glibc_minor="${platform_glibc_version#*.}" # 3.27 (platform) cannot run on 2.27 (glue) if [[ "$platform_glibc_major" -gt "$glue_glibc_major" ]]; then return 1 fi # 2.34 (platform) cannot run on 2.27 (glue) if [[ "$platform_glibc_major" -eq "$glue_glibc_major" ]] && [[ "$platform_glibc_minor" -gt "$glue_glibc_minor" ]]; then return 1 fi # 2.17 (platform) can run on 2.27 (glue) return 0 } PIP_PLATFORM_FLAG="" if is_glibc_compatible "2.17"; then PIP_PLATFORM_FLAG="${PIP_PLATFORM_FLAG} --platform manylinux2014_x86_64" fi if is_glibc_compatible "2.28"; then PIP_PLATFORM_FLAG="${PIP_PLATFORM_FLAG} --platform manylinux_2_28_x86_64" fi if is_glibc_compatible "2.34"; then PIP_PLATFORM_FLAG="${PIP_PLATFORM_FLAG} --platform manylinux_2_34_x86_64" fi if is_glibc_compatible "2.39"; then PIP_PLATFORM_FLAG="${PIP_PLATFORM_FLAG} --platform manylinux_2_39_x86_64" fi echo "Using pip platform flags: $PIP_PLATFORM_FLAG" # Convert to absolute paths REQUIREMENTS_FILE=$(realpath "$REQUIREMENTS_FILE") FINAL_WHEEL_OUTPUT_DIRECTORY=$(realpath "$FINAL_WHEEL_OUTPUT_DIRECTORY") TEMP_WORKING_DIR=$(mktemp -d) VENV_DIR="${TEMP_WORKING_DIR}/.build_venv" WHEEL_OUTPUT_DIRECTORY="${TEMP_WORKING_DIR}/wheelhouse" # Cleanup function cleanup() { echo "Cleaning up temporary files..." rm -rf "$TEMP_WORKING_DIR" } trap cleanup EXIT echo "=========================================" echo "Building wheel for $PACKAGE_NAME with all dependencies from $REQUIREMENTS_FILE" echo "=========================================" # Determine Python executable to use consistently PYTHON_EXEC=$(which python3 2>/dev/null || which python 2>/dev/null) if [ -z "$PYTHON_EXEC" ]; then echo "Error: No Python executable found" exit 1 fi echo "Using Python: $PYTHON_EXEC" echo "" # Install build requirements echo "Step 1/5: Installing build tools..." echo "----------------------------------------" "$PYTHON_EXEC" -m pip install --upgrade pip build wheel setuptools echo "✓ Build tools installed successfully" echo "" # Create a virtual environment for building echo "Step 2/5: Creating build environment..." echo "----------------------------------------" "$PYTHON_EXEC" -m venv "$VENV_DIR" # Check if virtual environment was created successfully if [ ! -f "$VENV_DIR/bin/activate" ]; then echo "Error: Failed to create virtual environment" exit 1 fi source "$VENV_DIR/bin/activate" # Install pip-tools for dependency resolution "$VENV_DIR/bin/pip" install pip-tools echo "✓ Build environment created successfully" echo "" # Compile requirements to get all transitive dependencies GLUE_PIP_ARGS="$PIP_PLATFORM_FLAG --python-version $PYTHON_VERSION --only-binary=:all:" echo "Step 3/5: Resolving all dependencies..." echo "----------------------------------------" if ! "$VENV_DIR/bin/pip-compile" --pip-args "$GLUE_PIP_ARGS" --no-emit-index-url --output-file "$TEMP_WORKING_DIR/.compiled_requirements.txt" "$REQUIREMENTS_FILE"; then echo "Error: Failed to resolve dependencies. Check for conflicts in $REQUIREMENTS_FILE" exit 1 fi echo "✓ Dependencies resolved successfully" echo "" # Download all wheels for dependencies echo "Step 4/5: Downloading all dependency wheels..." echo "----------------------------------------" "$VENV_DIR/bin/pip" download -r "$TEMP_WORKING_DIR/.compiled_requirements.txt" -d "$WHEEL_OUTPUT_DIRECTORY" $GLUE_PIP_ARGS # Check if any wheels were downloaded if [ ! "$(ls -A "$WHEEL_OUTPUT_DIRECTORY")" ]; then echo "Error: No wheels were downloaded. Check your requirements file." exit 1 fi # Count downloaded wheels (using find instead of ls for better handling) WHEEL_COUNT=$(find "$WHEEL_OUTPUT_DIRECTORY" -name "*.whl" -type f | wc -l | tr -d ' ') echo "✓ Downloaded $WHEEL_COUNT dependency wheels successfully" echo "" # Create a single uber wheel with all dependencies echo "Step 5/5: Creating uber wheel with all dependencies included..." echo "----------------------------------------" # Create a temporary directory for the uber wheel UBER_WHEEL_DIR="$TEMP_WORKING_DIR/uber" mkdir -p "$UBER_WHEEL_DIR" # Create the setup.py file with custom install command cat >"$UBER_WHEEL_DIR/setup.py" <<EOF from setuptools import setup, find_packages import setuptools.command.install import os import glob import subprocess import sys setup( name='${PACKAGE_NAME}', version='${PACKAGE_VERSION}', description='Bundle containing dependencies for ${PACKAGE_NAME}', author='Package Builder', author_email='builder@example.com', packages=['${PACKAGE_NAME}'], # Include the package directory to hold wheels include_package_data=True, package_data={ '${PACKAGE_NAME}': ['wheels/*.whl'], # Include wheels in the package directory } ) EOF # Create a MANIFEST.in file to include all wheels cat >"$UBER_WHEEL_DIR/MANIFEST.in" <<EOF recursive-include ${PACKAGE_NAME}/wheels *.whl EOF # Create an __init__.py file that imports all the bundled wheel files (no auto-install logic) mkdir -p "$UBER_WHEEL_DIR/${PACKAGE_NAME}" cat >"$UBER_WHEEL_DIR/${PACKAGE_NAME}/__init__.py" <<EOF """ ${PACKAGE_NAME} - dependencies can be installed at runtime using the $(load_wheels) function """ from pathlib import Path import logging import subprocess import sys __version__ = "${PACKAGE_VERSION}" def load_wheels(log_level=logging.INFO): logger = logging.getLogger(__name__) handler = logging.StreamHandler(sys.stdout) formatter = logging.Formatter("[Glue Python Wheel Installer] %(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(log_level) logger.info("Starting wheel installation process") package_dir = Path(__file__).parent.absolute() wheels_dir = package_dir / "wheels" logger.debug(f"Package directory: {package_dir}") logger.debug(f"Looking for wheels in: {wheels_dir}") if not wheels_dir.exists(): logger.error(f"Wheels directory not found: {wheels_dir}") return False wheel_files = list(wheels_dir.glob("*.whl")) if not wheel_files: logger.warning(f"No wheels found in: {wheels_dir}") return False logger.info(f"Found {len(wheel_files)} wheels") wheel_file_paths = [str(wheel_file) for wheel_file in wheel_files] logger.info(f"Installing {wheel_file_paths}...") try: result = subprocess.run( [sys.executable, "-m", "pip", "install", *wheel_file_paths], check=True, capture_output=True, text=True ) logger.info(f"✓ Successfully installed wheel files") logger.debug(f"pip output: {result.stdout}") except subprocess.CalledProcessError as e: error_msg = f"Failed to install wheel files" logger.error(f"✗ {error_msg}: {e}") if e.stderr: logger.error(f"Error details: {e.stderr}") return False logger.info("All wheels installed successfully") return True EOF cat >"$UBER_WHEEL_DIR/${PACKAGE_NAME}/auto.py" <<EOF """ ${PACKAGE_NAME} - utility module that allows users to automatically install modules by adding $(import ${PACKAGE_NAME}.auto) to the top of their script """ from ${PACKAGE_NAME} import load_wheels load_wheels() EOF # Copy all wheels to the uber wheel directory mkdir -p "$UBER_WHEEL_DIR/${PACKAGE_NAME}/wheels" cp "$WHEEL_OUTPUT_DIRECTORY"/*.whl "$UBER_WHEEL_DIR/${PACKAGE_NAME}/wheels/" # Build the uber wheel echo "Building uber wheel package..." # Install build tools in the current environment "$VENV_DIR/bin/pip" install build if ! (cd "$UBER_WHEEL_DIR" && "$VENV_DIR/bin/python" -m build --skip-dependency-check --wheel --outdir .); then echo "Error: Failed to build uber wheel" exit 1 fi # Ensure output directory exists mkdir -p "$FINAL_WHEEL_OUTPUT_DIRECTORY" # Copy the uber wheel to the output directory FINAL_WHEEL_OUTPUT_PATH="$FINAL_WHEEL_OUTPUT_DIRECTORY/$UBER_WHEEL_NAME" # Find the generated wheel (should be only one in the root directory) GENERATED_WHEEL=$(find "$UBER_WHEEL_DIR" -maxdepth 1 -name "*.whl" -type f | head -1) if [ -z "$GENERATED_WHEEL" ]; then echo "Error: No uber wheel was generated" exit 1 fi cp "$GENERATED_WHEEL" "$FINAL_WHEEL_OUTPUT_PATH" # Get final wheel size for user feedback WHEEL_SIZE=$(du -h "$FINAL_WHEEL_OUTPUT_PATH" | cut -f1) echo "✓ Uber wheel created successfully!" echo "" echo "=========================================" echo "BUILD COMPLETED SUCCESSFULLY!" echo "=========================================" echo "Final wheel: $FINAL_WHEEL_OUTPUT_PATH" echo "Wheel size: $WHEEL_SIZE" echo "Dependencies included: $WHEEL_COUNT packages" echo "" echo "To install the bundle, run:" echo " pip install $FINAL_WHEEL_OUTPUT_PATH" echo "" echo "After installation, you can verify that the bundle works by running:" echo " python -c \"import ${PACKAGE_NAME}; ${PACKAGE_NAME}.load_wheels()\"" echo " or " echo " python -c \"import ${PACKAGE_NAME}.auto\"" echo "========================================="

./wheel_packager.sh -r <path to requirements.txt> -g <glue version> -o <wheel output directory> -n <package name> -v <wheel version>

--additional-python-modules s3://your-bucket/path/to/package_with_dependencies-1.0.0-py3-none-any.whl

# Option 1: automatic installation via import import package_with_dependencies.auto # Option 2: manual installation from package_with_dependencies import load_wheels load_wheels()

Termasuk file Python dengan fitur asli PySpark

AWS Glue menggunakan PySpark untuk menyertakan file Python dalam pekerjaan AWS Glue ETL. Anda akan ingin menggunakan --additional-python-modules untuk mengelola dependensi Anda bila tersedia. Anda dapat menggunakan parameter --extra-py-files pekerjaan untuk menyertakan file Python. Dependensi harus di-host di Amazon S3 dan nilai argumen harus berupa daftar jalur Amazon S3 yang dibatasi koma tanpa spasi. Fungsionalitas ini berperilaku seperti manajemen ketergantungan Python yang akan Anda gunakan dengan Spark. Untuk informasi selengkapnya tentang manajemen ketergantungan Python di Spark, lihat halaman Menggunakan Fitur PySpark Asli di dokumentasi Apache Spark. --extra-py-filesberguna dalam kasus di mana kode tambahan Anda tidak dikemas, atau saat Anda memigrasikan program Spark dengan rantai alat yang ada untuk mengelola dependensi. Agar alat ketergantungan Anda dapat dipertahankan, Anda harus menggabungkan dependensi Anda sebelum mengirimkan.

Skrip pemrograman yang menggunakan transformasi visual

Saat Anda membuat pekerjaan AWS Glue menggunakan antarmuka visual AWS Glue Studio, Anda dapat mengubah data Anda dengan node transformasi data terkelola dan transformasi visual khusus. Untuk informasi selengkapnya tentang node transformasi data terkelola, lihatTransformasi data dengan transformasi AWS Glue terkelola. Untuk informasi selengkapnya tentang transformasi visual kustom, lihat Mengubah data dengan transformasi visual kustom . Skrip yang menggunakan transformasi visual hanya dapat dihasilkan ketika Bahasa pekerjaan Anda diatur untuk menggunakan Python.

Saat membuat pekerjaan AWS Glue menggunakan transformasi visual, AWS Glue Studio akan menyertakan transformasi ini di lingkungan runtime menggunakan --extra-py-files parameter dalam konfigurasi pekerjaan. Untuk informasi selengkapnya tentang parameter pekerjaan, lihatMenggunakan parameter pekerjaan dalam pekerjaan AWS Glue. Saat membuat perubahan pada skrip atau lingkungan runtime yang dihasilkan, Anda harus mempertahankan konfigurasi pekerjaan ini agar skrip Anda berhasil berjalan.

Pustaka ritsleting untuk dimasukkan

Kecuali sebuah perpustakaan terkandung dalam satu file .py, ia harus dikemas dalam sebuah arsip .zip. Direktori paket harus berada pada akar dari arsip, dan harus berisi file __init__.py untuk paket. Python kemudian akan dapat mengimpor paket tersebut dengan cara normal.

Jika perpustakaan anda hanya terdiri dari sebuah modul Python tunggal dalam satu file .py, Anda tidak perlu menempatkannya dalam sebuah file .zip.

Memuat pustaka Python di notebook Glue Studio AWS

Untuk menentukan library Python di notebook AWS Glue Studio, lihat Menginstal modul Python tambahan.

Memuat pustaka Python di titik akhir pengembangan di Glue 0.9/1.0 AWS

Jika Anda menggunakan set perpustakaan yang berbeda untuk skrip ETL yang berbeda, maka Anda dapat mengatur titik akhir pengembangan terpisah untuk setiap set, atau Anda dapat menimpa file .zip perpustakaan yang dimuat titik akhir pengembangan Anda setiap kali Anda beralih skrip.

Anda dapat menggunakan konsol untuk menentukan satu atau beberapa perpustakaan file .zip untuk sebuah titik akhir pengembangan ketika Anda membuatnya. Setelah menetapkan nama dan IAM role, pilih Perpustakaan Skrip dan parameter tugas (opsional) dan masukkan path Amazon S3 lengkap ke file .zip perpustakaan Anda dalam kotak path perpustakaan Python. Misalnya:

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

Jika Anda mau, Anda dapat menentukan beberapa path lengkap ke file, memisahkannya dengan koma tetapi tanpa spasi, seperti ini:

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

Jika Anda kemudian memperbarui file .zip, Anda dapat menggunakan konsol untuk mengimpornya kembali ke titik akhir pengembangan Anda. Arahkan ke titik akhir developer yang dimaksud, centang kotak di sampingnya, dan pilih Memperbarui perpustakaan ETL dari menu Tindakan.

Dengan cara yang sama, Anda dapat menentukan file perpustakaan menggunakan AWS Glue APIs. Ketika Anda membuat sebuah titik akhir pengembangan dengan memanggil CreateDevEndpoint tindakan (Python: create_dev_endpoint), Anda dapat menentukan satu atau beberapa path lengkap ke perpustakaan di parameter ExtraPythonLibsS3Path, dalam panggilan yang terlihat seperti ini:

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")

Ketika Anda memperbarui titik akhir pengembangan, Anda juga dapat memperbarui perpustakaan yang dimuatnya menggunakan objek DevEndpointCustomLibraries dan pengaturan parameter UpdateEtlLibraries untuk True ketika memanggil UpdateDevEndpoint (update_dev_endpoint).

Menggunakan pustaka Python dalam pekerjaan atau JobRun

Ketika Anda membuat sebuah Tugas baru pada konsol, Anda dapat menentukan satu atau beberapa perperpustakaanan file .zip dengan memilih Perpustakaan skrip dan parameter tugas (opsional) dan memasukkan path perpustakaan Amazon S3 lengkap dengan cara yang sama saat membuat titik akhir pengembangan:

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

Jika Anda memanggil CreateJob (create_job), Anda dapat menentukan satu atau beberapa path lengkap ke perpustakaan default menggunakan parameter --extra-py-files default, seperti ini:

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'})

Kemudian ketika Anda memulai JobRun, Anda dapat mengganti pengaturan pustaka default dengan yang berbeda:

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

Analisis dependensi Python secara proaktif

Untuk secara proaktif mengidentifikasi potensi masalah ketergantungan sebelum menerapkan ke AWS Glue, Anda dapat menggunakan alat analisis ketergantungan untuk memvalidasi paket Python Anda terhadap lingkungan Glue target Anda. AWS

AWS menyediakan alat analisa ketergantungan Python open-source yang dirancang khusus untuk lingkungan Glue. AWS Alat ini tersedia di repositori sampel AWS Glue dan dapat digunakan secara lokal untuk memvalidasi dependensi Anda sebelum penerapan.

Analisis ini membantu memastikan dependensi Anda mengikuti praktik yang disarankan untuk menyematkan semua versi pustaka untuk penerapan produksi yang konsisten. Untuk lebih jelasnya, silakan lihat README alat.

AWS Glue Python Dependency Analyzer membantu mengidentifikasi dependensi yang tidak disematkan dan konflik versi dengan mensimulasikan instalasi pip dengan batasan khusus platform yang sesuai dengan lingkungan Glue target Anda. AWS

# Analyze a single Glue job python glue_dependency_analyzer.py -j my-glue-job # Analyze multiple jobs with specific AWS configuration python glue_dependency_analyzer.py -j job1 -j job2 --aws-profile production --aws-region us-west-2

Alat ini akan menandai:

  • Dependensi yang tidak disematkan yang dapat menginstal versi berbeda di seluruh proses pekerjaan

  • Konflik versi antar paket

  • Dependensi tidak tersedia untuk lingkungan Glue AWS target Anda

Amazon Q Developer adalah asisten percakapan yang didukung kecerdasan buatan (AI) generatif yang dapat membantu Anda memahami, membangun, memperluas, dan mengoperasikan AWS aplikasi. Anda dapat mengunduhnya dengan mengikuti petunjuk di Panduan Memulai untuk Amazon Q.

Amazon Q Developer dapat digunakan untuk menganalisis dan memperbaiki kegagalan pekerjaan karena ketergantungan python. Kami menyarankan untuk menggunakan prompt berikut dengan mengganti <Job-Name>placeholder pekerjaan dengan nama pekerjaan lem Anda.

I have an AWS Glue job named <Job-Name> that has failed due to Python module installation conflicts. Please assist in diagnosing and resolving this issue using the following systematic approach. Proceed once sufficient information is available. Objective: Implement a fix that addresses the root cause module while minimizing disruption to the existing working environment. Step 1: Root Cause Analysis • Retrieve the most recent failed job run ID for the specified Glue job • Extract error logs from CloudWatch Logs using the job run ID as a log stream prefix • Analyze the logs to identify: • The recently added or modified Python module that triggered the dependency conflict • The specific dependency chain causing the installation failure • Version compatibility conflicts between required and existing modules Step 2: Baseline Configuration Identification • Locate the last successful job run ID prior to the dependency failure • Document the Python module versions that were functioning correctly in that baseline run • Establish the compatible version constraints for conflicting dependencies Step 3: Targeted Resolution Implementation • Apply pinning by updating the job's additional_python_modules parameter • Pin only the root cause module and its directly conflicting dependencies to compatible versions, and do not remove python modules unless necessary • Preserve flexibility for non-conflicting modules by avoiding unnecessary version constraints • Deploy the configuration changes with minimal changes to the existing configuration and execute a validation test run. Do not change the Glue versions. Implementation Example: Scenario: Recently added pandas==2.0.0 to additional_python_modules Error: numpy version conflict (pandas 2.0.0 requires numpy>=1.21, but existing job code requires numpy<1.20) Resolution: Update additional_python_modules to "pandas==1.5.3,numpy==1.19.5" Rationale: Use pandas 1.5.3 (compatible with numpy 1.19.5) and pin numpy to last known working version Expected Outcome: Restore job functionality with minimal configuration changes while maintaining system stability.

Prompt menginstruksikan Q untuk:

  1. Ambil ID run pekerjaan gagal terbaru

  2. Temukan log dan detail terkait

  3. Temukan pekerjaan yang berhasil dijalankan untuk mendeteksi paket Python yang diubah

  4. Buat perbaikan konfigurasi apa pun dan picu uji coba lain

Modul Python sudah disediakan di Glue AWS

Untuk mengubah versi modul yang disediakan ini, berikan versi baru dengan parameter --additional-python-modules pekerjaan.

AWS Glue version 5.0

AWS Glue versi 5.0 menyertakan modul Python berikut di luar kotak:

  • aiobotocore==2.13.1

  • aiohappyeyeballs==2.3.5

  • aiohttp = 3.10.1

  • aioitertools==0.11.0

  • aiosignal== 1.3.1

  • appdirs==1.4.4

  • attrs==24.2.0

  • boto3 = 1.34.131

  • botocore==1.34.131

  • sertifikasi = 2024.7.4

  • charset-normalizer = 3.3.2

  • kontur ==1.2.1

  • pengendara sepeda = 0.12.1

  • alat font==4.53.1

  • daftar beku==1.4.1

  • fsspec==2024.6.1

  • idna==2.10

  • jmespath=0.10.0

  • kaleido==0.2.1

  • kiwisolver==1.4.5

  • matplotlib==3.9.0

  • multidikt = 6.0.5

  • numpy = 1.26.4

  • pengepakan==24.1

  • panda ==2.2.2

  • bantal==10.4.0

  • pip=23.0.1

  • plot== 5.23.0

  • pyarrow = 17.0.0

  • pyparsing = 3.1.2

  • python-dateutil==2.9.0.post0

  • pytz==2024.1

  • permintaan==2.32.2

  • s3fs==2024.6.1

  • s3transfer = 0.10.2

  • pelautan==0.13.2

  • setuptool=59.6.0

  • enam==1.16.0

  • keuletan==9.0.0

  • tzdata ==2024.1

  • urllib3==1.25.10

  • virtualenv = 20.4.0

  • bungkus=1.16.0

  • yarl=1.9.4

AWS Glue version 4.0

AWS Glue versi 4.0 menyertakan modul Python berikut di luar kotak:

  • aiobotocore==2.4.1

  • aiohttp = 3.8.3

  • aioitertools==0.11.0

  • aiosignal== 1.3.1

  • batas waktu asinkron = 4.0.2

  • asynctest = 0.13.0

  • attrs==22.2.0

  • avro-python3 = 1.10.2

  • boto3 = 1.24.70

  • botocore==1.27.59

  • sertifikasi = 2021.5.30

  • chardet==3.0.4

  • charset-normalizer = 2.1.1

  • klik==8.1.3

  • cycler==0.10.0

  • Cython==0.29.32

  • fsspec==2021.8.1

  • idna==2.10

  • importlib-metadata== 5.0.0

  • jmespath=0.10.0

  • joblib==1.0.1

  • kaleido==0.2.1

  • kiwisolver==1.4.4

  • matplotlib==3.4.3

  • mpmath==1.2.1

  • multidikt = 6.0.4

  • nltk== 3.7

  • numpy = 1.23.5

  • pengepakan== 23.0

  • panda ==1.5.1

  • patsy==0.5.1

  • Bantal==9.4.0

  • pip=23.0.1

  • plot== 5.16.0

  • pmdarima==2.0.1

  • ptvsd==4.3.2

  • pyarrow = 10.0.0

  • pydevd=2.5.0

  • pyhocon==0.3.58

  • PyMySQL=1.0.2

  • pyparsing = 2.4.7

  • python-dateutil==2.8.2

  • pytz==2021.1

  • Pyyaml==6.0.1

  • regex==2022.10.31

  • requests==2.23.0

  • s3fs==2022.11.0

  • s3transfer==0.6.0

  • scikit-belajar==1.1.3

  • scipy==1.9.3

  • setuptool== 49.1.3

  • enam==1.16.0

  • statsmodels==0.13.5

  • subprocess32==3.5.4

  • simpati=1,8

  • tbats==1.1.0

  • threadpoolctl = 3.1.0

  • tqdm = 4.64.1

  • typing_extensions==4.4.0

  • urllib3==1.25.11

  • roda = 0.37.0

  • bungkus = 1.14.1

  • yarl=1.8.2

  • ritsleting = 3.10.0

AWS Glue version 3.0

AWS Glue versi 3.0 menyertakan modul Python berikut di luar kotak:,

  • aiobotocore==1.4.2

  • aiohttp = 3.8.3

  • aioitertools==0.11.0

  • aiosignal== 1.3.1

  • batas waktu asinkron = 4.0.2

  • asynctest = 0.13.0

  • attrs==22.2.0

  • avro-python3 = 1.10.2

  • boto3 = 1.18.50

  • botocore==1.21.50

  • sertifikasi = 2021.5.30

  • chardet==3.0.4

  • charset-normalizer = 2.1.1

  • klik==8.1.3

  • cycler==0.10.0

  • Cython==0.29.4

  • dokumen==0.17.1

  • enum34==1.1.10

  • daftar beku==1.3.3

  • fsspec==2021.8.1

  • idna==2.10

  • importlib-metadata== 6.0.0

  • jmespath=0.10.0

  • joblib==1.0.1

  • kiwisolver==1.3.2

  • matplotlib==3.4.3

  • mpmath==1.2.1

  • multidikt = 6.0.4

  • nltk = 3.6.3

  • numpy = 1.19.5

  • pengepakan== 23.0

  • panda ==1.3.2

  • patsy==0.5.1

  • Bantal==9.4.0

  • pip=23.0

  • pmdarima==1.8.2

  • ptvsd==4.3.2

  • pyarrow = 5.0.0

  • pydevd=2.5.0

  • pyhocon==0.3.58

  • PyMySQL=1.0.2

  • pyparsing = 2.4.7

  • python-dateutil==2.8.2

  • pytz==2021.1

  • Pyyaml==5.4.1

  • regex==2022.10.31

  • requests==2.23.0

  • s3fs==2021.8.1

  • s3transfer== 0.5.0

  • scikit-belajar==0.24.2

  • scipy==1.7.1

  • enam==1.16.0

  • Percikan = 1.0

  • statsmodels==0.12.2

  • subprocess32==3.5.4

  • simpati=1,8

  • tbats==1.1.0

  • threadpoolctl = 3.1.0

  • tqdm = 4.64.1

  • typing_extensions==4.4.0

  • urllib3==1.25.11

  • roda = 0.37.0

  • bungkus = 1.14.1

  • yarl=1.8.2

  • ritsleting = 3.12.0

AWS Glue version 2.0

AWS Glue versi 2.0 menyertakan modul Python berikut di luar kotak:

  • avro-python3 = 1.10.0

  • awscli==1.27.60

  • boto3==1.12.4

  • botocore==1.15.4

  • certifi==2019.11.28

  • chardet==3.0.4

  • klik==8.1.3

  • colorama==0.4.4

  • cycler==0.10.0

  • Cython==0.29.15

  • docutils==0.15.2

  • enum34==1.1.9

  • fsspec==0.6.2

  • idna==2.9

  • importlib-metadata== 6.0.0

  • jmespath==0.9.4

  • joblib==0.14.1

  • kiwisolver==1.1.0

  • matplotlib==3.1.3

  • mpmath==1.1.0

  • nltk=3,5

  • numpy==1.18.1

  • pandas==1.0.1

  • patsy==0.5.1

  • pmdarima==1.5.3

  • ptvsd==4.3.2

  • pyarrow==0.16.0

  • pyasn1==0.4.8

  • pydevd==1.9.0

  • pyhocon==0.3.54

  • PyMySQL=0.9.3

  • pyparsing==2.4.6

  • python-dateutil==2.8.1

  • pytz==2019.3

  • Pyyaml = 5.3.1

  • regex==2022.10.31

  • requests==2.23.0

  • rsa = 4.7.2

  • s3fs==0.4.0

  • s3transfer==0.3.3

  • scikit-learn==0.22.1

  • scipy==1.4.1

  • setuptools==45.2.0

  • six==1.14.0

  • Percikan = 1.0

  • statsmodels==0.11.1

  • subprocess32==3.5.4

  • sympy==1.5.1

  • tbats==1.0.9

  • tqdm = 4.64.1

  • mengetik-ekstensi== 4.4.0

  • urllib3==1.25.8

  • roda==0.35.1

  • ritsleting = 3.12.0