خلاصة (TL;DR)
تدير واجهات برمجة تطبيقات AWS EMR (Elastic MapReduce) مجموعات بيانات ضخمة تعمل بـ Hadoop وSpark وHive وPresto. يمكنك إنشاء مجموعات، وإرسال المهام كخطوات، والتوسع التلقائي حسب حجم العمل، وإنهاء المجموعات عند الانتهاء. يتم المصادقة باستخدام AWS IAM. لاختبار التكوينات ومسارات البيانات، استخدم Apidog للتحقق من صحة إعداداتك واختبار إرسال المهام مقابل واجهة API وتوثيق سير عملك.
مقدمة
AWS EMR هي خدمة Hadoop/Spark مُدارة بالكامل. تعالج بيتابايت من البيانات لتحليلات البيانات الضخمة، التعلم الآلي، ومسارات ETL، بدون الحاجة لإدارة البنية التحتية بنفسك.
أنت تتحكم في:
- أنواع المثيلات (رئيسية، أساسية، تنفيذية)
- التطبيقات المثبتة (Spark، Hadoop، Hive، Presto، HBase)
- إجراءات التمهيد (bootstrap actions) لنصوص الإعداد
- الخطوات (المهام) التي سيتم تنفيذها
من خلال واجهة برمجة تطبيقات EMR، يمكنك أتمتة إنشاء المجموعات، إرسال المهام، مراقبة التقدم، والتكامل مع خدمات AWS الأخرى.
💡 نصيحة: إذا كنت تبني مسارات بيانات، استخدم Apidog لاختبار تكوينات المجموعات والتحقق من صحة تعريفات المهام وتوثيق سير عمل EMR قبل تشغيل مهام معالجة البيانات المكلفة.
اختبر واجهات برمجة تطبيقات 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
يتطلب توقيع AWS Signature Version 4. استخدم SDKs مثل 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": "*"
}
]
}
إنشاء مجموعة
إنشاء مجموعة أساسي عبر 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
عبر 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" }
]
}
استجابة API:
{
"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 عبر 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/"
]
}
}
]'
عبر 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 يدعم إضافة/إزالة عقد المهام ديناميكيًا حسب الحمل.
إنشاء سياسة التوسع التلقائي عبر CLI
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: استخدام مساحة HDFS -
AppsRunning: تطبيقات 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. اختبار تعريفات الخطوات
تحقق من أن خطوات Spark تحتوي على الوسائط الصحيحة:
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. متغيرات البيئة
حدد متغيرات البيئة في Apidog لأتمتة الاختبارات:
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"
السبب: فشل إجراءات التمهيد أو مشكلة في الأذونات.
الإصلاح: راجع إخراج وحدة تحكم 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 لبحيرة البيانات: شركة تجزئة تعالج بيانات المبيعات اليومية. تجمع ملفات CSV من S3، وتحولها باستخدام Spark، وتكتب Parquet إلى بحيرة البيانات. تعمل المجموعات لساعتين يوميًا ثم تُنهى تلقائيًا.
- تحليلات السجلات: شركة SaaS تعالج سجلات التطبيقات باستخدام Spark، تجمع المقاييس وتخزنها في مستودع بيانات. التوسع التلقائي يضيف عقدًا إضافية عند الحاجة.
- مسار التعلم الآلي: فريق علم بيانات يدرب النماذج على EMR باستخدام MLlib وتصدير النماذج إلى SageMaker.
الخلاصة
ما تعلمته:
- إنشاء مجموعات باستخدام API 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.
ما هو 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/
لمزيد من الأتمتة والاختبار، جرّب Apidog اليوم.

Top comments (0)