Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggunakan templat pod
Dimulai dengan Amazon EMR versi 5.33.0 atau 6.3.0, EMR Amazon EKS mendukung fitur template pod Spark. Sebuah pod adalah sekelompok satu atau lebih kontainer, dengan penyimpanan bersama dan sumber daya jaringan, dan spesifikasi cara menjalankan kontainer. Templat pod adalah spesifikasi yang menentukan cara menjalankan setiap pod. Anda dapat menggunakan file templat pod untuk menentukan konfigurasi driver atau pelaksana pod yang tidak didukung konfigurasi Spark. Untuk informasi selengkapnya tentang fitur templat pod Spark, lihat Templat Pod
catatan
Fitur templat pod hanya bekerja dengan driver dan pelaksana pod. Anda tidak dapat mengonfigurasi pod pengirim pekerjaan menggunakan templat pod.
Skenario umum
Anda dapat menentukan cara menjalankan pekerjaan Spark di EKS cluster bersama dengan menggunakan templat pod dengan Amazon EKS dan EMR menghemat biaya serta meningkatkan pemanfaatan dan kinerja sumber daya.
-
Untuk mengurangi biaya, Anda dapat menjadwalkan tugas driver Spark untuk dijalankan di Instans EC2 Sesuai Permintaan Amazon sambil menjadwalkan tugas pelaksana Spark untuk dijalankan di Instans Spot Amazon. EC2
-
Untuk meningkatkan pemanfaatan sumber daya, Anda dapat mendukung beberapa tim yang menjalankan beban kerja mereka di klaster yang samaEKS. Setiap tim akan mendapatkan grup EC2 node Amazon yang ditunjuk untuk menjalankan beban kerja mereka. Anda dapat menggunakan templat pod untuk menerapkan toleransi yang sesuai untuk beban kerja mereka.
-
Untuk meningkatkan pemantauan, Anda dapat menjalankan kontainer pencatatan terpisah untuk meneruskan log pada aplikasi pemantauan yang ada.
Sebagai contoh, file templat pod berikut menunjukkan skenario penggunaan umum.
apiVersion: v1 kind: Pod spec: volumes: - name: source-data-volume emptyDir: {} - name: metrics-files-volume emptyDir: {} nodeSelector: eks.amazonaws.com/nodegroup: emr-containers-nodegroup containers: - name: spark-kubernetes-driver # This will be interpreted as driver Spark main container env: - name: RANDOM value: "random" volumeMounts: - name: shared-volume mountPath: /var/data - name: metrics-files-volume mountPath: /var/metrics/data - name: custom-side-car-container # Sidecar container image: <side_car_container_image> env: - name: RANDOM_SIDECAR value: random volumeMounts: - name: metrics-files-volume mountPath: /var/metrics/data command: - /bin/sh - '-c' - <command-to-upload-metrics-files> initContainers: - name: spark-init-container-driver # Init container image: <spark-pre-step-image> volumeMounts: - name: source-data-volume # Use EMR predefined volumes mountPath: /var/data command: - /bin/sh - '-c' - <command-to-download-dependency-jars>
Templat pod menyelesaikan tugas berikut:
-
Tambahkan kontainer init
baru yang dieksekusi sebelum kontainer utama Spark dimulai. Wadah init berbagi EmptyDirvolume yang disebut source-data-volume
dengan wadah utama Spark. Anda dapat meminta kontainer init Anda menjalankan langkah inisialisasi, seperti mengunduh dependensi atau menghasilkan data input. Kemudian kontainer utama Spark mengkonsumsi data. -
Tambahkan kontainer sidecar
lain yang dieksekusi bersama dengan kontainer utama Spark. Kedua kontainer berbagi volume EmptyDir
lain yang disebutmetrics-files-volume
. Tugas Spark Anda dapat menghasilkan metrik, seperti metrik Prometheus. Kemudian tugas Spark dapat menempatkan metrik ke dalam file dan meminta kontainer sidecar mengunggah file ke sistem BI Anda sendiri untuk analisis di masa mendatang. -
Tambahkan variabel lingkungan baru ke kontainer utama Spark. Anda dapat meminta tugas Anda mengkonsumsi variabel lingkungan.
-
Definisikan sebuah simpul pemilih
, sehingga pod hanya dijadwalkan pada grup simpul emr-containers-nodegroup
. Hal ini membantu untuk mengisolasi sumber daya komputasi di seluruh tugas dan tim.
Mengaktifkan template pod dengan Amazon di EMR EKS
Untuk mengaktifkan fitur template pod dengan EMR Amazon aktifEKS, konfigurasikan properti Spark spark.kubernetes.driver.podTemplateFile
dan arahkan spark.kubernetes.executor.podTemplateFile
ke file template pod di Amazon S3. Spark kemudian mengunduh file templat pod dan menggunakannya untuk membangun driver dan pod pelaksana.
catatan
Spark menggunakan peran eksekusi tugas untuk memuat templat pod, sehingga peran eksekusi pekerjaan harus memiliki izin untuk mengakses Amazon S3 untuk memuat templat pod. Untuk informasi selengkapnya, lihat Untuk membuat peran eksekusi tugas.
Anda dapat menggunakan SparkSubmitParameters
untuk menentukan path Amazon S3 ke template pod, seperti yang ditunjukkan oleh JSON file job run berikut.
{ "name": "myjob", "virtualClusterId": "123456", "executionRoleArn": "iam_role_name_for_job_execution", "releaseLabel": "
release_label
", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "entryPoint_location", "entryPointArguments": ["argument1
", "argument2
", ...], "sparkSubmitParameters": "--class <main_class> \ --conf spark.kubernetes.driver.podTemplateFile=s3://path_to_driver_pod_template
\ --conf spark.kubernetes.executor.podTemplateFile=s3://path_to_executor_pod_template
\ --conf spark.executor.instances=2 \ --conf spark.executor.memory=2G \ --conf spark.executor.cores=2 \ --conf spark.driver.cores=1" } } }
Atau, Anda dapat menggunakan configurationOverrides
untuk menentukan path Amazon S3 ke template pod, seperti yang ditunjukkan oleh JSON file job run berikut.
{ "name": "myjob", "virtualClusterId": "123456", "executionRoleArn": "iam_role_name_for_job_execution", "releaseLabel": "
release_label
", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "entryPoint_location", "entryPointArguments": ["argument1
", "argument2
", ...], "sparkSubmitParameters": "--class <main_class> \ --conf spark.executor.instances=2 \ --conf spark.executor.memory=2G \ --conf spark.executor.cores=2 \ --conf spark.driver.cores=1" } }, "configurationOverrides": { "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.driver.memory":"2G", "spark.kubernetes.driver.podTemplateFile":"s3://path_to_driver_pod_template
", "spark.kubernetes.executor.podTemplateFile":"s3://path_to_executor_pod_template
" } } ] } }
catatan
-
Anda harus mengikuti pedoman keamanan saat menggunakan fitur template pod dengan EMR Amazon aktifEKS, seperti mengisolasi kode aplikasi yang tidak tepercaya. Untuk informasi selengkapnya, lihat Praktik terbaik keamanan Amazon EMR di EKS.
-
Anda tidak dapat mengubah nama kontainer utama Spark dengan menggunakan
spark.kubernetes.driver.podTemplateContainerName
danspark.kubernetes.executor.podTemplateContainerName
, karena nama-nama ini di-hardcode sebagaispark-kubernetes-driver
danspark-kubernetes-executors
. Jika Anda ingin menyesuaikan kontainer utama Spark, Anda harus menentukan kontainer dalam templat pod dengan nama-nama di-hardcode ini.
Bidang templat pod
Pertimbangkan batasan bidang berikut saat mengonfigurasi template pod dengan EMR Amazon EKS aktif.
-
Amazon EMR on hanya EKS mengizinkan bidang berikut dalam template pod untuk mengaktifkan penjadwalan pekerjaan yang tepat.
Ini adalah bidang tingkat pod yang diizinkan:
-
apiVersion
-
kind
-
metadata
-
spec.activeDeadlineSeconds
-
spec.affinity
-
spec.containers
-
spec.enableServiceLinks
-
spec.ephemeralContainers
-
spec.hostAliases
-
spec.hostname
-
spec.imagePullSecrets
-
spec.initContainers
-
spec.nodeName
-
spec.nodeSelector
-
spec.overhead
-
spec.preemptionPolicy
-
spec.priority
-
spec.priorityClassName
-
spec.readinessGates
-
spec.runtimeClassName
-
spec.schedulerName
-
spec.subdomain
-
spec.terminationGracePeriodSeconds
-
spec.tolerations
-
spec.topologySpreadConstraints
-
spec.volumes
Ini adalah bidang tingkat kontainer utama Spark yang diizinkan:
-
env
-
envFrom
-
name
-
lifecycle
-
livenessProbe
-
readinessProbe
-
resources
-
startupProbe
-
stdin
-
stdinOnce
-
terminationMessagePath
-
terminationMessagePolicy
-
tty
-
volumeDevices
-
volumeMounts
-
workingDir
Saat Anda menggunakan bidang yang tidak diizinkan dalam templat pod, Spark melempar pengecualian dan tugas gagal. Contoh berikut menunjukkan pesan kesalahan dalam log pengendali Spark karena bidang tidak diizinkan.
Executor pod template validation failed. Field container.command in Spark main container not allowed but specified.
-
-
EMRAmazon EKS telah menentukan parameter berikut dalam template pod. Bidang yang Anda tentukan dalam templat pod tidak boleh tumpang tindih dengan bidang ini.
Ini adalah nama volume yang telah ditetapkan:
-
emr-container-communicate
-
config-volume
-
emr-container-application-log-dir
-
emr-container-event-log-dir
-
temp-data-dir
-
mnt-dir
-
home-dir
-
emr-container-s3
Ini adalah pemasangan volume yang telah ditetapkan yang hanya berlaku untuk kontainer utama Spark:
-
Nama:
emr-container-communicate
; MountPath:/var/log/fluentd
-
Nama:
emr-container-application-log-dir
; MountPath:/var/log/spark/user
-
Nama:
emr-container-event-log-dir
; MountPath:/var/log/spark/apps
-
Nama:
mnt-dir
; MountPath:/mnt
-
Nama:
temp-data-dir
; MountPath:/tmp
-
Nama:
home-dir
; MountPath:/home/hadoop
Ini adalah variabel lingkungan yang telah ditetapkan yang hanya berlaku untuk kontainer utama Spark:
-
SPARK_CONTAINER_ID
-
K8S_SPARK_LOG_URL_STDERR
-
K8S_SPARK_LOG_URL_STDOUT
-
SIDECAR_SIGNAL_FILE
catatan
Anda masih dapat menggunakan volume standar yang telah ditentukan ini dan memasangnya ke kontainer sidecar tambahan Anda. Misalnya, Anda dapat menggunakan
emr-container-application-log-dir
dan memasangnya ke kontainer sidecar Anda sendiri yang didefinisikan dalam templat pod.Jika bidang yang Anda tentukan bertentangan dengan salah satu bidang yang telah ditetapkan dalam templat pod, Spark melempar pengecualian dan tugas gagal. Contoh berikut menunjukkan pesan kesalahan dalam log aplikasi Spark karena bertentangan dengan bidang yang telah ditentukan.
Defined volume mount path on main container must not overlap with reserved mount paths: [<reserved-paths>]
-
Pertimbangan kontainer sidecar
Amazon EMR mengontrol siklus hidup pod yang disediakan oleh Amazon. EMR EKS Kontainer sidecar harus mengikuti siklus hidup yang sama dengan kontainer utama Spark. Jika Anda menyuntikkan kontainer sidecar tambahan ke dalam pod Anda, sebaiknya Anda mengintegrasikan dengan manajemen siklus hidup pod yang didefinisikan EMR Amazon sehingga container sespan dapat berhenti sendiri ketika container utama Spark keluar.
Untuk mengurangi biaya, sebaiknya Anda menerapkan proses yang mencegah driver pod dengan kontainer sidecar terus berjalan setelah tugas Anda selesai. Driver Spark menghapus pod pelaksana saat pelaksana selesai. Namun, ketika program driver selesai, kontainer sidecar tambahan terus berjalan. Pod ditagih sampai EMR Amazon EKS membersihkan pod driver, biasanya kurang dari satu menit setelah kontainer utama driver Spark selesai. Untuk mengurangi biaya, Anda dapat mengintegrasikan container sespan tambahan dengan mekanisme manajemen siklus hidup yang EKS ditentukan EMR Amazon untuk pod driver dan executor, seperti yang dijelaskan di bagian berikut.
Kontainer utama Spark dalam driver dan pelaksana pod mengirimkan heartbeat
ke /var/log/fluentd/main-container-terminated
file setiap dua detik. Dengan menambahkan mount emr-container-communicate
volume yang EMR telah ditentukan Amazon ke container sidecar Anda, Anda dapat menentukan sub-proses container sespan Anda untuk secara berkala melacak waktu modifikasi terakhir untuk file ini. Sub-proses kemudian berhenti sendiri jika menemukan bahwa kontainer utama Spark menghentikan heartbeat
untuk durasi yang lebih lama.
Contoh berikut menunjukkan sub-proses yang melacak file detak jantung dan berhenti sendiri. Ganti your_volume_mount
dengan jalur tempat Anda memasang volume yang telah ditentukan. Script dipaketkan di dalam gambar yang digunakan oleh kontainer sidecar. Dalam file templat pod, Anda dapat menentukan kontainer sidecar dengan perintah sub_process_script.sh
dan main_command
berikut.
MOUNT_PATH="
your_volume_mount
" FILE_TO_WATCH="$MOUNT_PATH/main-container-terminated" INITIAL_HEARTBEAT_TIMEOUT_THRESHOLD=60 HEARTBEAT_TIMEOUT_THRESHOLD=15 SLEEP_DURATION=10 function terminate_main_process() { # Stop main process } # Waiting for the first heartbeat sent by Spark main container echo "Waiting for file $FILE_TO_WATCH to appear..." start_wait=$(date +%s) while ! [[ -f "$FILE_TO_WATCH" ]]; do elapsed_wait=$(expr $(date +%s) - $start_wait) if [ "$elapsed_wait" -gt "$INITIAL_HEARTBEAT_TIMEOUT_THRESHOLD" ]; then echo "File $FILE_TO_WATCH not found after $INITIAL_HEARTBEAT_TIMEOUT_THRESHOLD seconds; aborting" terminate_main_process exit 1 fi sleep $SLEEP_DURATION; done; echo "Found file $FILE_TO_WATCH; watching for heartbeats..." while [[ -f "$FILE_TO_WATCH" ]]; do LAST_HEARTBEAT=$(stat -c %Y $FILE_TO_WATCH) ELAPSED_TIME_SINCE_AFTER_HEARTBEAT=$(expr $(date +%s) - $LAST_HEARTBEAT) if [ "$ELAPSED_TIME_SINCE_AFTER_HEARTBEAT" -gt "$HEARTBEAT_TIMEOUT_THRESHOLD" ]; then echo "Last heartbeat to file $FILE_TO_WATCH was more than $HEARTBEAT_TIMEOUT_THRESHOLD seconds ago at $LAST_HEARTBEAT; terminating" terminate_main_process exit 0 fi sleep $SLEEP_DURATION; done; echo "Outside of loop, main-container-terminated file no longer exists" # The file will be deleted once the fluentd container is terminated echo "The file $FILE_TO_WATCH doesn't exist any more;" terminate_main_process exit 0