AWS Data Engineering Bootcamp شرح ببساطة (مع مخططات وكود حقيقي)

AWS Data Engineering Bootcamp : الأساسيات في مقال واحد — كود حقيقي، مخططات وخطوات عملية، مقتطفات من دورة مكونة من 17 درسًا.

AWS Data Engineering Bootcamp شرح ببساطة (مع مخططات وكود حقيقي)

دليل مباشر إلى الهدف: AWS Data Engineering Bootcamp مفكك مع مخططات ورسوم بيانية، أمثلة عملية وأوامر مجربة. كل شيء من دورة منظمة من 5 فصول — إليك الأفضل منها.

tl;dr
  • مقدمة في هندسة بيانات AWS
  • التقسيم والتجميع
  • Athena وGlue قيد التنفيذ
  • الكاردينالية والتحسين المتقدم
  • معمل Athena الموجه
~$ cat ./parcours.md # AWS Data Engineering Bootcamp — 5 فصول
01
مقدمة في هندسة البيانات على AWS
→ الفصل 00 – الدرس 1 : المفاهيم الأساسية في هندسة البيانات→ الفصل 00 – الدرس 2 : مستودعات البيانات ومكافئاتها السحابية+ 1 دروس أخرى
02
التقسيم والتجميع
→ الفصل 01 – الدرس 1 : التقسيم والتجميع في بحيرة البيانات→ الفصل 01 – الدرس 2 : التجميع في مستودعات البيانات+ 1 دروس أخرى
03
Athena وGlue قيد التنفيذ
→ الفصل 02 – الدرس 1 : Amazon Athena — المفاهيم الأساسية والبنية→ الفصل 02 – الدرس 2 : إعداد Athena وإنشاء قاعدة بيانات Glue+ 2 دروس أخرى
04
الكاردينالية والتحسين المتقدم
→ الفصل 03 – الدرس 1 : عروض SQL والاستعلامات المسماة وAWS CloudFormation→ الفصل 03 – الدرس 2 : أذونات IAM لـ Athena وGlue — أفضل الممارسات+ 2 دروس أخرى
05
معمل Athena الموجه
→ الفصل 04 (اختياري) – المعمل 1 : إنشاء قاعدة بيانات وجدول AWS Glue في Athena→ الفصل 04 (اختياري) – المعمل 2 : التجميع والتقسيم وتنسيق Parquet+ 1 دروس أخرى
🏁
المشروع النهائي
→ ستخرج بمشروع ملموس وقابل للعرض

الفصل 02 – الدرس 3: التحسين بالتجميع والتقسيم في Athena

NOTEالهدف — تطبيق التجميع والتقسيم على بيانات حقيقية في Athena وقياس تحسن الأداء وخفض التكاليف.

التحسين بالتجميع في Athena

لماذا التجميع؟

يقوم التجميع (bucketing) بتوزيع البيانات على عدة ملفات وفق مفتاح تجزئة. يحسن الأداء بشكل كبير عند العمل على أعمدة ذات كاردينالية عالية.

تقليل المسح

يستهدف Athena فقط الحاويات (buckets) المطلوبة أثناء الاستعلام.

تحسين الربط

عندما تكون جدولان مجمّعين على نفس المفتاح، ينفذ Athena عمليات ربط سريعة جداً.

الكاردينالية العالية

مثالي لـ user_id، transaction_id، device_id.

مثال عملي: معاملات التجارة الإلكترونية المجمّعة

output
-- الخطوة 1: إعداد التجميع أثناء إنشاء الجدول
-- استبدل user_id بعمودك ذي الكاردينالية العالية
CLUSTERED BY (user_id) INTO 8 BUCKETS

-- مثال كامل باستخدام CTAS (Create Table As Select)
CREATE TABLE taxidata.transactions_bucketized
WITH (
    format = 'PARQUET',
    external_location = 's3://mon-bucket/transactions-bucketized/',
    bucketed_by = ARRAY['user_id'],
    bucket_count = 8
) AS
SELECT *
FROM taxidata.transactions_source;
TIPالتحقق في S3 — بعد الإنشاء، يجب أن ترى 8 ملفات في S3:
s3://mon-bucket/transactions-bucketized/
├── 000000_0.parquet
├── 000001_0.parquet
├── ...
└── 000007_0.parquet

خطوات إعداد التجميع

التحسين بالتقسيم في Athena

هيكل الأقسام في S3

ينظم التقسيم البيانات في مجلدات منفصلة داخل S3 وفق قيم عمود ذي كاردينالية منخفضة:

bash
# هيكل الأقسام في S3 (تنسيق Hive)
s3://taxi-datalake/yellow/
├── year=2015/month=01/
│   └── data.parquet
├── year=2015/month=02/
│   └── data.parquet
├── year=2016/month=01/
│   └── data.parquet
└── year=2017/month=01/
    └── data.parquet

إنشاء جدول مقسم عبر CTAS

output
-- CTAS (Create Table As Select) مع التقسيم
-- تحويل CSV → Parquet مع التقسيم
CREATE TABLE taxidata.yellow_partitioned
WITH (
    format = 'PARQUET',
    external_location = 's3://taxi-datalake/yellow-partitioned/',
    partitioned_by = ARRAY['year', 'month']
) AS
SELECT
    vendor, pickup, dropoff, count,
    distance, ratecode, storeflag, pulocid, dolocid,
    paytype, fare, extra, mta_tax, tip, tolls, surcharge, total,
    YEAR(pickup) AS year,
    MONTH(pickup) AS month
FROM taxidata.yellow;
NOTEمهم — يجب سرد أعمدة التقسيم (year، month) في آخر عبارة SELECT وفي مصفوفة partitioned_by.

اكتشاف الأقسام

output
-- بعد إضافة البيانات، اكتشف الأقسام الجديدة
MSCK REPAIR TABLE taxidata.yellow_partitioned;

-- إضافة قسم محدد يدوياً
ALTER TABLE taxidata.yellow_partitioned
ADD PARTITION (year='2017', month='02')
LOCATION 's3://taxi-datalake/yellow-partitioned/year=2017/month=02/';

استعلامات محسنة باستخدام التقسيم

output
-- استعلام بدون تقسيم: مسح كامل الجدول
SELECT COUNT(*), SUM(fare) AS total_fares
FROM taxidata.yellow
WHERE YEAR(pickup) = 2017 AND MONTH(pickup) = 1;
-- → Scan : 100% des données (ex: 1 TB)

-- استعلام مع التقسيم: مسح القسم المعني فقط
SELECT COUNT(*), SUM(fare) AS total_fares
FROM taxidata.yellow_partitioned
WHERE year = 2017 AND month = 1;
-- → Scan : ~1/36 des données (si 3 ans × 12 mois)
-- → Réduction de ~97% des données scannées !

التركيبة المثلى: التقسيم + التجميع

الفصل 02 – الدرس 2: إعداد Athena وإنشاء قاعدة بيانات Glue

NOTEالهدف — إعداد بيئة Athena، إنشاء قاعدة بيانات AWS Glue، تعريف جدول خارجي على بيانات S3 وتنفيذ الاستعلامات الأولى بلغة SQL.

الخطوة 1 — إعداد بيئة Athena

WARNINGالمتطلب الأساسي الإلزامي — قبل أي استعلام Athena، قم بإعداد حاوية S3 للنتائج. بدون ذلك، سيرفض Athena تنفيذ استعلاماتك.
bash
# بديل: الإعداد عبر AWS CLI
aws athena update-work-group \
  --work-group primary \
  --configuration-updates "ResultConfigurationUpdates={OutputLocation=s3://mon-bucket-athena-results/}"

الخطوة 2 — إنشاء قاعدة بيانات Glue

في محرر Athena، نفذ:

output
-- إنشاء قاعدة بيانات taxidata في AWS Glue Data Catalog
CREATE DATABASE taxidata;
TIPالنتيجة — تنشئ هذه الأمر قاعدة بيانات taxidata في AWS Glue Data Catalog. يمكنك رؤيتها في وحدة تحكم Glue ضمن "Databases".
bash
# التحقق من الإنشاء عبر AWS CLI
aws glue get-database --name taxidata

# سرد جميع قواعد البيانات
aws glue get-databases

الخطوة 3 — تعريف مخطط الجدول (مجموعة بيانات سيارات الأجرة في نيويورك)

ننشئ الجدول الخارجي yellow على بيانات سيارات الأجرة في نيويورك المخزنة في S3:

output
-- إنشاء الجدول الخارجي yellow على بيانات S3
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.yellow (
   `vendor`    string,
   `pickup`    timestamp,
   `dropoff`   timestamp,
   `count`     int,
   `distance`  int,
   `ratecode`  string,
   `storeflag` string,
   `pulocid`   string,
   `dolocid`   string,
   `paytype`   string,
   `fare`      decimal,
   `extra`     decimal,
   `mta_tax`   decimal,
   `tip`       decimal,
   `tolls`     decimal,
   `surcharge` decimal,
   `total`     decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
   'serialization.format' = ',',
   'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/yellow/'
TBLPROPERTIES ('has_encrypted_data'='false');
NOTEشرح المعاملات الرئيسية:
  • CREATE EXTERNAL TABLE — يشير الجدول إلى S3، Athena لا تنسخ البيانات
  • LazySimpleSerDe — مسلسل/مفكك تسلسل لملفات CSV المفصولة
  • field.delim = ',' — الحقول مفصولة بفواصل
  • LOCATION — مسار S3 الذي يحتوي ملفات البيانات
  • has_encrypted_data='false' — البيانات غير مشفرة

الخطوة 4 — معاينة البيانات

output
-- معاينة أول 10 صفوف
SELECT * FROM taxidata.yellow LIMIT 10;

-- عد إجمالي عدد الرحلات
SELECT COUNT(*) AS total_trajets FROM taxidata.yellow;

-- التحقق من أنواع الدفع المتاحة
SELECT DISTINCT paytype, COUNT(*) AS nb_trajets
FROM taxidata.yellow
GROUP BY paytype
ORDER BY nb_trajets DESC;

الخطوة 5 — إنشاء جدول محسن (يناير 2017)

output
-- إنشاء جدول لبيانات يناير 2017 فقط
-- أسرع للاختبار والتحقق
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.jan (
   `vendor`    string,
   `pickup`    timestamp,
   `dropoff`   timestamp,
   `count`     int,
   `distance`  int,
   `ratecode`  string,
   `storeflag` string,
   `pulocid`   string,
   `dolocid`   string,
   `paytype`   string,
   `fare`      decimal,
   `extra`     decimal,
   `mta_tax`   decimal,
   `tip`       decimal,
   `tolls`     decimal,
   `surcharge` decimal,
   `total`     decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
   'serialization.format' = ',',
   'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/January2017/'
TBLPROPERTIES ('has_encrypted_data'='false');

الفصل 03 – الدرس 1: طرق عرض SQL، الاستعلامات المسماة وAWS CloudFormation

NOTEالهدف — إنشاء طرق عرض SQL في Athena لتبسيط التحليلات، تعريف استعلامات مسماة قابلة لإعادة الاستخدام، وأتمتة نشرها باستخدام AWS CloudFormation.

طرق عرض SQL في Athena

طريقة عرض SQL هي استعلام محفوظ يمكن استخدامه كجدول. لا تخزن بيانات — تنفذ الاستعلام الأساسي في كل استدعاء.

TIPميزة طرق العرض — تبسيط الاستعلامات المعقدة، إنشاء طبقات تجريد ومشاركة تحليلات موحدة مع فريقك.

مثال 1: طريقة عرض الرحلات ببطاقة الائتمان

output
-- إنشاء طريقة عرض للمدفوعات ببطاقة الائتمان
-- paytype = '1' تعني الدفع ببطاقة
CREATE VIEW taxidata.cctrips AS
SELECT
    vendor,
    SUM(fare)  AS total_fares_cc,
    COUNT(*)   AS nb_trajets_cc,
    AVG(fare)  AS tarif_moyen_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;

-- استخدام طريقة العرض
SELECT * FROM taxidata.cctrips;

مثال 2: طريقة عرض الرحلات النقدية

output
-- إنشاء طريقة عرض للمدفوعات النقدية
-- paytype = '2' تعني الدفع نقداً
CREATE VIEW taxidata.cashtrips AS
SELECT
    vendor,
    SUM(fare)  AS total_fares_cash,
    COUNT(*)   AS nb_trajets_cash,
    AVG(fare)  AS tarif_moyen_cash
FROM taxidata.yellow
WHERE paytype = '2'
GROUP BY vendor;

-- استخدام طريقة العرض
SELECT * FROM taxidata.cashtrips;

مثال 3: طريقة عرض المقارنة باستخدام CTE (WITH)

output
-- طريقة عرض مقارنة تجمع بين بطاقة الائتمان والنقد
-- استخدام CTE (Common Table Expressions) مع WITH
CREATE VIEW taxidata.comparepay AS
WITH
    cc AS (
        SELECT
            vendor,
            SUM(fare) AS cctotal,
            COUNT(*)  AS nb_cc
        FROM taxidata.yellow
        WHERE paytype = '1'
        GROUP BY vendor
    ),
    cash AS (
        SELECT
            vendor,
            SUM(fare) AS cashtotal,
            COUNT(*)  AS nb_cash
        FROM taxidata.yellow
        WHERE paytype = '2'
        GROUP BY vendor
    )
SELECT
    cc.vendor,
    cc.cctotal,
    cc.nb_cc,
    cash.cashtotal,
    cash.nb_cash,
    ROUND(cc.cctotal / cash.cashtotal, 2) AS ratio_cc_cash
FROM cc
JOIN cash ON cc.vendor = cash.vendor;

-- استعلام على طريقة العرض
SELECT * FROM taxidata.comparepay ORDER BY ratio_cc_cash DESC;

إدارة طرق العرض

output
-- سرد طرق العرض المتاحة
SHOW VIEWS IN taxidata;

-- عرض تعريف طريقة عرض
SHOW CREATE VIEW taxidata.comparepay;

-- استبدال طريقة عرض موجودة
CREATE OR REPLACE VIEW taxidata.cctrips AS
SELECT
    vendor,
    SUM(fare) AS total_fares_cc,
    COUNT(*) AS nb_trajets_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;

-- حذف طريقة عرض
DROP VIEW taxidata.cashtrips;

الاستعلامات المسماة في Athena

تتيح الاستعلامات المسماة (Named Queries) حفظ استعلامات SQL المستخدمة بشكل متكرر مباشرة في Athena. تتم مشاركتها داخل حساب AWS الخاص بك.

المزايا

القيود

الأتمتة باستخدام AWS CloudFormation

بدلاً من إنشاء الاستعلامات المسماة يدوياً عبر الوحدة، يمكنك نشرها كرمز باستخدام AWS CloudFormation.

قالب CloudFormation لاستعلام مسمى

أنشئ ملفاً باسم athenaquery.cf.yml:

output
AWSTemplateFormatVersion: 2010-09-09
Description: "Requête Athena nommée pour l'analyse des taxis NYC"

Resources:
  AthenaNamedQuery:
    Type: AWS::Athena::NamedQuery
    Properties:
      Database: "taxidata"
      Description: "Sélection des trajets dont le montant dépasse 100 $"
      Name: "FaresOver100DollarsUS"
      QueryString: >
        SELECT
            distance,
            paytype,
            fare,
            tip,
            tolls,
            surcharge,
            total
        FROM yellow
        WHERE total >= 100.0
        ORDER BY total DESC

Outputs:
  AthenaNamedQuery:
    Description: "L'ID de la requête nommée Athena créée"
    Value: !Ref AthenaNamedQuery

نشر قالب CloudFormation عبر AWS CLI

bash
# الخطوة 1: التحقق من صحة القالب قبل النشر
aws cloudformation validate-template \
    --template-body file://athenaquery.cf.yml

# الخطوة 2: إنشاء stack CloudFormation
aws cloudformation create-stack \
    --stack-name mon-athena-stack \
    --template-body file://athenaquery.cf.yml \
    --capabilities CAPABILITY_IAM

# الخطوة 3: التحقق من حالة الإنشاء
aws cloudformation describe-stacks \
    --stack-name mon-athena-stack \
    --query 'Stacks[0].StackStatus'

# الخطوة 4: سرد الاستعلامات المسماة المنشأة
aws athena list-named-queries \
    --work-group primary

# الخطوة 5: الحصول على تفاصيل استعلام مسمى
aws athena get-named-query \
    --named-query-id "ID_RETOURNÉ_PAR_LIST"
va-plus-loin

يغطي هذا المقال المقتطفات الأكثر فائدة — الدورة الكاملة AWS Data Engineering Bootcamp (5 فصول، 17 درساً، تمارين محلولة ومشروع نهائي) تأخذك إلى النهاية.

./acceder-au-cours-complet cours gratuit : Maîtriser Claude Code

الأسئلة الشائعة

كم من الوقت يستغرق تعلم AWS Data Engineering Bootcamp؟
مع تقدم منظم (5 فصول، 17 درساً قصيراً وعملياً)، يمكن الوصول إلى مستوى تشغيلي في بضعة أسابيع بمعدل 30 إلى 60 دقيقة يومياً. المهم هو تطبيق كل مفهوم فوراً.
هل هناك متطلبات سابقة؟
تكفي أساسيات الحوسبة. إذا كنت تعرف استخدام الطرفية وقراءة كود بسيط، فأنت جاهز.
من أين أبدأ عملياً؟
طبّق أوامر هذا المقال، ثم تابع دورة AWS Data Engineering Bootcamp الكاملة: تربط الـ17 درساً بالترتيب، مع تمارين ومشروع نهائي.

📬 هل تريد تلقي هذا النوع من الأدلة كل أسبوع؟ اشترك مجاناً — كود حقيقي، بدون كلام زائد.