فرمت های فایل در هدوپ: Parquet ،Avro و ORC

در این پست در مورد سه فرمت­ فایلی که برای اکوسیستم هدوپ وجود دارند صحبت می­ کنیم و برخی از ویژگی های رایج فرمت فایل­ ها را بررسی و آنها را با یکدیگر مقایسه می­ کنیم.هدوپ مانند هر سیستم فایل استاندارد، به شما امکان می­ دهد اطلاعات را در هر قالبی، چه داده ­های ساختار یافته، نیمه ساختاریافته یا بدون ساختار ذخیره کنید. علاوه ­براین از فرمت ­های بهینه برای ذخیره ­سازی و پردازش در HDFS نیز پشتیبانی می­ کند. برای ذخیره و پردازش داده ­ها در هدوپ، انتخاب­ های زیادی دارید که می ­توانید بسته به نیازتان از آنها استفاده کنید. در حقیقت هدوپ فرمت فایل پیش­فرضی ندارد و انتخاب فرمت مناسب فایل بستگی به استفاده شما دارد.داده ­ها ممکن است در فرمتی قابل خواندن برای ما مانند JSON ،XML یا به صورت فایل CSV باشند، اما این­ بدان­ معنا نیست که این بهترین راه برای ذخیره واقعی داده­ ها در هدوپ است. در واقع ذخیره داده­ ها به صورت متنی در فرمت JSON یاCSV بسیار ناکارآمد است زیرا این فرمت­ های فایل را نمی ­توان به صورت موازی ذخیره کرد و همچنین جستجوی فیلد خاص را زمانبر می­ کند به دلیل اینکه هیچگونه ایندکسی روی داده­ ها وجود ندارد و باید تک تک رکوردها برای یافتن یک داده خاص جستجو شوند. علاوه­ براین اینگونه فایل ­ها حجم بالایی را اشغال می­ کنند؛ بنابراین اگر بتوان فایل را به نحوی فشرده کرد، حجم زیادی از دیسک صرفه جویی می­ شود.دراین ­راستا فرمت فایل­ های بهینه­ ای برای کار با کلان داده توسعه یافته است که عبارتند از:فرمت Avroفرمت Parquetفرمت Optimized Row Columnar) ORC)باتوجه­ به اینکه این فرمت‌های فایل شباهت‌هایی با هم دارند، اما هر یک از آنها منحصر به فرد می باشند و ویژگی های خاص خود را دارند. این ویژگی ها عبارتند از: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:یک فرمت ذخیره سازی ردیفی که قادر به فشرده سازی داده ها به­ طور کارآمد می ­باشد. فرمت Avro یک پروتکل ذخیره باینری داده هاست که خدمات سریال سازی (Data Serialization) و انتقال داده را ارائه می دهد.داده ها را در فرمت JSON ذخیره می­ کند تا داده ها به راحتی خوانده و تفسیر شوند.یکی از ویژگی های کلیدی فرمت Avro پشتیبانی قوی از شمای(schema) داده است که در طول زمان تغییر می کند. Avro تغییرات شمای داده مانند فیلدهای از دست رفته، فیلدهای اضافه شده و فیلدهای تغییر یافته را کنترل می کند.این فرمت فایل قابلیت انعطاف پذیری بالایی دارد اما در مقایسه با فرمت های فایل ستونی، میزان فشرده سازی آن کمتر است.به دلیل فرمت ذخیره سازی ردیفی آن برای جستجوی سریع در فایل، بهینه نمی ­باشد.با این حال اگر قصد دارید داده های خود را به صورت JSON در هدوپ ذخیره کنید که بعدها به راحتی بتوانید داده ها را تغییر دهید، Avro برای این کار مناسب است.فرمت فایل Parquet:این فرمت فایل توسط کلودرا و توییتر در سال 2013 ایجاد شد.از ویژگی های منحصر به فرد Parquet این است که می تواند داده ها را با ساختارهای تو در تو به صورت ستونی ذخیره کند. با این وجود فیلدهای تودرتو را می توان به صورت جداگانه و بدون خواندن تمام فیلدهای ساختار تودرتو خواند.این فرمت برای کار با حجم عظیمی از داده های پیچیده مناسب است و گزینه های فشرده سازی و رمزگذاری(Encoding) داده های مختلفی را ارائه می دهد.این فرمت فایل برای خواندن ستون‌های خاص از جداول بزرگ بسیار مفید است، زیرا تنها می‌تواند ستون‌های مورد نیاز را به جای کل جدول بخواند. این امر منجر به پردازش سریع‌تر داده‌ها می‌شود و زمان مراجعه به I/O را کاهش می دهد.قابلیت ذخیره سازی ستونی موجب می­ شود، داده های غیر مرتبط را به سرعت در حین پرس و جو فیلتر کند.کدک‌های مختلفی برای فشرده‌سازی داده‌ها وجود دارد و فایل‌های داده می‌توانند انواع فشرده‌سازی متفاوتی داشته باشند.فرمت فایل ORC:این فرمت برای خواندن، نوشتن و پردازش داده ها در Hive بهینه شده است و توسط Hortonworks در سال 2013 برای افزایش سرعت Hive ایجاد شد.فرمت فایل ORC مجموعه‌ای از ردیف‌ها را در یک فایل ذخیره می‌کند به این صورت که هر ردیف از داده فرمت ستونی دارد.داده‌ها را به صورت فشرده ذخیره می‌کند و امکان پرش از قسمت‌های غیر مرتبط را بدون نیاز به ایندکس­گذارهای پیچیده یا دستی فراهم می­آورد.از انوع داده اعشاری، تاریخ و انواع پیچیده (struct ،list ،map و union) پشتیبانی می­کند.قابلیت خواندن همزمان از یک فایل با استفاده از RecordReaderهای جداگانه را ممکن می­ سازد.به طورکلی در فرمت فایل های ستونی، سرعت خواندن داده ها بالا است؛ بنابراین برای کارهای تحلیلی مناسب می باشند، در حالی که در فرمت فایل های ردیفی، سرعت نوشتن داده ها زیاد است؛ بنابراین برای کارهای تراکنش سنگین نوشتن مناسب می باشند. در پردازش های انبوه و همچنین هنگام نیاز به تحلیل های آماری داده ها، معمولاً به یک فیلد خواص از داده ها نیاز داریم به عنوان مثال اگر یک شرکت بزرگ با یک میلیون کارمند را در نظر بگیرید که در آن مدیر اجرایی می خواهد حقوق پرداختی به کارمندان را به تفکیک هر مکان جستجو کند، در این صورت اگر مجموعه داده‌های حقوق و موقعیت مکانی به صورت ستونی ذخیره ‌شوند، به یک پرس و جو نسبتاً ساده نیاز است که فقط باید داده‌های آن دو ستون واکشی شوند. اما اگر این کار به صورت ردیفی انجام شود، باید میلیون‌ها ردیف واکشی شود و عملیات را روی هر یک از ردیف‌ها انجام داد.با این حال در شرایطی که می‌خواهید روی تعداد کمی از ستون‌ها از کل مجموعه داده‌های خود تحلیل کنید، فرمت ستونی در مقایسه با فرمت­ های مبتنی­ بر ردیف بسیار بهتر است. حال فرض کنید می خواهید پروازهای هواپیمایی موجود را در یک صفحه وب به کاربر نمایش ‌دهید. در این صورت بهتر است از فرمت ذخیره سازی ردیفی استفاده کنید، زیرا می‌خواهید اطلاعات زیادی در مورد هر ورودی خاص دریافت کنید. به طور مثال تمام اطلاعات پرواز از ساعت 9 صبح تا ساعت 1 بعد از ظهر امروز.مقایسه بین فرمت های مختلف فایلفرمت Avroدر مقابل Parquet:فرمت Avro یک فرمت ذخیره سازی مبتنی بر ردیف است، در حالی که Parquet یک فرمت ذخیره سازی مبتنی بر ستون است.فرمت Parquet برای پرس و جوی تحلیلی بسیار بهتر است، یعنی برای خواندن و پرس و جو بسیار کارآمدتر است اما در عملیات نوشتن Avro بهتر از Parquet است.فرمت Avro از تغییرات شمای داده یعنی افزودن و اصلاح ستون­ ها در طول زمان پشتیبانی می­ کند. در حالی که Parquet قادر به انجام اینکار نیست.فرمت Parquet برای پرس و جوی زیر مجموعه ای از ستون ها در جدول چند ستونی بسیار مناسب است. در­حالی­که Avro در زمان­ هایی که باید تمام ستون ها را پرس و جو کنیم مناسب­ است.فرمت ORC در مقابل Parquetفرمت Parquet توانایی بیشتری در ذخیره داده های تودرتو دارد.فرمت ORC از ویژگی های ACID پشتیبانی می کند.فشرده سازی داده ها در ORC نسبت به Parquet کارآمدتر است.سرعت پاسخگویی ORC به دلیل ساختار ایندکس گذاری مناسب آن که نیاز به خواندن کل فایل را از بین می برد، نسبت به Parquet بیشتر است.و در آخر...باید پلتفرم/چارچوب مورد استفاده خود را هنگام انتخاب فرمت داده در نظر بگیرید، زیرا فرمت های داده بسته به محل استفاده، متفاوت عمل می کنند. فرمت Avro اغلب انتخاب خوبی برای Kafka است. فرمت ORC برای Hiveبهترین است. (زیرا برای Hiveساخته شده است). چارچوب Spark پشتیبانی بسیار خوبی برای پردازش فرمت های Parquet ارائه می دهد.منابع:https://www.datanami.com/2018/05/16/big-data-file-formats-demystified/https://www.clairvoyant.ai/blog/big-data-file-formatshttps://bryteflow.com/how-to-choose-between-parquet-orc-and-avro/