DEV Community

Cover image for Cách Sử Dụng API EMR
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Cách Sử Dụng API EMR

TL;DR (Tóm tắt)

Các API của AWS EMR (Elastic MapReduce) giúp bạn quản lý các cụm dữ liệu lớn chạy Hadoop, Spark, Hive và Presto. Bạn có thể tạo cụm, gửi công việc dưới dạng các bước, tự động điều chỉnh quy mô dựa trên tải, và chấm dứt khi hoàn thành. Xác thực sử dụng AWS IAM. Để kiểm thử, sử dụng Apidog để xác thực cấu hình cụm, kiểm thử gửi công việc dựa trên API, và ghi lại quy trình xử lý dữ liệu.

Dùng thử Apidog ngay hôm nay

Giới thiệu

AWS EMR là dịch vụ quản lý Hadoop/Spark trên AWS, giúp xử lý petabyte dữ liệu cho analytics, machine learning và ETL. Thay vì tự quản lý cụm Hadoop, bạn để AWS xử lý hạ tầng.

EMR chạy trên các phiên bản EC2 trong một cụm. Bạn cần chỉ định:

  • Loại phiên bản (nút master, core, task)
  • Ứng dụng (Spark, Hadoop, Hive, Presto, HBase)
  • Hành động khởi động (script thiết lập)
  • Các bước (công việc cần chạy)

EMR API cho phép bạn tự động hóa toàn bộ quy trình: tạo cụm, gửi job, giám sát và tích hợp với dịch vụ AWS khác.

💡 Nếu bạn xây dựng pipeline dữ liệu, Apidog giúp kiểm thử cấu hình cụm, xác thực job, và ghi lại workflow EMR trước khi chạy các job tốn kém.

Kiểm thử API AWS với Apidog - miễn phí

Đến cuối bài viết bạn sẽ biết cách:

  • Tạo và cấu hình cụm EMR qua API
  • Gửi job dưới dạng các bước
  • Quản lý tự động điều chỉnh quy mô
  • Giám sát cụm và tiến độ công việc
  • Tối ưu hóa chi phí với instance fleets và spot instances

Xác thực với AWS

EMR sử dụng xác thực tiêu chuẩn AWS IAM.

Sử dụng AWS SDK (Khuyến nghị)

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
  }
})
Enter fullscreen mode Exit fullscreen mode

Gọi API trực tiếp với SigV4

EMR yêu cầu AWS Signature Version 4. Dùng SDK, boto3, AWS CLI, hoặc ký thủ công.

aws emr list-clusters --region us-east-1
Enter fullscreen mode Exit fullscreen mode

Quyền IAM cơ bản

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:*",
        "ec2:Describe*",
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": "*"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Tạo một cụm EMR

Tạo cụm cơ bản bằng CLI

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
Enter fullscreen mode Exit fullscreen mode

Tạo cụm qua 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" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Phản hồi:

{
  "JobFlowId": "j-ABC123DEF456"
}
Enter fullscreen mode Exit fullscreen mode

Instance groups vs Instance fleets

Instance groups: Loại phiên bản cố định trên từng nhóm (master, core, task).

Instance fleets: Nhiều loại phiên bản trên mỗi nhóm. EMR tự chọn dựa vào giá cả và khả dụng.

{
  "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"
          }
        }
      }
    ]
  }
}
Enter fullscreen mode Exit fullscreen mode

Gửi công việc dưới dạng các bước

EMR xử lý công việc qua các "bước" (steps) theo thứ tự.

Thêm bước Spark bằng AWS CLI

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/"
        ]
      }
    }
  ]'
Enter fullscreen mode Exit fullscreen mode

Thêm bước qua 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/"
        ]
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

ActionOnFailure options

  • TERMINATE_CLUSTER: Dừng cụm khi step fail
  • CANCEL_AND_WAIT: Hủy các bước còn lại, giữ cụm chạy
  • CONTINUE: Tiếp tục với bước tiếp theo

Bước Hive

{
  "Name": "Hive Query",
  "HadoopJarStep": {
    "Jar": "command-runner.jar",
    "Args": [
      "hive-script",
      "--run-hive-script",
      "--args",
      "-f",
      "s3://my-bucket/scripts/transform.q"
    ]
  }
}
Enter fullscreen mode Exit fullscreen mode

Tự động điều chỉnh quy mô (Auto-scaling)

EMR tự động thêm/xóa nút task dựa trên tải.

Tạo policy 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"
          }
        }
      }
    ]
  }'
Enter fullscreen mode Exit fullscreen mode

Các chỉ số phổ biến để auto-scale

  • MemoryAvailableMB: Bộ nhớ còn lại
  • MemoryTotalMB: Tổng bộ nhớ
  • HDFSUtilization: % HDFS đã dùng
  • AppsRunning: Ứng dụng YARN đang chạy
  • AppsPending: Ứng dụng YARN chờ xử lý

Giám sát và ghi nhật ký

Liệt kê các cụm

aws emr list-clusters --states RUNNING
Enter fullscreen mode Exit fullscreen mode

Mô tả cụm

aws emr describe-cluster --cluster-id j-ABC123DEF456
Enter fullscreen mode Exit fullscreen mode

Phản hồi mẫu:

{
  "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"
  }
}
Enter fullscreen mode Exit fullscreen mode

Liệt kê các bước

aws emr list-steps --cluster-id j-ABC123DEF456
Enter fullscreen mode Exit fullscreen mode

Trạng thái bước

{
  "Id": "s-ABC123",
  "Name": "Process Data",
  "Status": {
    "State": "COMPLETED",
    "Timeline": {
      "StartDateTime": "2026-03-24T10:05:00.000Z",
      "EndDateTime": "2026-03-24T11:30:00.000Z"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Tích hợp CloudWatch

EMR xuất các chỉ số lên CloudWatch:

  • JobsFailed: Công việc thất bại
  • JobsRunning: Công việc đang chạy
  • MemoryAvailableMB: Bộ nhớ khả dụng
  • MemoryTotalMB: Tổng bộ nhớ
  • HDFSUtilization: % sử dụng HDFS

Tối ưu hóa chi phí

Sử dụng Spot Instances

Nút task phù hợp để chạy Spot. Nếu bị chấm dứt, các job vẫn chạy trên các nút còn lại.

{
  "Name": "TaskGroup",
  "InstanceRole": "TASK",
  "InstanceType": "m5.2xlarge",
  "InstanceCount": 4,
  "Market": "SPOT",
  "BidPrice": "0.10"
}
Enter fullscreen mode Exit fullscreen mode

Cụm tạm thời (Transient clusters)

Tự động chấm dứt khi xong việc:

{
  "KeepJobFlowAliveWhenNoSteps": false,
  "Steps": [
    { ... step 1 ... },
    { ... step 2 ... }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Instance fleet với nhiều lựa chọn

Để EMR chọn loại phiên bản rẻ nhất sẵn có:

{
  "InstanceTypeConfigs": [
    {
      "InstanceType": "m5.2xlarge",
      "BidPrice": "0.15"
    },
    {
      "InstanceType": "m4.2xlarge",
      "BidPrice": "0.12"
    },
    {
      "InstanceType": "c5.2xlarge",
      "BidPrice": "0.10"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Kiểm thử với Apidog

Các cụm EMR rất tốn kém – kiểm thử cấu hình kỹ càng là cần thiết.

Ảnh chụp màn hình giao diện Apidog hiển thị các trường hợp kiểm thử API cho EMR.

1. Xác thực cấu hình cụm

Lưu mẫu cluster trong Apidog và kiểm thử:

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)
})
Enter fullscreen mode Exit fullscreen mode

2. Kiểm thử định nghĩa bước

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')
})
Enter fullscreen mode Exit fullscreen mode

3. Biến môi trường

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
Enter fullscreen mode Exit fullscreen mode

Kiểm thử API AWS với Apidog - miễn phí


Các lỗi thường gặp và cách khắc phục

ValidationError: ServiceRole không hợp lệ

Nguyên nhân: Vai trò IAM chưa tồn tại hoặc chưa cấu hình cho EMR.

Khắc phục: Tạo vai trò dịch vụ trong IAM hoặc dùng vai trò mặc định: EMR_DefaultRole_V2.

Không thể cung cấp các phiên bản EC2

Nguyên nhân: Loại phiên bản không có sẵn trong AZ hoặc vượt giới hạn dịch vụ.

Khắc phục:

  • Dùng instance fleet với nhiều loại phiên bản
  • Yêu cầu tăng giới hạn
  • Thử loại phiên bản khác

Bước thất bại với mã thoát ứng dụng 1

Nguyên nhân: Job Spark/Hadoop thực tế bị lỗi.

Khắc phục: Kiểm tra log S3 (LogUri). Xem stderrstdout của step.

Cụm bị kẹt ở trạng thái STARTING

Nguyên nhân: Lỗi ở bootstrap actions hoặc quyền truy cập.

Khắc phục: Kiểm tra console output của EC2. Đảm bảo quyền truy cập S3 cho script khởi động.


Các giải pháp thay thế và so sánh

Tính năng AWS EMR Google Dataproc Azure HDInsight Databricks
Hadoop/Spark được quản lý Chỉ Spark
Tích hợp AWS Tuyệt vời Hạn chế Hạn chế Tốt
Tùy chọn Serverless EMR Serverless Dataproc Serverless Hạn chế
Chi phí Hỗ trợ Spot VM có thể bị ngắt (Preemptible VMs) Phiên bản Spot Tốt
Hỗ trợ học máy (ML) EMR Studio Vertex AI Synapse Tích hợp MLflow

EMR tích hợp sâu với AWS. Databricks mạnh về Spark. Dataproc tiết kiệm hơn cho khách hàng GCP.


Các trường hợp sử dụng thực tế

ETL hồ dữ liệu: Công ty bán lẻ xử lý dữ liệu bán hàng hàng ngày. EMR nhập file CSV từ S3, biến đổi với Spark, ghi Parquet vào data lake. Cụm chỉ chạy 2 giờ/ngày và tự động chấm dứt.

Phân tích log: SaaS xử lý log ứng dụng. Spark đọc log từ S3, tổng hợp, ghi về kho dữ liệu. Auto-scaling tự động thêm task node khi tải tăng.

Quy trình Machine Learning: Nhóm data science huấn luyện model trên EMR. Spark đọc feature từ S3, huấn luyện với MLlib, xuất model lên SageMaker để triển khai.


Tổng kết

Bạn đã biết:

  • Tạo cụm bằng API RunJobFlow
  • Gửi job dưới dạng các bước
  • Sử dụng auto-scaling tối ưu chi phí
  • Giám sát với CloudWatch
  • Tối ưu chi phí nhờ Spot instance và cụm tạm thời

Các bước tiếp theo:

  1. Thiết lập IAM role cho EMR
  2. Tạo một cụm kiểm thử
  3. Gửi job Spark đơn giản
  4. Xem lại log trên S3
  5. Thực hiện các chiến lược tiết kiệm chi phí

Kiểm thử API AWS với Apidog - miễn phí


Câu hỏi thường gặp

Sự khác biệt giữa master, core, task node?

  • Master: Quản lý cluster (YARN ResourceManager, HDFS NameNode)
  • Core: Xử lý và lưu trữ dữ liệu HDFS
  • Task: Chỉ xử lý dữ liệu, không lưu HDFS (tốt cho Spot)

Làm sao SSH vào master node?

aws emr ssh --cluster-id j-ABC123DEF456 --key-pair-file my-key.pem
Enter fullscreen mode Exit fullscreen mode

Có chạy Jupyter notebook trên EMR được không?

Có. Dùng EMR Studio, bật JupyterHub hoặc EMR Notebooks (Jupyter managed).

EMR Serverless là gì?

Tùy chọn serverless: gửi job Spark/Hive mà không phải quản lý cụm, trả tiền theo job. Phù hợp workload không liên tục.

Làm sao đọc từ 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
Enter fullscreen mode Exit fullscreen mode

Nên dùng release label nào?

Dùng bản ổn định mới nhất (emr-7.x cho Spark 3.x). Đảm bảo đồng nhất version giữa môi trường. Kiểm tra compatibility trong release notes.

Khắc phục bước bị lỗi thế nào?

  1. Kiểm tra trạng thái bước: aws emr describe-step
  2. Xem log trong S3: s3://your-log-bucket/logs/j-ABC123/steps/s-DEF123/
  3. SSH vào master, kiểm tra /mnt/var/log/

Top comments (0)