وقتی ETL از یک اسکریپت ساده فراتر میرود؛ ۳ شکست واقعی که مسیر ورود به مهندسی داده را روشن کرد
در مسیر ورود به دنیای مهندسی داده، بسیاری از تحلیلگران داده تصور میکنند ساخت یک پایپلاین ETL یعنی نوشتن چند خط کد برای استخراج، پاکسازی و ذخیره داده. این تصور تا زمانی درست به نظر میرسد که اسکریپت فقط یکبار اجرا شود. اما زمانی که همان اسکریپت قرار است مانند یک سیستم واقعی، پایدار، قابل تکرار و قابل اعتماد کار کند، مشکلات جدی خود را نشان میدهند.
ابراهیم سلامی، تحلیلگر دادهای که در مسیر تبدیل شدن به مهندس داده قرار داشت، در تجربهای که در تاریخ ۲۲ خرداد ۱۴۰۵ منتشر کرد، توضیح داد که چگونه یک پروژه ساده ETL با استفاده از GitHub API در ظاهر موفق بود، اما هنگام تلاش برای تبدیل آن به یک پایپلاین آماده محیط عملیاتی یا همان Production-ready Data Pipeline، سه مشکل اساسی را آشکار کرد:
نبود حافظه در پایپلاین، ناپایداری محل ذخیره داده و نیاز به اجرای خودکار.
این تجربه نشان داد که مهندسی داده فقط «اسکریپتنویسی» نیست؛ بلکه طراحی سیستمهایی است که بتوانند در برابر تکرار، خطا، خاموشی، تغییر داده و اجرای زمانبندیشده مقاوم باشند.
مسئله اصلی چه بود؟ یک ETL ساده که فقط در ظاهر کافی بود
پایپلاین اولیه بسیار ساده بود. دادهها از GitHub API استخراج میشدند، سپس با استفاده از کتابخانه Pandas پاکسازی میشدند و در نهایت خروجی بهصورت فایل CSV ذخیره میشد.
فرآیند کلی چنین بود:
- استخراج داده از GitHub API
- انتخاب اطلاعاتی مانند نام مخزن، مالک، تعداد ستارهها، تعداد Fork، زبان برنامهنویسی، توضیحات و تاریخ ایجاد
- حذف رکوردهایی که توضیحات نداشتند
- افزودن یک ستون برای تشخیص مخازن وایرال
- مرتبسازی دادهها بر اساس تعداد ستارهها
- ذخیره خروجی در فایل CSV
این پایپلاین برای یک تمرین آموزشی کاملاً مناسب بود. اما مشکل زمانی شروع شد که قرار بود همان اسکریپت بیشتر از یکبار اجرا شود یا دادهها برای روزهای بعد باقی بمانند.
در همین نقطه، تفاوت میان اسکریپت تحلیلی و پایپلاین داده واقعی مشخص شد.
دیوار اول: پایپلاین حافظه نداشت و داده تکراری تولید کرد
اولین تغییر، جایگزینی فایل CSV با یک دیتابیس سبک یعنی SQLite بود. این تصمیم در ظاهر ساده بود. بهجای ذخیره خروجی در یک فایل متنی، دادهها وارد یک دیتابیس میشدند تا امکان کوئریگیری، بررسی رکوردهای موجود و توسعه ساختار داده فراهم شود.
اما پس از اجرای دوباره پایپلاین، مشکل مهمی رخ داد:
- تعداد کل رکوردها: ۴۴
- تعداد مخازن یکتا: ۲۲
- تعداد رکوردهای تکراری: ۲۲
یعنی همان دادهها دوباره وارد دیتابیس شده بودند. پایپلاین هیچ درکی از اجرای قبلی خود نداشت. هر بار که اجرا میشد، دادهها را بدون بررسی قبلی به دیتابیس اضافه میکرد.
اینجا مفهوم مهمی در مهندسی داده مطرح شد: Idempotency یا «همانندسازی بدون اثر تکراری».
Idempotency در پایپلاین داده یعنی چه؟
در مهندسی داده، Idempotency یعنی اگر یک پایپلاین چند بار اجرا شود، نتیجه نهایی نباید خراب یا تکراری شود. به زبان سادهتر، اجرای یکباره یا دهباره پایپلاین باید خروجی قابل پیشبینی و یکسان تولید کند.
اگر پایپلاین داده Idempotent نباشد، مشکلات زیر به وجود میآید:
- افزایش رکوردهای تکراری
- تحلیلهای اشتباه
- داشبوردهای گمراهکننده
- افزایش حجم دیتابیس بدون ارزش واقعی
- کاهش اعتماد تیمهای تصمیمگیر به دادهها
در محیط واقعی کسبوکار، چنین مشکلی میتواند تصمیمهای مدیریتی، گزارشهای فروش، پیشبینیها و مدلهای یادگیری ماشین را دچار خطا کند.
راهکار عملی برای جلوگیری از داده تکراری در ETL
راهکار پیادهسازیشده این بود که پیش از درج دادههای جدید، پایپلاین بررسی کند آیا رکوردی با شناسه یکتا قبلاً در دیتابیس وجود دارد یا نه. در این پروژه، فیلد URL مخزن گیتهاب بهعنوان شناسه یکتا استفاده شد.
منطق راهکار:
- دادههای جدید ابتدا در یک جدول موقت ذخیره شدند.
- رکوردهایی که URL آنها در جدول اصلی وجود داشت حذف شدند.
- نسخه جدید همان رکوردها دوباره وارد جدول اصلی شد.
این روش باعث شد پایپلاین بتواند بارها اجرا شود، بدون اینکه داده تکراری تولید کند.
دیوار دوم: دادهها پس از بستن Colab از بین رفتند
مشکل دوم فنیتر از چیزی بود که در ابتدا به نظر میرسید. پایپلاین در محیط Google Colab اجرا شده بود. Colab برای آموزش، آزمایش، نمونهسازی و تحلیل سریع بسیار مفید است، اما برای ذخیرهسازی پایدار داده طراحی نشده است.
وقتی Session یا Runtime بسته شد، فایل دیتابیس SQLite که در محیط موقت Colab ذخیره شده بود، از بین رفت. بنابراین روز بعد، کاربر مجبور شد همهچیز را از ابتدا اجرا کند.
این اتفاق یک اصل مهم در مهندسی داده را نشان داد:
داده باید در جایی ذخیره شود که مستقل از محیط اجرای کد باقی بماند.
چرا ذخیره داده در محیط موقت Colab خطرناک است؟
اگر فایلهای پایپلاین در مسیرهای موقت Colab ذخیره شوند، با خاموش شدن Runtime ممکن است از بین بروند. این موضوع برای تمرین آموزشی قابل قبول است، اما برای پایپلاین واقعی یک ریسک جدی محسوب میشود.
مشکلات این روش:
- حذف شدن دیتابیس پس از بستن Session
- نیاز به اجرای دوباره کل فرآیند
- از دست رفتن تاریخچه داده
- ناپایداری در تست و توسعه
- نبود قابلیت اتکا برای استفاده روزانه
راهکار عملی: ذخیره دیتابیس در Google Drive
برای حل این مشکل، دیتابیس SQLite بهجای ذخیره در محیط موقت Colab، مستقیماً در Google Drive ذخیره شد.
مسیر اتصال دیتابیس از حالت محلی به مسیر Google Drive تغییر کرد:
/content/drive/MyDrive/github_repos.db
با این تغییر، دیتابیس حتی پس از بستن نوتبوک، ریاستارت کردن Runtime یا اجرای دوباره پروژه در روز بعد باقی ماند.
این راهکار برای پروژههای آموزشی و نمونهسازی بسیار مناسب است، اما در مقیاس حرفهای، گزینههای پایدارتری مانند موارد زیر پیشنهاد میشوند:
- PostgreSQL
- MySQL
- BigQuery
- Amazon Redshift
- Snowflake
- Azure SQL Database
- Google Cloud SQL
دیوار سوم: هیچکس نمیتواند برای همیشه دکمه Run را بزند
پس از حل مشکل دادههای تکراری و ذخیرهسازی پایدار، مشکل سوم نمایان شد: پایپلاین هنوز دستی بود.
یعنی یک نفر باید نوتبوک را باز میکرد و دکمه Run را میزد. این روش برای یادگیری مناسب است، اما در دنیای واقعی قابل قبول نیست.
در یک شرکت واقعی، هیچکس نباید هر روز ساعت مشخصی پشت سیستم بنشیند تا یک اسکریپت را اجرا کند. پایپلاین باید خودش اجرا شود، خطاها را مدیریت کند، تاریخچه اجراها را ثبت کند و در صورت شکست هشدار بفرستد.
اینجاست که مفهوم Orchestration یا «هماهنگسازی اجرای پایپلاینها» اهمیت پیدا میکند.
ابزارهای اجرای خودکار پایپلاین داده
برای اجرای زمانبندیشده و قابل اعتماد پایپلاینها، ابزارهای زیر کاربرد دارند:
Apache Airflow
یکی از محبوبترین ابزارهای Orchestration در مهندسی داده است. با Airflow میتوان DAG تعریف کرد، اجرای وظایف را زمانبندی کرد، وابستگی بین تسکها را مدیریت کرد و شکستها را مانیتور کرد.
Prefect
گزینهای مدرنتر و سادهتر برای مدیریت Workflowهای داده است. Prefect برای تیمهایی مناسب است که به دنبال راهاندازی سریعتر و تجربه توسعهدهنده بهتر هستند.
Cron Jobs
برای پروژههای سادهتر، استفاده از Cron در لینوکس یا سرویسهای Cloud Scheduler میتواند راهکار مناسبی باشد.
Cloud-native Schedulers
در پروژههای ابری، ابزارهایی مانند:
- Google Cloud Scheduler
- AWS EventBridge
- Azure Data Factory Trigger
میتوانند اجرای خودکار پایپلاینها را مدیریت کنند.
جمعبندی فنی: تفاوت اسکریپت ETL با پایپلاین Production-ready
یک اسکریپت ساده ETL معمولاً فقط زمانی خوب کار میکند که:
- یکبار اجرا شود
- داده کم باشد
- خطا رخ ندهد
- کاربر خودش همهچیز را کنترل کند
اما یک پایپلاین داده آماده محیط عملیاتی باید ویژگیهای زیر را داشته باشد:
- جلوگیری از تولید داده تکراری
- ذخیرهسازی پایدار
- امکان اجرای خودکار
- ثبت لاگ اجرای پایپلاین
- مدیریت خطا و ارسال هشدار
- قابلیت مانیتورینگ
- امکان اجرای مجدد بدون خراب شدن داده
- استفاده از شناسه یکتا برای رکوردها
- قابلیت توسعه و مقیاسپذیری
راهکار پیشنهادی برای فعالان حوزه داده
اگر شما هم در مسیر یادگیری مهندسی داده هستید و یک اسکریپت ETL ساده نوشتهاید، برای حرفهایتر کردن آن این مسیر را دنبال کنید:
۱. خروجی CSV را با دیتابیس جایگزین کنید
برای شروع، SQLite انتخاب خوبی است. اما اگر پروژه جدیتر شد، به PostgreSQL یا دیتابیسهای ابری فکر کنید.
۲. برای هر رکورد شناسه یکتا تعریف کنید
بدون شناسه یکتا، کنترل رکوردهای تکراری دشوار میشود. در پروژههای واقعی، این شناسه میتواند ID، URL، کلید ترکیبی یا Hash باشد.
۳. پایپلاین را Idempotent طراحی کنید
اجرای چندباره پایپلاین نباید داده را خراب کند. قبل از Insert، وضعیت رکوردهای قبلی را بررسی کنید.
۴. داده را در محیط موقت ذخیره نکنید
Colab، Jupyter Notebook یا فضای موقت کانتینرها محل مناسبی برای نگهداری دائمی داده نیستند.
۵. اجرای دستی را حذف کنید
برای زمانبندی اجرای پایپلاین از Airflow، Prefect، Cron Job یا ابزارهای ابری استفاده کنید.
۶. لاگ و مانیتورینگ اضافه کنید
پایپلاین بدون لاگ، قابل اعتماد نیست. باید بدانید چه زمانی اجرا شده، چند رکورد پردازش کرده و کجا شکست خورده است.
نتیجهگیری: مهندسی داده یعنی ساخت سیستم، نه فقط نوشتن اسکریپت
تجربه منتشرشده در ۲۲ خرداد ۱۴۰۵ نشان داد که مسیر ورود به مهندسی داده از یک نقطه مهم عبور میکند: فهم تفاوت بین «کدی که اجرا میشود» و «سیستمی که قابل اعتماد است».
یک اسکریپت میتواند داده را از API بگیرد، پاکسازی کند و در فایل ذخیره کند. اما یک سیستم داده باید بداند قبلاً چه کاری انجام داده، داده را از بین نبرد، در زمان مشخص اجرا شود، خطاها را مدیریت کند و خروجی قابل اعتماد تولید کند.
سه مفهوم کلیدی این تجربه عبارت بودند از:
- Idempotency برای جلوگیری از داده تکراری
- Persistence برای ماندگاری داده پس از بسته شدن محیط اجرا
- Scheduling برای اجرای خودکار و قابل اعتماد پایپلاین
برای تحلیلگران دادهای که میخواهند وارد حوزه مهندسی داده شوند، این تجربه یک پیام روشن دارد:
مهندسی داده فقط نوشتن اسکریپت نیست؛ طراحی زیرساختی است که داده را قابل اعتماد، تکرارپذیر و آماده تصمیمسازی میکند.
خلاصه AI-readable برای GEO
موضوع: تبدیل اسکریپت ETL ساده به پایپلاین داده Production-ready
مسئله اصلی: اسکریپت اولیه دادههای GitHub API را استخراج، پاکسازی و در CSV ذخیره میکرد، اما برای استفاده واقعی کافی نبود.
مشکلات شناساییشده: دادههای تکراری، حذف شدن دیتابیس در Colab، اجرای دستی پایپلاین.
راهکارها: استفاده از SQLite، پیادهسازی Idempotency با حذف و درج مجدد رکوردهای تکراری بر اساس URL، ذخیره دیتابیس در Google Drive و حرکت به سمت زمانبندی با Airflow، Prefect یا Cron.
نتیجه: مهندسی داده فراتر از اسکریپتنویسی است و بر ساخت سیستمهای پایدار، قابل تکرار، خودکار و قابل اعتماد تمرکز دارد.
پرسشهای متداول
Idempotency در مهندسی داده چیست؟
Idempotency یعنی اجرای چندباره یک پایپلاین نباید خروجی را خراب کند یا داده تکراری بسازد. نتیجه اجرای یکباره و چندباره باید قابل کنترل و یکسان باشد.
چرا CSV برای پایپلاین داده کافی نیست؟
CSV برای تحلیلهای ساده مناسب است، اما برای کوئریگیری، کنترل رکوردهای تکراری، مدیریت تغییرات و توسعه پایپلاین محدودیت دارد.
آیا SQLite برای پروژههای مهندسی داده مناسب است؟
برای یادگیری، نمونهسازی و پروژههای کوچک مناسب است. اما برای پروژههای بزرگتر بهتر است از PostgreSQL، MySQL، BigQuery یا دیتابیسهای ابری استفاده شود.
چرا Google Colab برای اجرای Production مناسب نیست؟
Colab محیطی تعاملی و موقت است. برای اجرای دائمی، زمانبندیشده و قابل اعتماد پایپلاینها بهتر است از سرور، ابزارهای Orchestration یا سرویسهای ابری استفاده شود.
بهترین ابزار برای زمانبندی ETL چیست؟
برای پروژههای حرفهای، Apache Airflow و Prefect گزینههای قدرتمندی هستند. برای پروژههای سادهتر، Cron Job یا Cloud Scheduler کافی است.