خلاصة (TL;DR)
تدير واجهات برمجة تطبيقات AWS EMR (Elastic MapReduce) مجموعات بيانات ضخمة تعمل بـ Hadoop وSpark وHive وPresto. يمكنك إنشاء مجموعات، وإرسال المهام كخطوات، والتوسع التلقائي بناءً على حجم العمل، وإنهاء المجموعات عند الانتهاء. يتم المصادقة باستخدام AWS IAM. للاختبار، استخدم Apidog للتحقق من صحة تكوينات المجموعات، واختبار إرسال المهام مقابل بنية API، وتوثيق مسارات بياناتك.
مقدمة
AWS EMR هي خدمة Hadoop/Spark المُدارة على AWS. تعالج بيتابايت من البيانات للتحليلات، والتعلم الآلي، ومسارات ETL. بدلاً من إدارة مجموعة Hadoop الخاصة بك، تتيح لك AWS التعامل مع البنية التحتية.
يعمل EMR على مثيلات EC2 في مجموعة. أنت تحدد:
- أنواع المثيلات (الرئيسية، الأساسية، العقد التنفيذية)
- التطبيقات (Spark، Hadoop، Hive، Presto، HBase)
- إجراءات التمهيد (bootstrap actions) (نصوص الإعداد)
- الخطوات (المهام التي سيتم تشغيلها)
تسمح لك واجهة برمجة تطبيقات EMR بأتمتة كل هذا. يمكنك إنشاء المجموعات برمجيًا، وتقديم المهام، ومراقبة التقدم، والتكامل مع خدمات AWS الأخرى.
اختبر واجهات برمجة تطبيقات AWS باستخدام Apidog - مجانًا
بحلول نهاية هذا الدليل، ستكون قادرًا على:
- إنشاء وتكوين مجموعات EMR عبر API
- إرسال المهام كخطوات
- إدارة التوسع التلقائي
- مراقبة صحة المجموعة وتقدم المهام
- تحسين التكاليف باستخدام أساطيل المثيلات والمثيلات الفورية (spot instances)
المصادقة مع AWS
يستخدم EMR المصادقة القياسية لـ AWS مع IAM.
نهج AWS SDK (موصى به)
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
}
})
واجهة برمجة التطبيقات المباشرة مع SigV4
يتطلب EMR توقيع AWS الإصدار 4 (AWS Signature Version 4). استخدم حزم SDK أو أدوات مثل boto3، AWS CLI، أو قم بإنشاء التوقيعات يدويًا.
aws emr list-clusters --region us-east-1
أذونات IAM
الحد الأدنى للسياسة لإدارة EMR:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"elasticmapreduce:*",
"ec2:Describe*",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": "*"
}
]
}
إنشاء مجموعة
إنشاء مجموعة أساسي
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
عبر 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" }
]
}
الاستجابة:
{
"JobFlowId": "j-ABC123DEF456"
}
مجموعات المثيلات مقابل أساطيل المثيلات
مجموعات المثيلات (Instance groups): أنواع مثيلات ثابتة لكل مجموعة (رئيسية، أساسية، مهمة).
أساطيل المثيلات (Instance fleets): أنواع/خيارات مثيلات متعددة لكل مجموعة. يختار EMR بناءً على التوفر والسعر.
{
"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"
}
}
}
]
}
}
إرسال المهام كخطوات
ينفذ EMR المهام كـ "خطوات" متسلسلة.
إضافة خطوة 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/"
]
}
}
]'
عبر 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/"
]
}
}
]
}
خيارات ActionOnFailure
TERMINATE_CLUSTER: إيقاف المجموعة عند الفشلCANCEL_AND_WAIT: إلغاء الخطوات المتبقية، إبقاء المجموعة قيد التشغيلCONTINUE: المتابعة إلى الخطوة التالية
خطوة Hive
{
"Name": "Hive Query",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"hive-script",
"--run-hive-script",
"--args",
"-f",
"s3://my-bucket/scripts/transform.q"
]
}
}
التوسع التلقائي
يمكن لـ EMR إضافة/إزالة عقد المهام بناءً على الحمل.
إنشاء سياسة التوسع التلقائي
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"
}
}
}
]
}'
مقاييس للتوسع
MemoryAvailableMB: الذاكرة المتاحةMemoryTotalMB: إجمالي الذاكرةHDFSUtilization: استخدام مساحة HDFSAppsRunning: تطبيقات YARN قيد التشغيلAppsPending: تطبيقات YARN بانتظار التشغيل
المراقبة والتسجيل
عرض قائمة المجموعات
aws emr list-clusters --states RUNNING
وصف المجموعة
aws emr describe-cluster --cluster-id j-ABC123DEF456
تتضمن الاستجابة:
{
"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"
}
}
عرض قائمة الخطوات
aws emr list-steps --cluster-id j-ABC123DEF456
حالة الخطوة
{
"Id": "s-ABC123",
"Name": "Process Data",
"Status": {
"State": "COMPLETED",
"Timeline": {
"StartDateTime": "2026-03-24T10:05:00.000Z",
"EndDateTime": "2026-03-24T11:30:00.000Z"
}
}
}
تكامل CloudWatch
ينشر EMR المقاييس إلى CloudWatch:
JobsFailedJobsRunningMemoryAvailableMBMemoryTotalMBHDFSUtilization
تحسين التكلفة
استخدام المثيلات الفورية (Spot Instances)
تعتبر عقد المهام مثالية للمثيلات الفورية. إذا تم إنهاؤها، تستمر المهمة على العقد المتبقية.
{
"Name": "TaskGroup",
"InstanceRole": "TASK",
"InstanceType": "m5.2xlarge",
"InstanceCount": 4,
"Market": "SPOT",
"BidPrice": "0.10"
}
المجموعات العابرة (Transient Clusters)
إنشاء مجموعات، تشغيل المهام، ثم إنهاؤها تلقائيًا:
{
"KeepJobFlowAliveWhenNoSteps": false,
"Steps": [
{ ... step 1 ... },
{ ... step 2 ... }
]
}
تُنهى المجموعة بعد اكتمال جميع الخطوات.
أساطيل المثيلات بخيارات متعددة
دع EMR يختار الأرخص المتاح:
{
"InstanceTypeConfigs": [
{
"InstanceType": "m5.2xlarge",
"BidPrice": "0.15"
},
{
"InstanceType": "m4.2xlarge",
"BidPrice": "0.12"
},
{
"InstanceType": "c5.2xlarge",
"BidPrice": "0.10"
}
]
}
الاختبار باستخدام Apidog
تعتبر مجموعات EMR مكلفة. اختبر التكوينات بعناية.

1. التحقق من صحة تكوينات المجموعة
احفظ قوالب المجموعة في 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. اختبار تعريفات الخطوات
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. متغيرات البيئة
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
اختبر واجهات برمجة تطبيقات AWS باستخدام Apidog - مجانًا
الأخطاء الشائعة والإصلاحات
ValidationError: الخدمة_الدور (ServiceRole) غير صالح
السبب: دور IAM غير موجود أو لم يتم تكوينه لـ EMR.
الإصلاح: أنشئ دور خدمة في وحدة تحكم IAM أو استخدم الافتراضي لـ AWS: EMR_DefaultRole_V2.
فشل في توفير مثيلات EC2
السبب: نوع المثيل غير متاح في منطقة التوفر الخاصة بك، أو تم الوصول إلى حدود الخدمة.
الإصلاح:
- استخدم أساطيل مثيلات بأنواع مثيلات متعددة
- طلب زيادة الحد
- جرب أنواع مثيلات مختلفة
فشلت الخطوة برمز خروج التطبيق 1
السبب: فشل مهمة Spark/Hadoop الفعلية.
الإصلاح: تحقق من السجلات في S3 (مسار LogUri). ابحث في stderr و stdout لهذه الخطوة.
المجموعة عالقة في حالة "بدء التشغيل" (STARTING)
السبب: فشل إجراءات التمهيد (bootstrap actions)، أو مشكلة في الأذونات.
الإصلاح: تحقق من إخراج وحدة تحكم مثيل EC2. تحقق من وصول S3 لبرامج التمهيد النصية.
البدائل والمقارنات
| الميزة | AWS EMR | Google Dataproc | Azure HDInsight | Databricks |
|---|---|---|---|---|
| Hadoop/Spark مُدار | ✓ | ✓ | ✓ | Spark فقط |
| تكامل AWS | ممتاز | محدود | محدود | جيد |
| خيار بلا خادم (Serverless) | EMR Serverless | Dataproc Serverless | محدود | ✓ |
| التكلفة | دعم المثيلات الفورية | VMs قابلة للإلغاء | المثيلات الفورية | جيد |
| دعم التعلم الآلي | EMR Studio | Vertex AI | Synapse | MLflow مدمج |
يتمتع EMR بأعمق تكامل مع AWS. بينما Databricks لديه أدوات Spark أفضل. Dataproc أرخص لمستخدمي GCP.
حالات الاستخدام الواقعية
تحويل واستخراج وتحميل البيانات (ETL) لبحيرة البيانات. تعالج شركة تجزئة بيانات المبيعات اليومية. تقوم مجموعات EMR بجمع ملفات CSV من S3، وتحويلها باستخدام Spark، وكتابة Parquet إلى بحيرة البيانات. تعمل المجموعات لمدة ساعتين يوميًا ثم تُنهى.
تحليلات السجلات. تعالج شركة SaaS سجلات التطبيقات. يقرأ Spark السجلات من S3، ويجمع المقاييس، ويكتبها إلى مستودع بيانات. يضيف التوسع التلقائي عقد المهام خلال أوقات ذروة حجم السجلات.
مسار التعلم الآلي. يقوم فريق علم البيانات بتدريب النماذج على EMR. يقرأ Spark الميزات من S3، ويدرب النماذج باستخدام MLlib، ويصدرها إلى SageMaker للتقديم.
الخلاصة
إليك ما تعلمته:
- إنشاء مجموعات باستخدام واجهة برمجة تطبيقات RunJobFlow
- إرسال المهام كخطوات
- استخدام التوسع التلقائي لفعالية التكلفة
- المراقبة باستخدام CloudWatch
- تحسين التكاليف باستخدام المثيلات الفورية والمجموعات العابرة
خطواتك التالية:
- إعداد أدوار IAM لـ EMR
- إنشاء مجموعة اختبار
- إرسال مهمة Spark بسيطة
- مراجعة السجلات في S3
- تطبيق استراتيجيات توفير التكلفة
اختبر واجهات برمجة تطبيقات AWS باستخدام Apidog - مجانًا
الأسئلة الشائعة
ما الفرق بين العقد الرئيسية (master)، الأساسية (core)، والمهام (task)؟
- الرئيسية (Master): تشغل مدير المجموعة (YARN ResourceManager, HDFS NameNode)
- الأساسية (Core): تشغل معالجة البيانات وتخزن بيانات HDFS
- المهام (Task): تشغل معالجة البيانات فقط، لا تخزن بيانات HDFS (جيدة للمثيلات الفورية)
كيف يمكنني الوصول إلى العقدة الرئيسية عبر SSH؟
aws emr ssh --cluster-id j-ABC123DEF456 --key-pair-file my-key.pem
هل يمكنني تشغيل دفاتر Jupyter على EMR؟نعم. استخدم EMR Studio أو قم بتمكين تطبيق JupyterHub. أو استخدم دفاتر EMR (Jupyter مُدار).
ما هو EMR Serverless؟خيار بلا خادم حيث ترسل مهام Spark/Hive دون إدارة المجموعات. تدفع مقابل كل تشغيل مهمة. جيد لأحمال العمل المتقطعة.
كيف أقرأ من DynamoDB؟استخدم موصل 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
ما هو إصدار (release label) الذي يجب أن أستخدمه؟أحدث إصدار مستقر (emr-7.x لـ Spark 3.x). استخدم إصدارات متسقة عبر البيئات. تحقق من توافق التطبيق في ملاحظات الإصدار.
كيف أستكشف الأخطاء وإصلاحها للخطوات الفاشلة؟
- تحقق من حالة الخطوة:
aws emr describe-step - عرض السجلات في S3:
s3://your-log-bucket/logs/j-ABC123/steps/s-DEF123/ - اتصل بـ SSH بالعقدة الرئيسية وتحقق من
/mnt/var/log/
