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 Tanpa Server melalui Spark Connect
Dengan rilis Amazon EMR emr-7.13.0 dan yang lebih baru, Anda dapat terhubung ke aplikasi Amazon EMR Serverless dari PySpark klien yang dikelola sendiri seperti VS Code, PyCharm, dan notebook Jupyter menggunakan API sesi EMR Serverless dengan Apache Spark Connect. 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 pada komputasi Tanpa Server EMR. Spark Connect menawarkan manfaat berikut:
-
Sambungkan ke EMR Serverless dari PySpark klien apa pun, termasuk VS Code, PyCharm, dan notebook Jupyter.
-
Tetapkan breakpoint dan langkah melalui PySpark kode di IDE Anda saat DataFrames menjalankan data skala produksi dari jarak jauh.
Sesi Spark Connect adalah koneksi terkelola antara PySpark klien lokal Anda dan driver Spark yang berjalan di Amazon EMR Serverless. Saat Anda memulai sesi, EMR Serverless menyediakan driver Spark dan pelaksana atas nama Anda. Klien lokal Anda mengirim DataFrame dan operasi SQL ke driver, dan driver menjalankannya dari jarak jauh. Sesi berlanjut sampai Anda menghentikannya atau mencapai batas waktu idle, sehingga Anda dapat menjalankan beberapa kueri secara interaktif tanpa memulai ulang Spark. Setiap sesi memiliki URL titik akhir dan token otentikasi sendiri yang Anda gunakan untuk terhubung.
Izin yang diperlukan
Selain izin yang diperlukan untuk mengakses Amazon EMR Serverless, tambahkan juga izin berikut ke peran IAM Anda untuk mengakses titik akhir Spark Connect dan mengelola sesi Spark Connect:
emr-serverless:StartSession-
Memberikan izin untuk membuat sesi Spark Connect pada aplikasi yang Anda tentukan sebagai
Resource. emr-serverless:GetSessionEndpoint-
Memberikan izin untuk mengambil URL titik akhir Spark Connect dan token otentikasi untuk sesi.
emr-serverless:GetSession-
Memberikan izin untuk mendapatkan status sesi.
emr-serverless:ListSessions-
Memberikan izin untuk membuat daftar sesi pada aplikasi.
emr-serverless:TerminateSession-
Memberikan izin untuk mengakhiri sesi.
iam:PassRole-
Memberikan izin untuk mengakses peran eksekusi IAM saat membuat sesi Spark Connect. Amazon EMR Serverless menggunakan peran ini untuk menjalankan beban kerja Anda.
emr-serverless:GetResourceDashboard-
Memberikan izin untuk menghasilkan URL UI Spark dan menyediakan akses ke log untuk sesi tersebut.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EMRServerlessApplicationLevelAccess", "Effect": "Allow", "Action": [ "emr-serverless:StartSession", "emr-serverless:ListSessions" ], "Resource": [ "arn:aws:emr-serverless:us-east-1:111122223333:/applications/application-id" ] }, { "Sid": "EMRServerlessSessionLevelAccess", "Effect": "Allow", "Action": [ "emr-serverless:GetSession", "emr-serverless:GetSessionEndpoint", "emr-serverless:TerminateSession", "emr-serverless:GetResourceDashboard" ], "Resource": [ "arn:aws:emr-serverless:us-east-1:111122223333:/applications/application-id/sessions/*" ] }, { "Sid": "EMRServerlessRuntimeRoleAccess", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::111122223333:role/EMRServerlessExecutionRole" ], "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }
Bekerja dengan sesi interaktif
Untuk membuat Connect-enabled aplikasi Spark dan menghubungkannya, ikuti langkah-langkah ini.
Untuk memulai sesi Spark Connect
-
Buat aplikasi dengan sesi Spark Connect.
aws emr-serverless create-application \ --type "SPARK" \ --name "spark-connect-app" \ --release-label emr-7.13.0 \ --interactive-configuration '{"sessionEnabled": true}' -
Setelah Amazon EMR Serverless membuat aplikasi Anda, mulai aplikasi jika Anda belum mengaktifkan mulai otomatis untuk menerima sesi Spark Connect.
aws emr-serverless start-application \ --application-idAPPLICATION_ID -
Gunakan perintah berikut untuk memeriksa status aplikasi Anda. Setelah status menjadi
STARTED, mulailah sesi.aws emr-serverless get-application \ --application-idAPPLICATION_ID -
Mulai sesi dengan peran eksekusi IAM yang memberikan akses ke data Anda.
aws emr-serverless start-session \ --application-idAPPLICATION_ID\ --execution-role-arn arn:aws:iam::account-id:role/EMRServerlessExecutionRole -
Pantau status sesi menggunakan
get-sessionAPI dan tunggu sesi masukSTARTEDatauIDLEstatus.aws emr-serverless get-session \ --application-idAPPLICATION_ID\ --session-idSESSION_ID -
Ambil titik akhir Spark Connect dan token otentikasi. URL titik akhir yang dikembalikan oleh
GetSessionEndpointtidak menyertakan nomor port. Saat membangun URLsc://koneksi, Anda harus menambahkan:443- misalnya,sc://hostname:443/;use_ssl=true;x-aws-proxy-auth=token. Tanpa itu, PySpark klien default ke port 15002, yang tidak dapat dijangkau di EMR Serverless.aws emr-serverless get-session-endpoint \ --application-idAPPLICATION_ID\ --session-idSESSION_IDTanggapan mencakup URL titik akhir dan token otentikasi:
{ "endpoint": "ENDPOINT_URL", "authToken": "AUTH_TOKEN", "authTokenExpiresAt": "AUTH_TOKEN_EXPIRY_TIME" } -
Setelah titik akhir siap, sambungkan dari PySpark klien. Instal PySpark klien yang cocok dengan versi Spark pada aplikasi EMR Serverless Anda, dan AWS SDK untuk Python.
# Match the PySpark version to your EMR Serverless release version (3.5.6 for emr-7.13.0) pip install pyspark[connect]==3.5.6 pip install boto3
Berikut ini adalah contoh skrip Python untuk memulai sesi dan mengirim permintaan langsung ke titik akhir sesi:
import boto3 import time from pyspark.sql import SparkSession from pyspark.sql.functions import col client = boto3.client('emr-serverless', region_name='REGION') APPLICATION_ID = 'APPLICATION_ID' EXECUTION_ROLE = 'arn:aws:iam::account-id:role/EMRServerlessExecutionRole' # Start the session response = client.start_session( applicationId=APPLICATION_ID, executionRoleArn=EXECUTION_ROLE ) session_id = response['sessionId'] print(f"Session {session_id} starting...") # Wait for the session to be ready while True: response = client.get_session( applicationId=APPLICATION_ID, sessionId=session_id ) state = response['session']['state'] print(f"Session state: {state}") if state in ('STARTED', 'IDLE'): break if state in ('FAILED', 'TERMINATED'): raise Exception(f"Session failed: {response['session'].get('stateDetails', 'Unknown error')}") time.sleep(5) # Retrieve the Spark Connect endpoint and authentication token response = client.get_session_endpoint( applicationId=APPLICATION_ID, sessionId=session_id ) # Construct the authenticated remote URL auth_token = response['authToken'] endpoint_url = response['endpoint'] connect_url = endpoint_url.replace("https://", "sc://", 1) + ":443/;use_ssl=true;" connect_url += f"x-aws-proxy-auth={auth_token}" # Start the Spark session spark = SparkSession.builder.remote(connect_url).getOrCreate() print(f"Connected. Spark version: {spark.version}") # Run SQL spark.sql("SELECT 1+1 AS result").show() # Run DataFrame operations df = spark.range(100).withColumn("squared", col("id") * col("id")) df.show(10) print(f"Count: {df.count()}") # Stop the Spark session (disconnects the client only) spark.stop() # Terminate the EMR Serverless session to stop billing. # spark.stop() only closes the local client connection. The remote session # continues running and incurring charges until you explicitly terminate it # or it reaches the idle timeout. client.terminate_session( applicationId=APPLICATION_ID, sessionId=session_id ) print(f"Session {session_id} terminated.")
Untuk mengakses UI Spark langsung atau Server Sejarah Spark untuk sesi, gunakan GetResourceDashboard API.
response = client.get_resource_dashboard( applicationId=APPLICATION_ID, resourceId=session_id, resourceType='SESSION' ) response['url']
Saat sesi aktif, URL membuka UI Apache Spark langsung untuk pemantauan kueri, tahapan, dan pelaksana secara real-time. Setelah sesi berakhir, Server Sejarah Spark tetap tersedia untuk analisis pasca-sesi melalui konsol Amazon EMR Serverless.
Pertimbangan dan batasan
Pertimbangkan hal berikut saat menjalankan beban kerja interaktif melalui Spark Connect.
-
Spark Connect didukung dengan rilis Amazon EMR Serverless
emr-7.13.0dan yang lebih baru. -
Spark Connect hanya didukung untuk mesin Apache Spark.
-
Spark Connect mendukung DataFrame dan SQL API di PySpark. RDD-based API tidak didukung.
-
Token otentikasi terbatas waktu hingga 1 jam. Ketika token kedaluwarsa, panggilan gRPC gagal dengan kesalahan otentikasi. Panggil
GetSessionEndpointuntuk mendapatkan token baru dan buat yang baruSparkSessiondengan token yang diperbarui. -
Sesi berakhir setelah batas waktu idle yang dapat dikonfigurasi. Batas waktu default diatur ke 1 jam.
-
Setiap sesi memiliki batas keras 24 jam secara default, setelah itu secara otomatis dihentikan meskipun sedang menjalankan tugas secara aktif.
-
Setiap aplikasi EMR Serverless mendukung hingga 25 sesi bersamaan secara default. Untuk meminta kenaikan batas, hubungi AWS Dukungan.
-
Secara default,
autoStopConfigaktif untuk aplikasi. Aplikasi berhenti secara otomatis setelah 15 menit tanpa sesi aktif atau pekerjaan berjalan. Anda dapat mengubah konfigurasi ini sebagai bagian daricreate-applicationatauupdate-applicationpermintaan Anda. -
Untuk pengalaman startup terbaik, konfigurasikan kapasitas pra-inisialisasi untuk driver dan pelaksana.
-
Anda harus mengaktifkan AutoStart atau memulai aplikasi secara manual sebelum memulai sesi EMR Serverless.
-
PySpark Versi yang diinstal secara lokal harus sesuai dengan versi Apache Spark pada aplikasi Amazon EMR Serverless Anda (3.5.6 untuk).
emr-7.13.0Ketidakcocokan versi menyebabkanImportErroratau perilaku yang tidak terduga. -
Fine-grained kontrol akses melalui Lake Formation tidak didukung untuk sesi Spark Connect.
-
Propagasi Identitas Tepercaya tidak didukung untuk sesi interaktif dengan Spark Connect.
-
Penyimpanan tanpa server di EMR Serverless tidak didukung untuk sesi interaktif dengan Spark Connect.
-
Tidak ada biaya tambahan untuk menggunakan Spark Connect. Anda hanya membayar untuk sumber daya komputasi tanpa server EMR (vCPU, memori, dan penyimpanan) yang dikonsumsi selama sesi Anda.
-
Konfigurasi Spark
spark.connect.grpc.binding.addressdicadangkan oleh EMR Serverless dan tidak dapat diganti oleh pengguna. -
PySpark Paket yang Anda instal secara lokal harus sesuai dengan versi Spark pada aplikasi EMR Serverless Anda. Ketidakcocokan versi menyebabkan kesalahan koneksi. Python UDF (
@udf,spark.udf.register) juga memerlukan versi minor Python lokal untuk mencocokkan pekerja, atau gagal denganPYTHON_VERSION_MISMATCH. Built-in Fungsi dan DataFrame operasi SQL tidak memerlukan kecocokan versi Python. -
Untuk melewati konfigurasi Spark
start-session, aturruntimeConfigurationdi bawah--configuration-overridesparameter.start-job-runAPI menggunakan sebagaiapplicationConfigurationgantinya.