در این پست در مورد سه فرمت فایلی که برای اکوسیستم هدوپ وجود دارند صحبت می کنیم و برخی از ویژگی های رایج فرمت فایل ها را بررسی و آنها را با یکدیگر مقایسه می کنیم.
هدوپ مانند هر سیستم فایل استاندارد، به شما امکان می دهد اطلاعات را در هر قالبی، چه داده های ساختار یافته، نیمه ساختاریافته یا بدون ساختار ذخیره کنید. علاوه براین از فرمت های بهینه برای ذخیره سازی و پردازش در HDFS نیز پشتیبانی می کند. برای ذخیره و پردازش داده ها در هدوپ، انتخاب های زیادی دارید که می توانید بسته به نیازتان از آنها استفاده کنید. در حقیقت هدوپ فرمت فایل پیشفرضی ندارد و انتخاب فرمت مناسب فایل بستگی به استفاده شما دارد.
داده ها ممکن است در فرمتی قابل خواندن برای ما مانند JSON ،XML یا به صورت فایل CSV باشند، اما این بدان معنا نیست که این بهترین راه برای ذخیره واقعی داده ها در هدوپ است.
در واقع ذخیره داده ها به صورت متنی در فرمت JSON یاCSV بسیار ناکارآمد است زیرا این فرمت های فایل را نمی توان به صورت موازی ذخیره کرد و همچنین جستجوی فیلد خاص را زمانبر می کند به دلیل اینکه هیچگونه ایندکسی روی داده ها وجود ندارد و باید تک تک رکوردها برای یافتن یک داده خاص جستجو شوند. علاوه براین اینگونه فایل ها حجم بالایی را اشغال می کنند؛ بنابراین اگر بتوان فایل را به نحوی فشرده کرد، حجم زیادی از دیسک صرفه جویی می شود.
دراین راستا فرمت فایل های بهینه ای برای کار با کلان داده توسعه یافته است که عبارتند از:
باتوجه به اینکه این فرمتهای فایل شباهتهایی با هم دارند، اما هر یک از آنها منحصر به فرد می باشند و ویژگی های خاص خود را دارند. این ویژگی ها عبارتند از:
1. هر سه فرمت برای ذخیره سازی در هدوپ بهینه شده اند و درجاتی از فشرده سازی را ارائه می دهند.
2. برخلاف فرمت فایل CSV یا JSON که قابل خواندن برای ما هستند، سه فرمت مذکور، فرمتهای باینری قابل خواندن توسط ماشین هستند.
3. فایلهای ذخیره شده در فرمتهای Parquet ،Avro و ORC را میتوان در چندین دیسک تقسیم کرد که به مقیاسپذیری و پردازش موازی کمک میکند، درحالیکه فایل های CSV یا JSON این قابلیت را ندارند.
4. هر سه فرمت خود توصیفی(Self-Describing) هستند. به این معنی است که شمای داده را در فایلهای خود دارند. یعنی شما می توانید از یک فایل Parquet ،Avro یا ORC که در یک کلاستر است، استفاده کنید و آن را در سیستم دیگری بارگذاری کنید. در این شرایط سیستم، داده ها را تشخیص داده و قادر به پردازش آنها خواهد بود.
5. بزرگترین تفاوت بین Parquet ،Avro و ORC در نحوه ذخیره داده ها است. Parquet و ORC هر دو داده ها را به صورت ستونی (Column-Base) ذخیره می کنند، درحالیکه Avroداده ها را در فرمت ردیفی (Row-Base) ذخیره می کند.
برای درک بهتر، ابتدا بیایید ببینیم فرمت ردیفی و ستونی چگونه می باشند. فرض کنید یک جدول با سه فیلد ID، Name Department داریم:
برای این جدول، داده ها در فرمت ذخیره سازی ردیفی به صورت زیر نگهداری می شوند:
در حالی که، همان داده ها در فرمت ذخیره سازی ستونی به شکل زیر خواهند بود:
در یک فرمت ستونی، مقادیر هر ستون از همان نوع در رکوردها با هم ذخیره می شوند. این فرمت ذخیره سازی زمانی مفید است که شما نیاز به پرس و جوی چند ستون از یک جدول دارید. در این صورت فقط ستون های مورد نیاز که در مجاور یکدیگر هستند، خوانده می شوند.
در مثال بالا فرض کنید فقط ستون Name را میخواهیم. در این صورت در فرمت ذخیره سازی ردیفی، هر رکورد در مجموعه داده باید بارگیری شود و فیلدها بررسی شوند تا داده ها برای فیلد Name استخراج شوند. اما فرمت ذخیره سازی ستونی می تواند مستقیماً به ستون Name برود زیرا همه مقادیر آن ستون با هم ذخیره می شوند و نیازی به بررسی کل رکوردها نمی باشد؛ بنابراین فرمت ذخیره سازی ستونی سرعت جستجو را افزایش می دهد زیرا زمان کمتری برای رفتن به ستون های مورد نیاز لازم دارد. علاوه برآن فرمت ستونی زمان مراجعه به دیسک را کاهش می دهد به دلیل اینکه فقط باید ستون هایی را بخواند که داده های آنها مورد نیاز است.
فرمت فایل Avro:
فرمت فایل Parquet:
فرمت فایل ORC:
به طورکلی در فرمت فایل های ستونی، سرعت خواندن داده ها بالا است؛ بنابراین برای کارهای تحلیلی مناسب می باشند، در حالی که در فرمت فایل های ردیفی، سرعت نوشتن داده ها زیاد است؛ بنابراین برای کارهای تراکنش سنگین نوشتن مناسب می باشند.
در پردازش های انبوه و همچنین هنگام نیاز به تحلیل های آماری داده ها، معمولاً به یک فیلد خواص از داده ها نیاز داریم به عنوان مثال اگر یک شرکت بزرگ با یک میلیون کارمند را در نظر بگیرید که در آن مدیر اجرایی می خواهد حقوق پرداختی به کارمندان را به تفکیک هر مکان جستجو کند، در این صورت اگر مجموعه دادههای حقوق و موقعیت مکانی به صورت ستونی ذخیره شوند، به یک پرس و جو نسبتاً ساده نیاز است که فقط باید دادههای آن دو ستون واکشی شوند. اما اگر این کار به صورت ردیفی انجام شود، باید میلیونها ردیف واکشی شود و عملیات را روی هر یک از ردیفها انجام داد.
با این حال در شرایطی که میخواهید روی تعداد کمی از ستونها از کل مجموعه دادههای خود تحلیل کنید، فرمت ستونی در مقایسه با فرمت های مبتنی بر ردیف بسیار بهتر است.
حال فرض کنید می خواهید پروازهای هواپیمایی موجود را در یک صفحه وب به کاربر نمایش دهید. در این صورت بهتر است از فرمت ذخیره سازی ردیفی استفاده کنید، زیرا میخواهید اطلاعات زیادی در مورد هر ورودی خاص دریافت کنید. به طور مثال تمام اطلاعات پرواز از ساعت 9 صبح تا ساعت 1 بعد از ظهر امروز.
فرمت Avroدر مقابل Parquet:
فرمت ORC در مقابل Parquet
و در آخر...
باید پلتفرم/چارچوب مورد استفاده خود را هنگام انتخاب فرمت داده در نظر بگیرید، زیرا فرمت های داده بسته به محل استفاده، متفاوت عمل می کنند.
منابع:
https://www.datanami.com/2018/05/16/big-data-file-formats-demystified/
https://www.clairvoyant.ai/blog/big-data-file-formats
https://bryteflow.com/how-to-choose-between-parquet-orc-and-avro/