Intinya
API AWS EMR (Elastic MapReduce) mengelola klaster big data yang menjalankan Hadoop, Spark, Hive, dan Presto. Anda membuat klaster, mengirimkan pekerjaan sebagai langkah-langkah, melakukan auto-scaling berdasarkan beban kerja, dan menghentikan ketika selesai. Autentikasi menggunakan AWS IAM. Untuk pengujian, gunakan Apidog untuk memvalidasi konfigurasi klaster, menguji pengiriman pekerjaan terhadap struktur API, dan mendokumentasikan pipeline data Anda.
Pengantar
AWS EMR adalah layanan Hadoop/Spark terkelola di AWS. Ini memproses petabyte data untuk analitik, pembelajaran mesin, dan pipeline ETL. Alih-alih mengelola klaster Hadoop Anda sendiri, Anda membiarkan AWS menangani infrastrukturnya.
EMR berjalan di instans EC2 dalam sebuah klaster. Anda menentukan:
- Tipe instans (node master, core, task)
- Aplikasi (Spark, Hadoop, Hive, Presto, HBase)
- Tindakan bootstrap (skrip penyiapan)
- Langkah-langkah (pekerjaan yang akan dijalankan)
API EMR memungkinkan Anda mengotomatiskan semua ini. Anda dapat membuat klaster secara terprogram, mengirimkan pekerjaan, memantau kemajuan, dan berintegrasi dengan layanan AWS lainnya.
Uji API AWS dengan Apidog - gratis
Di akhir panduan ini, Anda akan dapat:
- Membuat dan mengonfigurasi klaster EMR melalui API
- Mengirimkan pekerjaan sebagai langkah-langkah
- Mengelola auto-scaling
- Memantau kesehatan klaster dan kemajuan pekerjaan
- Mengoptimalkan biaya dengan instance fleet dan spot instance
Autentikasi dengan AWS
EMR menggunakan autentikasi AWS standar dengan IAM.
Pendekatan AWS SDK (direkomendasikan)
import { EMRClient, RunJobFlowCommand } from '@aws-sdk/client-emr'
const client = new EMRClient({
region: 'us-east-1',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
})
API Langsung dengan SigV4
EMR memerlukan AWS Signature Versi 4. Gunakan SDK atau alat seperti boto3, AWS CLI, atau buat tanda tangan secara manual.
aws emr list-clusters --region us-east-1
Izin IAM
Kebijakan minimum untuk manajemen EMR:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"elasticmapreduce:*",
"ec2:Describe*",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": "*"
}
]
}
Membuat klaster
Pembuatan klaster dasar
aws emr create-cluster \
--name "My Spark Cluster" \
--release-label emr-7.0.0 \
--applications Name=Spark Name=Hadoop \
--instance-type m5.xlarge \
--instance-count 3 \
--service-role EMR_DefaultRole \
--job-flow-role EMR_EC2_DefaultRole
Melalui API (RunJobFlow)
{
"Name": "Data Processing Cluster",
"ReleaseLabel": "emr-7.0.0",
"Applications": [
{ "Name": "Spark" },
{ "Name": "Hadoop" },
{ "Name": "Hive" }
],
"Instances": {
"MasterInstanceType": "m5.xlarge",
"SlaveInstanceType": "m5.xlarge",
"InstanceCount": 3,
"KeepJobFlowAliveWhenNoSteps": true,
"TerminationProtected": false
},
"Steps": [],
"ServiceRole": "EMR_DefaultRole",
"JobFlowRole": "EMR_EC2_DefaultRole",
"LogUri": "s3://my-bucket/emr-logs/",
"Tags": [
{ "Key": "Environment", "Value": "Production" }
]
}
Respons:
{
"JobFlowId": "j-ABC123DEF456"
}
Grup instans vs. instans fleet
Grup instans: Tipe instans tetap per grup (master, core, task).
Instans fleet: Beberapa tipe/opsi instans per grup. EMR memilih berdasarkan ketersediaan dan harga.
{
"Instances": {
"InstanceFleets": [
{
"Name": "MasterFleet",
"InstanceFleetType": "MASTER",
"TargetOnDemandCapacity": 1,
"InstanceTypeConfigs": [
{
"InstanceType": "m5.xlarge"
},
{
"InstanceType": "m4.xlarge"
}
]
},
{
"Name": "CoreFleet",
"InstanceFleetType": "CORE",
"TargetOnDemandCapacity": 2,
"TargetSpotCapacity": 4,
"InstanceTypeConfigs": [
{
"InstanceType": "m5.2xlarge"
},
{
"InstanceType": "m4.2xlarge"
}
],
"LaunchSpecifications": {
"SpotSpecification": {
"TimeoutDurationMinutes": 60,
"TimeoutAction": "SWITCH_TO_ON_DEMAND"
}
}
}
]
}
}
Mengirimkan pekerjaan sebagai langkah-langkah
EMR mengeksekusi pekerjaan sebagai "langkah-langkah" secara berurutan.
Menambahkan langkah Spark
aws emr add-steps \
--cluster-id j-ABC123DEF456 \
--steps '[
{
"Name": "Process Data",
"ActionOnFailure": "CONTINUE",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"spark-submit",
"--deploy-mode",
"cluster",
"--class",
"com.example.DataProcessor",
"s3://my-bucket/jars/processor.jar",
"s3://my-bucket/input/",
"s3://my-bucket/output/"
]
}
}
]'
Melalui API (AddJobFlowSteps)
{
"JobFlowId": "j-ABC123DEF456",
"Steps": [
{
"Name": "Spark ETL Job",
"ActionOnFailure": "CONTINUE",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"spark-submit",
"--executor-memory",
"4g",
"--executor-cores",
"2",
"s3://my-bucket/scripts/process.py",
"--input",
"s3://my-bucket/input/",
"--output",
"s3://my-bucket/output/"
]
}
}
]
}
Opsi ActionOnFailure
TERMINATE_CLUSTER: Hentikan klaster saat gagalCANCEL_AND_WAIT: Batalkan langkah-langkah yang tersisa, biarkan klaster berjalanCONTINUE: Lanjutkan ke langkah berikutnya
Langkah Hive
{
"Name": "Hive Query",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"hive-script",
"--run-hive-script",
"--args",
"-f",
"s3://my-bucket/scripts/transform.q"
]
}
}
Auto-scaling
EMR dapat menambah/menghapus node tugas berdasarkan beban.
Membuat kebijakan auto-scaling
aws emr put-auto-scaling-policy \
--cluster-id j-ABC123DEF456 \
--instance-group-id ig-ABC123 \
--auto-scaling-policy '{
"Constraints": {
"MinCapacity": 2,
"MaxCapacity": 10
},
"Rules": [
{
"Name": "ScaleOut",
"Description": "Add nodes when memory is high",
"Action": {
"SimpleScalingPolicyConfiguration": {
"AdjustmentType": "CHANGE_IN_CAPACITY",
"ScalingAdjustment": 2,
"CoolDown": 300
}
},
"Trigger": {
"CloudWatchAlarmDefinition": {
"ComparisonOperator": "GREATER_THAN",
"EvaluationPeriods": 3,
"MetricName": "MemoryAvailableMB",
"Namespace": "AWS/ElasticMapReduce",
"Period": 300,
"Threshold": 2000,
"Statistic": "AVERAGE"
}
}
}
]
}'
Metrik untuk scaling
MemoryAvailableMB: Memori bebasMemoryTotalMB: Total memoriHDFSUtilization: Ruang HDFS yang digunakanAppsRunning: Aplikasi YARN yang berjalanAppsPending: Aplikasi YARN yang menunggu
Pemantauan dan pencatatan (logging)
Daftar klaster
aws emr list-clusters --states RUNNING
Deskripsi klaster
aws emr describe-cluster --cluster-id j-ABC123DEF456
Respons meliputi:
{
"Cluster": {
"Id": "j-ABC123DEF456",
"Name": "My Cluster",
"Status": {
"State": "RUNNING",
"StateChangeReason": {},
"Timeline": {
"CreationDateTime": "2026-03-24T10:00:00.000Z"
}
},
"Applications": [
{ "Name": "Spark", "Version": "3.5.0" }
],
"InstanceCollectionType": "INSTANCE_GROUP",
"LogUri": "s3://my-bucket/emr-logs/",
"MasterPublicDnsName": "ec2-12-34-56-78.compute-1.amazonaws.com"
}
}
Daftar langkah
aws emr list-steps --cluster-id j-ABC123DEF456
Status langkah
{
"Id": "s-ABC123",
"Name": "Process Data",
"Status": {
"State": "COMPLETED",
"Timeline": {
"StartDateTime": "2026-03-24T10:05:00.000Z",
"EndDateTime": "2026-03-24T11:30:00.000Z"
}
}
}
Integrasi CloudWatch
EMR mempublikasikan metrik ke CloudWatch:
JobsFailedJobsRunningMemoryAvailableMBMemoryTotalMBHDFSUtilization
Optimasi biaya
Menggunakan spot instance
Node tugas sangat cocok untuk spot instance. Jika dihentikan, pekerjaan akan berlanjut di node yang tersisa.
{
"Name": "TaskGroup",
"InstanceRole": "TASK",
"InstanceType": "m5.2xlarge",
"InstanceCount": 4,
"Market": "SPOT",
"BidPrice": "0.10"
}
Klaster sementara (transient)
Buat klaster, jalankan pekerjaan, hentikan secara otomatis:
{
"KeepJobFlowAliveWhenNoSteps": false,
"Steps": [
{ ... step 1 ... },
{ ... step 2 ... }
]
}
Klaster dihentikan setelah semua langkah selesai.
Instance fleet dengan beberapa opsi
Biarkan EMR memilih yang termurah yang tersedia:
{
"InstanceTypeConfigs": [
{
"InstanceType": "m5.2xlarge",
"BidPrice": "0.15"
},
{
"InstanceType": "m4.2xlarge",
"BidPrice": "0.12"
},
{
"InstanceType": "c5.2xlarge",
"BidPrice": "0.10"
}
]
}
Pengujian dengan Apidog
Klaster EMR mahal. Uji konfigurasi dengan cermat.

1. Memvalidasi konfigurasi klaster
Simpan templat klaster di Apidog:
pm.test('Cluster has required applications', () => {
const config = pm.request.body.toJSON()
const apps = config.Applications.map(a => a.Name)
pm.expect(apps).to.include('Spark')
})
pm.test('Instance types are valid', () => {
const config = pm.request.body.toJSON()
const types = ['m5.xlarge', 'm5.2xlarge', 'm4.xlarge']
pm.expect(types).to.include(config.Instances.MasterInstanceType)
})
2. Menguji definisi langkah
pm.test('Spark step has valid args', () => {
const step = pm.request.body.toJSON().Steps[0]
const args = step.HadoopJarStep.Args
pm.expect(args[0]).to.eql('spark-submit')
pm.expect(args).to.include('--deploy-mode')
})
3. Variabel lingkungan
AWS_REGION: us-east-1
EMR_SERVICE_ROLE: EMR_DefaultRole
EMR_EC2_ROLE: EMR_EC2_DefaultRole
S3_LOG_BUCKET: my-emr-logs
S3_SCRIPTS_BUCKET: my-emr-scripts
Uji API AWS dengan Apidog - gratis
Kesalahan umum dan perbaikan
ValidationError: ServiceRole tidak valid
Penyebab: Peran IAM tidak ada atau tidak dikonfigurasi untuk EMR.
Perbaikan: Buat peran layanan di konsol IAM atau gunakan default AWS: EMR_DefaultRole_V2.
Gagal menyediakan instans EC2
Penyebab: Tipe instans tidak tersedia di AZ Anda, atau batas layanan tercapai.
Perbaikan:
- Gunakan instance fleet dengan beberapa tipe instans
- Minta peningkatan batas
- Coba tipe instans yang berbeda
Langkah gagal dengan kode keluar Aplikasi 1
Penyebab: Pekerjaan Spark/Hadoop yang sebenarnya gagal.
Perbaikan: Periksa log di S3 (jalur LogUri). Lihat stderr dan stdout untuk langkah tersebut.
Klaster terjebak dalam status STARTING
Penyebab: Tindakan bootstrap gagal, atau masalah izin.
Perbaikan: Periksa output konsol instans EC2. Verifikasi akses S3 untuk skrip bootstrap.
Alternatif dan perbandingan
| Fitur | AWS EMR | Google Dataproc | Azure HDInsight | Databricks |
|---|---|---|---|---|
| Hadoop/Spark Terkelola | ✓ | ✓ | ✓ | Spark saja |
| Integrasi AWS | Sangat Baik | Terbatas | Terbatas | Baik |
| Opsi Serverless | EMR Serverless | Dataproc Serverless | Terbatas | ✓ |
| Biaya | Dukungan Spot | VMs yang Dapat Didahului | Spot instance | Baik |
| Dukungan ML | EMR Studio | Vertex AI | Synapse | MLflow built-in |
EMR memiliki integrasi AWS terdalam. Databricks memiliki perkakas Spark yang lebih baik. Dataproc lebih murah untuk pengguna GCP.
Studi kasus dunia nyata
ETL data lake. Sebuah perusahaan ritel memproses data penjualan harian. Klaster EMR menyerap file CSV dari S3, mengubahnya dengan Spark, dan menulis Parquet ke data lake. Klaster berjalan selama 2 jam setiap hari dan dihentikan.
Analisis log. Sebuah perusahaan SaaS memproses log aplikasi. Spark membaca log dari S3, mengagregasi metrik, dan menulis ke gudang data. Auto-scaling menambahkan node tugas selama volume log puncak.
Pipeline pembelajaran mesin. Tim ilmu data melatih model di EMR. Spark membaca fitur dari S3, melatih model dengan MLlib, dan mengekspor ke SageMaker untuk penyajian.
Penutup
Berikut adalah apa yang telah Anda pelajari:
- Membuat klaster dengan API RunJobFlow
- Mengirimkan pekerjaan sebagai langkah-langkah
- Menggunakan auto-scaling untuk efisiensi biaya
- Memantau dengan CloudWatch
- Mengoptimalkan biaya dengan spot instance dan klaster sementara
Langkah selanjutnya:
- Siapkan peran IAM untuk EMR
- Buat klaster uji
- Kirimkan pekerjaan Spark sederhana
- Tinjau log di S3
- Terapkan strategi penghematan biaya
Uji API AWS dengan Apidog - gratis
FAQ
Apa perbedaan antara node master, core, dan task?
- Master: Menjalankan pengelola klaster (YARN ResourceManager, HDFS NameNode)
- Core: Menjalankan pemrosesan data dan menyimpan data HDFS
- Task: Hanya menjalankan pemrosesan data, tanpa data HDFS (baik untuk spot instance)
Bagaimana cara melakukan SSH ke node master?
aws emr ssh --cluster-id j-ABC123DEF456 --key-pair-file my-key.pem
Bisakah saya menjalankan Jupyter notebook di EMR?Ya. Gunakan EMR Studio atau aktifkan aplikasi JupyterHub. Atau gunakan EMR Notebooks (Jupyter terkelola).
Apa itu EMR Serverless?Opsi serverless di mana Anda mengirimkan pekerjaan Spark/Hive tanpa mengelola klaster. Bayar per jalankan pekerjaan. Baik untuk beban kerja sporadis.
Bagaimana cara membaca dari DynamoDB?Gunakan konektor DynamoDB:
spark-submit --conf spark.hadoop.dynamodb.servicename=dynamodb \
--conf spark.hadoop.dynamodb.input.tableName=MyTable \
--conf spark.hadoop.dynamodb.output.tableName=MyTable \
--conf spark.hadoop.dynamodb.region=us-east-1 \
my-job.jar
Label rilis mana yang harus saya gunakan?Yang stabil terbaru (emr-7.x untuk Spark 3.x). Gunakan versi yang konsisten di seluruh lingkungan. Periksa kompatibilitas aplikasi di catatan rilis.
Bagaimana cara mengatasi langkah yang gagal?
- Periksa status langkah:
aws emr describe-step - Lihat log di S3:
s3://your-log-bucket/logs/j-ABC123/steps/s-DEF123/ - SSH ke master dan periksa
/mnt/var/log/
