Metabase

جدول _metabase_metadata

چیزهایی که مهندسان داده باید درباره متابیس بدانند.

متابیس برای مهندسان داده

چیزهایی که مهندسان داده باید درباره متابیس بدانند.

  • متابیس یک ابزار تجسم داده بر اساس فلسفه تحلیل‌های self-service است. ما می‌خواهیم همه بتوانند سؤال‌های خود را درباره داده خود بپرسند. چقدر آسان خواهد بود برای مشتریان که سؤال بپرسند به داده‌ای که در دسترس دارند و نحوه مدل کردن آن داده بستگی دارد.
  • متابیس یک برنامه وب self-contained است که REST APIها را expose می‌کند: می‌توانید از UI متابیس استفاده کنید، یا می‌توانید از طریق REST API ما با آن صحبت کنید. می‌توانید آن را با بقیه stack خود با فقط فراخوانی‌های HTTP یکپارچه کنید.
  • مثل هر ابزار داده، به مجوزها توجه کنید. اگر به متابیس یک حساب root در پایگاه داده خود بدهید، هر کسی که دسترسی SQL در متابیس دارد می‌تواند هر کاری که یک کاربر root می‌تواند انجام دهد، پس درباره اعتبارنامه‌هایی که برای اتصال متابیس به پایگاه داده خود استفاده می‌کنید و مجوزهایی که به گروه‌های متابیس می‌دهید deliberate باشید.

متابیس به عنوان یک کلاینت به پایگاه‌های داده

متابیس از درایورهای JDBC برای اتصال به پایگاه‌های داده استفاده می‌کند، اما از درایورهای pure استفاده نمی‌کنیم: آن‌ها را در کد Clojure wrap می‌کنیم (بک‌اند متابیس در Clojure نوشته شده است). این wrapping را به دلیلی انجام می‌دهیم: درایورهای ما abstractionهای سطح بالا هستند که انواع داده پایگاه داده را به انواع داده ساده‌تر که مشتریان می‌توانند درک کنند تبدیل می‌کنند. درایورهای ما همچنین فراداده را از پایگاه داده شما pull می‌کنند تا متابیس بتواند یاد بگیرد چگونه با داده شما کار کند.

نباید انتظار همان زمان پاسخ از یک پرس‌وجو که در متابیس اجرا می‌کنید در مقایسه با یک پرس‌وجو اجرا شده از یک کلاینت بومی (یا، اگر پایگاه داده شما یک محصول SaaS است، کنسول وب پایگاه داده) داشته باشید. اما فقط چند میلی‌ثانیه صحبت می‌کنیم: زمانی که متابیس نیاز دارد این اشیاء Java که پروتکل JDBC با آن‌ها صحبت می‌کند را به JSON تبدیل کند.

انواع پایگاه داده و متابیس

متابیس بسیاری از پایگاه‌های داده را به طور رسمی و برخی دیگر را به طور غیررسمی (از طریق درایورهای انجمن) پشتیبانی می‌کند. اگر نیاز به اتصال به پایگاهی دارید که ما پشتیبانی نمی‌کنیم، بررسی کنید که آیا موتور پایگاه داده شما می‌تواند پرس‌وجوهای federated به موتورهای دیگر انجام دهد. بسیاری از موتورهای پایگاه داده از اتصال به انواع مختلف سرویس‌ها پشتیبانی می‌کنند، و اگر این اتصال‌ها کار کنند، می‌توانید از متابیس به خوبی استفاده کنید.

اگر هیچ راهی برای اتصال متابیس به پایگاه داده خود ندارید، می‌توانید داده خود را به یک پایگاه داده پشتیبانی شده pipe کنید. محصولات زیادی در بازار وجود دارند که به شما اجازه می‌دهند یک منبع و مقصد انتخاب کنید، و در چند ساعت، آماده خواهید بود.

فرآیندهای async و فراداده

برای آسان کردن پرسیدن سؤال از داده شما برای مشتریان، متابیس metadata را sync می‌کند از پایگاه داده شما:

  • Sync و scan: متابیس لیست schemaها، جداول، ستون‌ها، و انواع داده ستون را می‌پرسد.
  • دریافت مقادیر فیلتر: در طول این فرآیند، متابیس پرس‌وجوهایی به پایگاه داده شما fire می‌کند که اولین 1000 مقدار منحصر به فرد هر فیلد متنی که پیدا می‌کند را می‌پرسد.
  • Fingerprinting: این فرآیند بعد از دو مورد اول اجرا می‌شود. نمونه‌ای از اولین 10000 مقدار اعداد و تاریخ‌ها می‌گیرد تا minimum، maximum، و average هر فیلد را درک کند. این به متابیس کمک می‌کند محورهای x و y بهتری روی نمودارها ارائه دهد، و بیشتر.

متابیس همچنین نظراتی که به جداول و ستون‌ها در statementهای CREATE TABLE خود اضافه می‌کنید را pick up می‌کند. این نظرات را در مرجع داده، و همچنین سازنده کوئری و نمای جدول (hover روی یک ستون برای دیدن توضیحات آن) نمایش می‌دهد.

می‌توانید فرآیندهای sync و scan را از ساعتی به روزانه تغییر دهید. همچنین می‌توانید sync و scan را برای جداول خاص خاموش کنید.

همچنین می‌توانید دریافت مقادیر فیلتر و fingerprinting را خاموش کنید، اما باید پیامدها را درک کنید:

غیرفعال کردن فرآیند "دریافت مقادیر فیلتر"

غیرفعال کردن این فرآیند انتخاب خوبی است اگر پایگاه داده شما جداول عظیم دارد یا به سادگی به بندهای LIMIT اهمیت نمی‌دهد و یک scan کامل ستون انجام می‌دهد، مثل BigQuery.

پیامد: مشتریان لیست مقادیر در دسترس را هنگام تلاش برای فیلتر کردن روی یک فیلد متنی در سؤال‌ها و داشبوردها نمی‌بینند. باید یا یک مقدار در یک input یا جعبه جستجو وارد کنند. اگر فیلد را برای نمایش یک جعبه جستجو پیکربندی کنید، متابیس یک statement پرس‌وجوی LIKE به پایگاه داده fire می‌کند تا به دنبال مقداری که شخص وارد می‌کند بگردد، پس احتیاط کنید اگر پایگاه داده شما با آن نوع پرس‌وجوها مشکل دارد.

اگر حتی رویکرد جعبه جستجو یک مشکل است، ممکن است بخواهید دریافت مقادیر فیلد را از طریق یک فرآیند خارجی در نظر بگیرید. می‌توانید آن مقادیر را به طور کارآمدتر grab کنید، سپس مقادیر فیلتر را در داشبوردهای متابیس از طریق یک فراخوانی API populate کنید. به عنوان مثال، می‌توانید یک pipeline داده ایجاد کنید که پایگاه داده شما را برای دریافت مقادیر منحصر به فرد یک ستون از طریق statementهای بهینه‌شده (مثلاً، HLL یا approximate count) پرس‌وجو می‌کند، و سپس API متابیس را برای به‌روزرسانی فیلترها در داشبوردها فراخوانی کند.

غیرفعال کردن fingerprinting

وقتی روی عنوان‌های ستون hover می‌کنید، ممکن است ببینید که داده off است: مثل maximumها، minimumها، یا averageهایی که درست نیستند.

نحوه شناسایی پرس‌وجوهایی که متابیس به پایگاه داده می‌فرستد

فرآیندهای sync و scan:

  • پرس‌وجو از information schema، یا هر schema که پایگاه داده شما برای نگه داشتن inventory از schemaها، جداول، و ستون‌ها استفاده می‌کند، یا
  • پرس‌وجو SELECT TRUE یا SELECT 1 روی جداول خاص.

اگر پرس‌وجو با LIMIT 1000 پایان می‌یابد، پس فرآیند get-filter-values را می‌بینید، در حالی که اگر پرس‌وجوهایی می‌بینید که با LIMIT 10000 پایان می‌یابند، پس احتمالاً پرس‌وجوهای fingerprinting را می‌بینید. نمی‌توانید آن محدودیت‌ها را override کنید. محدودیت‌ها تعیین می‌کنند چگونه و چه داده‌ای در برنامه نمایش داده می‌شود، مثل فیلترها یا نمودارها.

ملاحظات عملکرد

همانطور که پایگاه‌های داده در اندازه رشد می‌کنند، برخی پرس‌وجوهای فراداده ممکن است بسیار پرهزینه برای اجرا باشند. به عنوان مثال، اگر پایگاه داده شما 500 میلیون ردیف دارد، ممکن است نخواهید متابیس پرس‌وجوهایی برای fingerprint کردن داده یا دریافت مقادیر فیلد در زمان‌های تصادفی اجرا کند. توصیه می‌کنیم احتیاط‌های زیر را وقتی داده شما به طور قابل توجهی رشد می‌کند (هم وقتی جداول از نظر ردیف بزرگ می‌شوند و هم وقتی پایگاه داده شما بیش از 100 جدول دارد) انجام دهید:

  • به تنظیمات پایگاه داده خود در تنظیمات Admin > پایگاه‌های داده بروید.
  • انتخاب زمان sync و scan را فعال کنید.
  • cadence sync و scan را به هفتگی تنظیم کنید.
  • Scan برای مقادیر فیلتر را به "هرگز، در صورت نیاز به صورت دستی انجام می‌دهم" یا به "وقتی یک فیلتر اضافه می‌شود" تنظیم کنید.
  • fingerprinting را غیرفعال نگه دارید.

عدد "100 جدول" که در بالا ذکر می‌کنیم به شدت به سرعت اجرای پرس‌وجوهای شما بستگی دارد. اگر 100 جدول از 5 ردیف هر کدام با 10 ستون دارید، این همان 100 جدول از 500 ستون هر کدام با 10 میلیون ردیف نیست، پس این توصیه را با grain of salt در نظر بگیرید.

endpoint notify

متابیس یک endpoint خاص طراحی شده به خصوص برای pipelineهای داده و/یا پایگاه‌های داده بسیار بزرگ دارد. این endpoint به متابیس می‌گوید وقتی یک pipeline داده اجرای خود را تمام کرده است تا متابیس بتواند به یک جدول یا schema خاص برود و آن را crawl کند.

اگر داده شما به اندازه کافی بزرگ است، یا اگر نیاز دارید به متابیس در هر لحظه بگویید روی یک جدول یا schema خاص برود (شاید کار ساعتی کافی نیست یا بسیار پرهزینه است)، استفاده از endpoint notify و گذاشتن کار sync برای اجرای فقط یک بار در روز را در نظر بگیرید.

endpoint در دو flavor می‌آید، که نیاز به ID داخلی پایگاه داده متابیس در URL دارد:

  • /api/notify/db/<id>: endpoint جداول شناخته شده را rescan می‌کند

این endpoint نیاز به پارامترهای زیر دارد که در body فراخوانی HTTP پاس داده می‌شوند:

  • scan: 'full' یا 'schema'، به معنای اینکه می‌خواهید متابیس روی همه schemaها یا یک مورد خاص برود
  • table_name یا table_id: می‌خواهید متابیس روی یک جدول خاص برود، نه همه. مفید برای syncهای atomic.
  • synchronous: اگر می‌خواهید متابیس فرآیند را فوراً شروع کند، یا آن را برای چند دقیقه بعد schedule کند (وقتی task runner داخلی شروع به polling برای کارهای در دسترس می‌کند). مفید اگر مشتریان نیاز دارند تغییرات به‌روزرسانی شده را در اسرع وقت ببینند.
  • /api/notify/db/<id>/new-table: endpoint یک جدول جدید در پایگاه داده جستجو می‌کند و آن را scan می‌کند.

این endpoint نیاز به نام جدول جدید و نام schema دارد. این پارامترها باید در body فراخوانی HTTP باشند.

ذخیره‌سازی فراداده

متابیس همه فراداده را در پایگاه داده برنامه ذخیره می‌کند. اگر در نقطه‌ای متابیس نتواند یک schema، جدول، یا ستون که قبلاً آنجا بود را پیدا کند، رکورد را در پایگاه داده برنامه متابیس soft delete می‌کند (یک flag در پایگاه داده قرار می‌دهد تا کاملاً آن را از UI پنهان کند).

به متابیس دسترسی به داده‌ای که مشتریان هرگز پرس‌وجو نمی‌کنند ندهید. اگر متابیس به آن اشیاء در پایگاه داده دسترسی پیدا کند و آن‌ها را sync کند، برای همیشه آنجا نگه داشته می‌شوند—حتی اگر دسترسی به آن‌ها را حذف کنید. داشتن آن جداول در آنجا هیچ نوع جریمه عملکردی در بک‌اند متابیس ایجاد نمی‌کند، اما backupهای پایگاه داده برنامه متابیس را بزرگ‌تر از آنچه نیاز است می‌کند.

جدول _metabase_metadata

اگر هیچ نظری روی statementهای CREATE TABLE خود اضافه نکرده‌اید یا پایگاه داده شما به سادگی از آن پشتیبانی نمی‌کند، می‌توانید یک جدول خاص در پایگاه داده با ساختار زیر ایجاد کنید:

CREATE TABLE public._metabase_metadata (
    keypath character varying(255) NOT NULL,
    value character varying(255)
);
INSERT INTO public._metabase_metadata VALUES
    ('table.description', 'This is a table description'),
    ('table.field.description', 'This is a field description');

می‌توانید از این الگو برای insert کردن فراداده مورد نظر خود برای جداول و فیلدها استفاده کنید.

[

](metabase-at-scale.html)

[

](metabase-api.html)