Data Engineering

تسلط بر Presto: موتور SQL با عملکرد بالا برای کلان‌داده

در مهندسی داده‌های مدرن، سرعت تنها یک لوکس نیست؛ بلکه یک ضرورت است. با انباشتن پتابایت‌ها داده در سیلوهای پراکنده—مانند S3، HDFS، Cassandra و Elasticsearch—نیاز به یک لایه پرس‌وجوی یکپارچه و با عملکرد بالا حیاتی می‌شود. در اینجا Presto (که اکنون به PrestoSQL و Trino تقسیم شده) وارد میدان می‌شود؛ یک موتور پرس‌وجوی SQL توزیع‌شده که برای اجرای پرس‌وجوهای تحلیلی تعاملی روی منابع داده‌ای با اندازه‌های مختلف، از گیگابایت تا اکسابایت، طراحی شده است.

برخلاف چارچوب‌های پردازش دسته‌ای سنتی مانند Hadoop MapReduce یا Spark که برای حداکثر کردن نرخ پردازش (Throughput) به جای کاهش تأخیر بهینه شده‌اند، Presto برای تحلیل‌های تعاملی با تأخیر کم مهندسی شده است. این ویژگی آن را به گزینه‌ای ایده‌آل برای تیم‌های داده‌ای تبدیل می‌کند که نیاز دارند پرس‌وجوهای پیچیده و موردی را در عرض چند ثانیه، نه دقیقه یا ساعت، پاسخ دهند.

درک معماری: سرور اصلی و گره‌های کار

قدرت Presto در معماری کلاینت-سرور آن نهفته است. این سیستم در واقع یک پایگاه داده نیست؛ بلکه یک موتور پرس‌وجو است که از طریق اتصال‌دهنده‌ها (Connectors) به منابع داده‌ای مختلف متصل می‌شود. معماری آن از دو جزء اصلی تشکیل شده است:

  • هماهنگ‌کننده (Coordinator): این گره اتصالات کلاینت را می‌پذیرد، پرس‌وجوهای SQL را تجزیه و تحلیل می‌کند، برنامه‌های اجرایی ایجاد می‌کند و وظایف را به گره‌های کارگر اختصاص می‌دهد. این بخش، مغز عملیات است.
  • گره‌های کارگر (Worker Nodes): این گره‌ها وظایفی را که توسط هماهنگ‌کننده اختصاص داده شده‌اند، اجرا می‌کنند. آن‌ها پردازش واقعی داده‌ها، از جمله فیلتر کردن، تجمیع و پیوند داده‌ها از اتصال‌دهنده‌های مختلف را انجام می‌دهند.

از آنجا که Presto برای مقیاس‌پذیری افقی طراحی شده است، می‌توانید گره‌های کارگر بیشتری را برای مدیریت بارهای پرس‌وجوی در حال افزایش یا حجم‌های داده‌ای بیشتر اضافه کنید، بدون اینکه افت قابل توجهی در عملکرد رخ دهد.

چرا Presto را بر سایر موتورها ترجیح دهیم؟

در حالی که ابزارهایی مانند Apache Spark و Flink در مهندسی داده غالب هستند، آن‌ها اهداف اولیه متفاوتی دارند. Spark یک موتور محاسبات توزیع‌شده همه‌منظوره است که برای خطوط لوله ETL و یادگیری ماشین عالی عمل می‌کند. Presto، با این حال، به‌طور تخصصی برای پرس‌وجوی SQL تعاملی طراحی شده است.

مزایای کلیدی عبارتند از:

  • تأخیر کم: بهینه‌سازی شده برای زمان‌های پاسخ زیر ثانیه تا زیر دقیقه روی مجموعه‌داده‌های بزرگ.
  • پشتیبانی از چندین منبع داده: اتصال به Hive، Kafka، Cassandra، MySQL و فضای ذخیره‌سازی ابری (S3، GCS) بدون نیاز به جابجایی داده‌ها.
  • عدم تکرار داده: پرس‌وجو روی داده‌ها در محل ذخیره‌سازی آن‌ها، که هزینه‌های ذخیره‌سازی و پیچیدگی‌های همگام‌سازی را کاهش می‌دهد.

شروع با یک پرس‌وجوی ساده

یکی از بزرگ‌ترین نقاط قوت Presto، آشنایی آن برای توسعه‌دهندگان SQL است. اگر SQL را بلد باشید، می‌توانید روی Presto پرس‌وجو انجام دهید. در زیر مثالی از نحوه پرس‌وجو روی یک جدول بزرگ ذخیره‌شده در Amazon S3 با استفاده از اتصال‌دهنده Hive آورده شده است.

-- پرس‌وجو روی داده‌های فعالیت کاربر از S3 از طریق اتصال‌دهنده Hive
SELECT 
    user_id,
    COUNT(event_id) AS total_events,
    SUM(amount) AS total_spend
FROM 
    analytics_db.raw_events
WHERE 
    event_date BETWEEN '2023-01-01' AND '2023-12-31'
    AND platform = 'mobile'
GROUP BY 
    user_id
HAVING 
    total_spend > 1000
ORDER BY 
    total_spend DESC
LIMIT 10;

این پرس‌وجو چندین ویژگی کلیدی را نشان می‌دهد: هرس پارتیشن (از طریق event_date)، فیلتر کردن، تجمیع و محدود کردن نتایج. Presto این فیلترها را تا سطح اتصال‌دهنده می‌فرستد (Push-down) و مقدار داده‌های خوانده‌شده از S3 را به حداقل می‌رساند.

بهترین شیوه‌ها برای بهینه‌سازی عملکرد

اگرچه Presto به‌صورت پیش‌فرض قدرتمند است، اما تنظیمات دقیق برای بارهای کاری تولید (Production) ضروری است. در اینجا سه نکته حیاتی آورده شده است:

  1. پارتیشن‌بندی و سطل‌بندی (Bucketing): اطمینان حاصل کنید که داده‌های پایه شما به‌طور منطقی پارتیشن‌بندی شده‌اند (مثلاً بر اساس تاریخ). این کار به Presto اجازه می‌دهد پارتیشن‌های غیرمرتبط را نادیده بگیرد و ورودی/خروجی (I/O) را به شدت کاهش دهد.
  2. محدودیت‌های همزمانی: از ویژگی‌های جلسه (Session properties) برای کنترل تعداد پرس‌وجوهای همزمان استفاده کنید. بارگذاری بیش از حد هماهنگ‌کننده می‌تواند منجر به افزایش تأخیر برای تمام کاربران شود.
  3. خواندن ستون‌های انتخابی: همیشه فقط ستون‌های مورد نیاز خود را انتخاب کنید. Presto می‌تواند فیلترهای ستونی را تا سطح ذخیره‌سازی بفرستد و مقدار داده‌های منتقل‌شده از ذخیره‌سازی را کاهش دهد.

نتیجه‌گیری

Presto تعریف آنچه با تحلیل‌های SQL تعاملی روی کلان‌داده امکان‌پذیر است را تغییر داده است. با جداسازی محاسبات از ذخیره‌سازی و بهره‌گیری از معماری توزیع‌شده، به مهندسان و تحلیل‌گران داده اجازه می‌دهد تا با سرعتی بی‌سابقه، بینش‌هایی را از دریاچه‌های داده‌ای عظیم و ناهمگن استخراج کنند. چه در حال مهاجرت از Hadoop باشید و چه در حال ساخت یک دریاچه داده‌ای جدید (Data Lakehouse)، Presto همچنان یک فناوری بنیادین در لایه داده‌های مدرن باقی مانده است.

برای کسانی که به آینده این پروژه علاقه‌مند هستند، توجه داشته باشید که جامعه توسعه‌دهندگان کد اصلی را به PrestoSQL (تحت حاکمیت بنیاد Presto) و Trino (شاخه‌ای مستقل با رهبری بنیان‌گذاران LinkedIn) تقسیم کرده‌اند. هر دو از یک DNA مشترک برخوردارند و همچنان به نوآوری در پردازش پرس‌وجوهای توزیع‌شده ادامه می‌دهند.

Share: