آورو (AVRO)

آورو (AVRO) یک استاندارد به منظور سریال سازی  داده است که توسط doug cotting  داگ کاتینگ (Doug Cotting) و به منظور فائق آمدن بر مشکل portable نبودن Writable های هدوپ در زبان های مختلف ، معرفی شد.

با در اختیار داشتن چنین استانداردی در تولید فایل، امکان استفاده از آن داده ها در زبان های مختلف (C, C++, C#, Java, JavaScript, Perl, PHP, Python,  و Ruby) فراهم می­گردد. 

انواع داده های آورو و شِما

همانند تمام جایگزین های موجود (protocol buffer, thrift, …) داده های آورو (AVRO) توسط یک شِما (Scheme) که مستقل از زبان برنامه نویسی است، تعریف می­شود. لیکن بر خلاف بقیه آن­ها، تولید کُد کلاس های مربوط به آن شِما در آورو اختیاری است. در هنگام نوشتن فایل آورو (AVRO)، شِمای مربوطه نیز در آن فایل ذخیره شده و در واقع آورو (AVRO)  یک فایل خود توضیح ده (self-descriptive) است و لذا نیازی به تگ عددی مقادیر ذخیره شونده نیست و در نتیجه در حجم داده های ذخیره شونده صرفه جویی می­شود.  

شِمای آورو توسط JSON یا Avro IDL  تعریف می­شود. لازم به ذکر است که داده ها در قالب باینری ذخیره می گردند.

آورو از schema resolution پشتیبانی می کند و بدین معنی است که شِمای مورد استفاده به هنگام نوشتن فایل می­تواند با شِمای مورد استفاده به هنگام خواندن فایل متفاوت باشد.

فایل های آورو قابل فشرده سازی (compression) و جداسازی (splittable) بوده و می­توانند در MapReduce ها به عنوان ورودی استفاده شوند.

ساختار فایل آورو با یک فرمتِ ساده، در بر گیرنده  اشیا (objects) ذخیره شونده در فایل می­باشد که این فایل حاوی یک Header  و یک یا چند بلاک داده بوده و اشیا در این بلاک ها ذخیره می شوند.

Header  شامل متا داده  (meta data) و آرایه ای است که به صورت تصادفی مخصوص این فایل تولید می­شود تا به عنوان جدا کننده  (sync marker) بین بلاک های داده استفاده گردد

سریال سازی در حافظه

آورو،  API هایی را برای سریال سازی (serialization ) و جدا سازی (deserialization) فراهم می کند که و زمانی که می خواهید با آورو، یک سیستم موجود (مانند یک سیستم پیام رسانی که فرم فریم گذاری قبلا تعریف شده ) را ادغام کنید، مفید خواهد بود. در موارد دیگر، از قالب datafile  آورو بایستی استفاده نمود.

فایل های داده آورو

برای خواندن و نوشتن یک فایل آورو می توان از یکی از موارد زیر بهره برد:

۱. specific mapping: استفاده از کلاس های تولید شده روی شِما schema (در این حالت کد کلاس های مورد نظر قبلاً از روی شِما تولید شده و در زمان اجرا قابل استفاده می­باشند ودر واقع یک mapping بین فیلد های تعریف شده در شِما و فیلد های کلاس مورد نظر برقرار شده است) .  

۲. generic mapping: استفاده از امکان GenericRecord در آورو (در این حالت شِما قبل از زمان اجرا مشخص نیست و از شِمای ذخیره شده در داخل فایل استفاده می­شود و mapping به صورت پویا (dynamic) صورت می­پذیرد. در این حالت و در زمانی که کد مثلاً انتظار یک فیلد با تایپ خاص را دارد و شِمای تعریف شده در فایل چیز دیگری می­گوید، امکان بروز خطا وجود دارد).

باید توجه داشت که برای حالت اول، کد کلاس User که قرار است در فایل آورو(Avro)  ذخیره شود، باید توسط پلاگین موجود در Maven و در فاز generate-sources از روی شِمای تعریف شده در پروژه، تولید شود.

قابلیت همکاری

به منظور نشان دادن قابلیت همکاری با زبان آورو ، یک فایل داده را با استفاده از زبان پایتون و جاوا در این فصل نوشته شده است 

ابزار های آورو

پس از تولید فایل آورو(Avro)  مورد نظر، به منظور نمایش داده های ذخیره شده و اطمینان از صحت داده ها میتوان از ابزاری به نام Avro tools استفاده نمود.

java -jar $AVRO_HOME/avro-tools-*.jar tojson user.avro

این ابزار به صورت یک فایل jar  ارائه شده است و میتوان از وب سایت آورو(Avro)   و در قسمت دانلود آخرین ریلیز پایدار را دانلود نمود.

 

تفکیک پذیری شِما

ما می توانیم از یک شِمای دیگر برای خواندن داده ها (reader’s schema) از آن چیزی که ما آن را نوشتیم (writer’s schema) استفاده کنیم. این ابزار قدرتمند باعث تکامل شِما می شود. برای شفاف سازی این موضوع،  بایستی یک شِمای جدید برای جفت های رشته ای به همراه یک فیلد توضیح اضافی را در نظر بگیرید.