View a markdown version of this page

Jalankan sesi interaktif dengan Amazon EMR Tanpa Server 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 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 sebagaiResource.

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
  1. 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}'
  2. 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-id APPLICATION_ID
  3. Gunakan perintah berikut untuk memeriksa status aplikasi Anda. Setelah status menjadiSTARTED, mulailah sesi.

    aws emr-serverless get-application \ --application-id APPLICATION_ID
  4. Mulai sesi dengan peran eksekusi IAM yang memberikan akses ke data Anda.

    aws emr-serverless start-session \ --application-id APPLICATION_ID \ --execution-role-arn arn:aws:iam::account-id:role/EMRServerlessExecutionRole
  5. Pantau status sesi menggunakan get-session API dan tunggu sesi masuk STARTED atau IDLE status.

    aws emr-serverless get-session \ --application-id APPLICATION_ID \ --session-id SESSION_ID
  6. Ambil titik akhir Spark Connect dan token otentikasi. URL titik akhir yang dikembalikan oleh GetSessionEndpoint tidak menyertakan nomor port. Saat membangun URL sc:// 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-id APPLICATION_ID \ --session-id SESSION_ID

    Tanggapan mencakup URL titik akhir dan token otentikasi:

    { "endpoint": "ENDPOINT_URL", "authToken": "AUTH_TOKEN", "authTokenExpiresAt": "AUTH_TOKEN_EXPIRY_TIME" }
  7. 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.0 dan 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 GetSessionEndpoint untuk mendapatkan token baru dan buat yang baru SparkSession dengan 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, autoStopConfig aktif untuk aplikasi. Aplikasi berhenti secara otomatis setelah 15 menit tanpa sesi aktif atau pekerjaan berjalan. Anda dapat mengubah konfigurasi ini sebagai bagian dari create-application atau update-application permintaan 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.0 Ketidakcocokan versi menyebabkan ImportError atau 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.address dicadangkan 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 Sparkstart-session, atur runtimeConfiguration di bawah --configuration-overrides parameter. start-job-runAPI menggunakan sebagai applicationConfiguration gantinya.