View a markdown version of this page

Jalankan sesi interaktif dengan Amazon EMR di EKS melalui Spark Connect - Amazon EMR

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

Jalankan sesi interaktif dengan Amazon EMR di EKS melalui Spark Connect

Dengan Amazon EMR pada rilis EKS emr-7.14.0 dan yang lebih baru (atau yang emr-spark-8.1.0 lebih baru), Anda dapat terhubung ke titik akhir Spark Connect yang dikelola dari PySpark klien yang dikelola sendiri sepertiVS Code,PyCharm, dan Jupyter notebook. Spark Connect menggunakan arsitektur client-server yang memisahkan kode aplikasi Anda dari proses driver Spark. Anda mengembangkan dan men-debug PySpark kode di IDE lokal Anda sementara operasi Spark berjalan di cluster EKS Anda melalui Amazon EMR di EKS. Spark Connect menawarkan manfaat berikut:

  • Hubungkan ke Amazon EMR di EKS dari PySpark klien mana pun, termasukVS Code,PyCharm, dan notebook Jupyter

  • Tetapkan breakpoint dan langkah melalui PySpark kode di IDE Anda saat DataFrames menjalankan data skala produksi dari jarak jauh

  • Jalankan pada cluster EKS Anda sendiri dengan kontrol penuh atas konfigurasi komputasi, jaringan, dan keamanan

Titik akhir Spark Connect adalah titik akhir terkelola pada cluster virtual Anda yang menghosting server Spark Connect. Saat Anda membuat titik akhir Spark Connect, Amazon EMR di EKS menyediakan driver Spark dengan server gRPC di cluster EKS Anda. PySpark Klien lokal Anda mengirim DataFrame dan operasi SQL ke driver melalui titik akhir gRPC. Untuk berinteraksi dengan titik akhir, Anda mendapatkan kredenSIAL sesi menggunakan GetManagedEndpointSessionCredentials API. Setiap titik akhir mendukung beberapa sesi bersamaan.

Prasyarat

Sebelum Anda membuat titik akhir Spark Connect, pastikan Anda memiliki yang berikut ini.

Persyaratan berikut khusus untuk titik akhir Spark Connect:

  • Cluster EKS dengan setidaknya satu subnet pribadi. Untuk merutekan lalu lintas gRPC ke titik akhir, Spark Connect menyediakan Network Load Balancer (NLB) internal, yang memerlukan subnet pribadi di VPC Anda. NLB bersifat internal dan tidak terpapar ke internet publik.

  • Lo AWS ad Balancer Controller diinstal pada cluster EKS Anda, sehingga Amazon EMR di EKS dapat menyediakan NLB internal. Untuk petunjuk, lihat Meng instal Pengontrol Penye AWS imbang Beban.

Anda juga memerlukan Amazon EMR standar berikut pada sumber daya EKS. Jika Anda sudah menjalankan pekerjaan di Amazon EMR di EKS, Anda mungkin memiliki ini:

Izin yang diperlukan

Tambahkan izin berikut ke peran IAM Anda untuk membuat dan berinteraksi dengan titik akhir Spark Connect:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EMRContainersEndpointAccess", "Effect": "Allow", "Action": [ "emr-containers:CreateManagedEndpoint", "emr-containers:DescribeManagedEndpoint", "emr-containers:DeleteManagedEndpoint", "emr-containers:ListManagedEndpoints", "emr-containers:GetManagedEndpointSessionCredentials" ], "Resource": [ "arn:aws:emr-containers:region:account-id:/virtualclusters/virtual-cluster-id", "arn:aws:emr-containers:region:account-id:/virtualclusters/virtual-cluster-id/endpoints/*" ] }, { "Sid": "PassRoleToEKSPodIdentity", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/ExecutionRole", "Condition": { "StringEquals": { "iam:PassedToService": "pods.eks.amazonaws.com" }, "ArnLike": { "iam:AssociatedResourceARN": [ "arn:aws:eks:region:account-id:cluster/eks-cluster-name" ] } } } ] }

Membuat konfigurasi keamanan

Titik akhir Spark Connect memerlukan konfigurasi keamanan yang terkait dengan cluster virtual Anda. Konfigurasi keamanan menentukan pengaturan otentikasi dan otorisasi untuk titik akhir, dan menentukan namespace sistem tempat infrastruktur Spark Connect berjalan.

catatan

Setiap konfigurasi keamanan memiliki hubungan satu-ke-satu dengan cluster virtual. Anda tidak dapat menggunakan kembali konfigurasi keamanan yang sama di beberapa cluster virtual.

Buat konfigurasi keamanan dengan namespace sistem:

aws emr-containers create-security-configuration \ --name "security-config-name" \ --security-configuration-data '{ "authenticationConfiguration": { "identityCenterConfiguration": { "enableIdentityCenter": false } } }' \ --container-provider '{ "type": "EKS", "id": "eks-cluster-name", "info": { "eksInfo": { "namespace": "system-namespace" } } }'

namespaceDalam konfigurasi keamanan adalah namespace sistem tempat komponen infrastruktur Spark Connect berjalan. Ini terpisah dari namespace pengguna yang ditentukan saat membuat cluster virtual.

Buat cluster virtual dengan Spark Connect diaktifkan

Buat cluster virtual yang terkait dengan konfigurasi keamanan. Anda harus sessionEnabled mengatur true dan memberikan securityConfigurationId dari langkah sebelumnya.

aws emr-containers create-virtual-cluster \ --name "virtual-cluster-name" \ --container-provider '{ "type": "EKS", "id": "eks-cluster-name", "info": { "eksInfo": { "namespace": "user-namespace" } } }' \ --security-configuration-id SECURITY_CONFIGURATION_ID \ --session-enabled true
penting

--security-configuration-id— Mengaitkan cluster virtual ini dengan konfigurasi keamanan yang dibuat pada langkah sebelumnya. Ini diperlukan untuk titik akhir Spark Connect.

--session-enabled- Mengaktifkan dukungan titik akhir Spark Connect pada cluster virtual. Tanpa tanda ini, Anda tidak dapat membuat titik akhir Spark Connect di cluster virtual ini.

Membuat titik akhir Spark Connect

Setelah membuat konfigurasi keamanan, buat titik akhir terkelola Spark Connect di cluster virtual Anda.

catatan

Titik akhir Spark Connect pertama pada cluster EKS membutuhkan waktu lebih lama untuk menjadi ACTIVE daripada yang berikutnya. Untuk titik akhir pertama pada cluster EKS, Amazon EMR di EKS menyediakan komponen jaringan bersama yang digunakan untuk konektivitas — Network Load Balancer (NLB) internal, titik akhir antarmuka VPC (), dan penyebaran router Envoy satu kali (dalam spark-connect-router namespace AWS PrivateLink) yang merutekan lalu lintas gRPC ke titik akhir — yang dapat memakan waktu beberapa menit. Komponen-komponen ini dibuat hanya sekali per kluster EKS dan digunakan kembali oleh semua titik akhir selanjutnya di cluster itu, sehingga titik akhir berikutnya mulai lebih cepat.

aws emr-containers create-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --name "spark-connect-endpoint" \ --type "SPARK_CONNECT" \ --release-label "emr-7.14.0-latest" \ --execution-role-arn "arn:aws:iam::account-id:role/ExecutionRole" \ --session-idle-timeout-in-minutes 60
catatan

Secara default, titik akhir yang dikelola Spark Connect dimulai dengan 2 eksekutor. Jika Anda tidak memberikan penggantian konfigurasi, titik akhir menggunakan default ini. Untuk menjalankan dengan jumlah eksekutor yang berbeda, atur spark.executor.instances penggantian konfigurasi, seperti yang ditunjukkan pada contoh berikut.

Contoh berikut mencakup penggantian konfigurasi Spark dengan alokasi dinamis dan konfigurasi pemantauan untuk mengekspor log Spark ke Amazon S3:

aws emr-containers create-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --name "spark-connect-endpoint" \ --type "SPARK_CONNECT" \ --release-label "emr-7.14.0-latest" \ --execution-role-arn "arn:aws:iam::account-id:role/ExecutionRole" \ --session-idle-timeout-in-minutes 60 \ --configuration-overrides '{ "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.driver.memory": "4g", "spark.executor.memory": "4g", "spark.executor.cores": "2", "spark.executor.instances": "3", "spark.dynamicAllocation.enabled": "true", "spark.dynamicAllocation.minExecutors": "3", "spark.dynamicAllocation.maxExecutors": "5" } } ], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://your-bucket/spark-connect-logs/" }, "persistentAppUI": "ENABLED" } }'

Pantau status titik akhir:

aws emr-containers describe-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --id ENDPOINT_ID

Tunggu hingga status titik akhir ACTIVE sebelum menghubungkan.

Menghubungkan ke titik akhir Spark Connect

Setelah titik akhir aktif, dapatkan kredentif sesi dan sambungkan dari PySpark klien.

Untuk menyambung ke titik akhir Spark Connect
  1. Dapatkan URL proxy autentikasi dari deskripsi titik akhir:

    aws emr-containers describe-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --id ENDPOINT_ID

    Respons mencakup authProxyUrl bidang ketika titik akhir adalahACTIVE.

  2. Dapatkan token sesi untuk titik akhir:

    aws emr-containers get-managed-endpoint-session-credentials \ --virtual-cluster-identifier VIRTUAL_CLUSTER_ID \ --endpoint-identifier ENDPOINT_ID \ --execution-role-arn "arn:aws:iam::account-id:role/ExecutionRole" \ --credential-type "TOKEN"

    Tanggapan termasuk token sesi:

    { "id": "SESSION_ID", "credentials": { "token": "SESSION_TOKEN" }, "endpointCredentials": { "token": "ENDPOINT_CREDENTIALS_TOKEN" }, "expiresAt": "EXPIRY_TIME" }

    Gunakan credentials.token nilai sebagai x-aws-proxy-auth parameter saat menghubungkan ke URL proxy autentikasi.

  3. Instal PySpark klien yang cocok dengan versi Spark di titik akhir Anda (Spark 3.5.8 untukemr-7.14.0, Spark 4.1.1 untukemr-spark-8.1.0):

    # For emr-7.14.0 pip install pyspark[connect]==3.5.8 # For emr-spark-8.1.0 pip install pyspark[connect]==4.1.1 pip install boto3
  4. Hubungkan dari PySpark menggunakan URL proxy autentikasi dan token sesi:

    from pyspark.sql import SparkSession # Use the authProxyUrl from DescribeManagedEndpoint # and the credentials.token from GetManagedEndpointSessionCredentials connect_url = f"{auth_proxy_url}/;use_ssl=true;x-aws-proxy-auth={token}" spark = SparkSession.builder.remote(connect_url).getOrCreate() print(f"Connected. Spark version: {spark.version}") # Run queries spark.sql("SELECT 1+1 AS result").show() # When finished, disconnect the client spark.stop()

Skrip Python berikut memperoleh URL proxy autentikasi dan token sesi, lalu terhubung ke titik akhir Spark Connect:

import boto3 from pyspark.sql import SparkSession from pyspark.sql.functions import col REGION = 'REGION' VIRTUAL_CLUSTER_ID = 'VIRTUAL_CLUSTER_ID' ENDPOINT_ID = 'ENDPOINT_ID' EXECUTION_ROLE = 'arn:aws:iam::account-id:role/ExecutionRole' client = boto3.client('emr-containers', region_name=REGION) # Get the auth proxy URL from DescribeManagedEndpoint endpoint_response = client.describe_managed_endpoint( virtualClusterId=VIRTUAL_CLUSTER_ID, id=ENDPOINT_ID ) auth_proxy_url = endpoint_response['endpoint']['authProxyUrl'] # Get session token creds_response = client.get_managed_endpoint_session_credentials( virtualClusterIdentifier=VIRTUAL_CLUSTER_ID, endpointIdentifier=ENDPOINT_ID, executionRoleArn=EXECUTION_ROLE, credentialType='TOKEN' ) token = creds_response['credentials']['token'] # Connect via Spark Connect using auth proxy URL and credentials token connect_url = f"{auth_proxy_url}/;use_ssl=true;x-aws-proxy-auth={token}" spark = SparkSession.builder.remote(connect_url).getOrCreate() print(f"Connected. Spark version: {spark.version}") # Run DataFrame operations df = spark.range(100).withColumn("squared", col("id") * col("id")) df.show(10) print(f"Count: {df.count()}") spark.stop()

Pertimbangan dan batasan

Pertimbangkan hal berikut saat menjalankan beban kerja interaktif melalui Spark Connect di Amazon EMR di EKS.

  • Spark Connect didukung dengan Amazon EMR pada rilis EKS emr-7.14.0 dan yang lebih baru, atau yang lebih emr-spark-8.1.0 baru.

  • Spark Connect mendukung DataFrame dan SQL API diPySpark. Spark Connect tidak mendukung RDD-based API.

  • Token sesi terbatas waktu. Ketika token kedaluwarsa, panggilan gRPC gagal dengan kesalahan otentikasi. Panggil GetManagedEndpointSessionCredentials untuk mendapatkan token baru dan buat yang baru SparkSession dengan token yang diperbarui.

  • Setiap konfigurasi keamanan memiliki hubungan satu-ke-satu dengan cluster virtual. Anda tidak dapat berbagi konfigurasi keamanan di beberapa cluster virtual.

  • Anda harus menghapus semua titik akhir menggunakan konfigurasi keamanan sebelum Anda dapat menghapus konfigurasi keamanan.

  • PySpark Versi yang diinstal secara lokal harus sesuai dengan versi Apache Spark pada titik akhir Anda (Spark 3.5.8 untukemr-7.14.0, Spark 4.1.1 untukemr-spark-8.1.0). Ketidakcocokan versi menyebabkan kesalahan koneksi atau perilaku tak terduga.

  • Jenis titik akhir Spark Connect adalahSPARK_CONNECT. Ini berbeda dari titik akhir interaktif Livy (tipeJUPYTER_ENTERPRISE_GATEWAY).

  • sessionIdleTimeoutInMinutesParameter mengontrol berapa lama sesi idle bertahan sebelum penghentian otomatis. Defaultnya adalah 60 menit.

  • Titik akhir Spark Connect tidak mendukung Propagasi Identitas Tepercaya.

  • Titik akhir Spark Connect belum mendukung kontrol akses berbutir halus (FGAC) Lake Formation. Untuk menerapkan kontrol akses, gunakan peran eksekusi IAM yang terkait dengan titik akhir.

  • Titik akhir Spark Connect menggunakan Network Load Balancer (NLB) untuk merutekan lalu lintas gRPC. NLB dibuat saat titik akhir Spark Connect pertama dibuat dan hanya dihapus ketika cluster virtual yang diaktifkan sesi terakhir dihapus. Amazon EMR di EKS juga menjalankan router Envoy tunggal (dalam spark-connect-router namespace, satu per cluster EKS) yang merutekan lalu lintas gRPC ke titik akhir; itu dibuat dengan titik akhir Spark Connect pertama dan dihentikan ketika cluster virtual yang diaktifkan sesi terakhir dihapus. Anda bertanggung jawab atas biaya NLB dan komputasi EKS yang dikonsumsi oleh router Envoy saat ada, selain sumber daya komputasi EKS yang dikonsumsi oleh driver Spark dan pelaksana selama sesi Anda.

  • Python UDF (@udf,spark.udf.register) memerlukan versi minor Python lokal untuk mencocokkan versi pekerja jarak jauh, atau gagal. PYTHON_VERSION_MISMATCH Built-in Fungsi dan DataFrame operasi SQL tidak memerlukan kecocokan versi Python.