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 Tanpa Server dari PySpark klien yang dikelola sendiri seperti VS Code,, PyCharm dan notebook Jupyter menggunakan sesi EMR Tanpa Server dengan Apache Spark Connect. APIs 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 EMR Tanpa Server. Spark Connect menawarkan manfaat berikut:

  • Connect ke EMR Serverless dari PySpark klien mana pun, termasuk VS Code,, dan notebook Jupyter PyCharm.

  • Tetapkan breakpoint dan langkahkan PySpark kode di IDE Anda saat DataFrames dijalankan pada 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 Tanpa Server. Saat Anda memulai sesi, EMR Serverless menyediakan driver dan pelaksana Spark atas nama Anda. Klien lokal Anda mengirim DataFrame dan operasi SQL ke driver, dan driver menjalankannya dari jarak jauh. Sesi berlanjut hingga 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 Tanpa Server, 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 suatu 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 Tanpa Server menggunakan peran ini untuk menjalankan beban kerja Anda.

emr-serverless:GetResourceDashboard

Memberikan izin untuk membuat 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:region:account-id:/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:region:account-id:/applications/application-id/sessions/*" ] }, { "Sid": "EMRServerlessRuntimeRoleAccess", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::account-id:role/EMRServerlessExecutionRole" ], "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }

Bekerja dengan sesi interaktif

Untuk membuat aplikasi yang mendukung Spark Connect 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, jalankan aplikasi jika Anda belum mengaktifkan auto-start 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 endpoint yang dikembalikan oleh GetSessionEndpoint tidak menyertakan nomor port. Saat membuat 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 Tanpa Server.

    aws emr-serverless get-session-endpoint \ --application-id APPLICATION_ID \ --session-id SESSION_ID

    Responsnya mencakup URL endpoint 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 SDK untuk Python. AWS

    # 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 Riwayat Spark untuk suatu sesi, gunakan API. GetResourceDashboard

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 Tanpa Server.

Pertimbangan dan batasan

Pertimbangkan hal berikut saat menjalankan beban kerja interaktif melalui Spark Connect.

  • Spark Connect didukung dengan rilis Amazon EMR Tanpa Server emr-7.13.0 dan yang lebih baru.

  • Spark Connect hanya didukung untuk mesin Apache Spark.

  • Spark Connect mendukung DataFrame dan SQL APIs in. PySpark Berbasis RDD APIs tidak didukung.

  • Token otentikasi dibatasi waktu hingga 1 jam. Ketika token kedaluwarsa, panggilan gRPC gagal dengan kesalahan otentikasi. Hubungi 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 otomatis berakhir bahkan jika itu secara aktif menjalankan tugas.

  • Setiap aplikasi EMR Tanpa Server mendukung hingga 25 sesi bersamaan secara default. Untuk meminta kenaikan batas, hubungi AWS Support.

  • 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 update-application permintaan create-application atau 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 Tanpa Server.

  • PySpark Versi yang diinstal secara lokal harus cocok 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.

  • Kontrol akses berbutir halus 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 Tanpa Server tidak didukung untuk sesi interaktif dengan Spark Connect.

  • Tidak ada biaya tambahan untuk menggunakan Spark Connect. Anda hanya membayar untuk sumber daya komputasi EMR Tanpa Server (vCPU, memori, dan penyimpanan) yang dikonsumsi selama sesi Anda.

  • Konfigurasi Spark dicadangkan spark.connect.grpc.binding.address oleh EMR Tanpa Server dan tidak dapat diganti oleh pengguna.

  • PySpark Paket yang Anda instal secara lokal harus cocok dengan versi Spark pada aplikasi EMR Serverless Anda. Ketidakcocokan versi menyebabkan kesalahan koneksi. Python UDFs (@udf,spark.udf.register) juga memerlukan versi minor Python lokal untuk mencocokkan pekerja, atau gagal. PYTHON_VERSION_MISMATCH Fungsi dan DataFrame operasi SQL bawaan tidak memerlukan kecocokan versi Python.

  • Untuk meneruskan konfigurasi Spark denganstart-session, atur runtimeConfiguration di bawah parameter. --configuration-overrides start-job-runAPI menggunakan applicationConfiguration sebagai gantinya.