أقسام الخلية والدلاء مع الأمثلة

⚡ ملخص ذكي

الأقسام والمجموعات هي الطريقتان اللتان يقسم بهما Apache Hive بيانات الجدول على القرص: يقوم القسم بإنشاء دليل واحد لكل قيمة مفتاح، بينما تقوم المجموعة بتجزئة الصفوف إلى عدد ثابت من الملفات.

  • 🗂️ القسم عبارة عن دليل: تصبح كل قيمة مميزة لمفتاح التقسيم دليلاً فرعياً خاصاً بها ضمن مجلد الجدول في نظام ملفات Hadoop الموزع (HDFS).
  • ✂️ تقليم الأقسام: الاستعلام الذي يقوم بالتصفية بناءً على مفتاح التقسيم يقرأ فقط الدلائل المطابقة بدلاً من مسح الجدول بأكمله.
  • ⚙️ الوضع الديناميكي مطلوب: يتطلب تحميل العديد من الأقسام من استعلام SELECT ضبط hive.exec.dynamic.partition.mode على الوضع غير الصارم.
  • 🧮 Bucket عبارة عن ملف: تقوم الدالة CLUSTERED BY بتجزئة العمود المختار وكتابة كل صف في واحد من عدد ثابت من الملفات.
  • 🔍 أخذ العينات والوصلات: تدعم الجداول المصنفة عمليات قراءة TABLESAMPLE الفعالة وعمليات الربط بين الجداول المصنفة من جانب الخريطة، وهو ما لا تستطيع الجداول العادية فعله.
  • 📐 اختر حسب العدد: قم بالتقسيم بناءً على الأعمدة ذات العدد القليل من القيم مثل الولاية أو التاريخ، وقم بتجميع الأعمدة ذات العدد الكبير من القيم مثل معرفات المستخدم.

شرح أقسام ومجموعات Hive مع مثال عملي

تُعدّ الجداول والأقسام والمجموعات أجزاءً من نمذجة بيانات Hive. يُعرّف الجدول المخطط، ويقسم القسم هذا الجدول إلى مجلدات على القرص، وتقسم المجموعة البيانات داخل المجلد إلى عدد ثابت من الملفات.

ما هي الأقسام؟

تُعدّ أقسام Hive طريقةً لتنظيم الجداول في أقسامٍ عن طريق تقسيمها إلى أجزاءٍ مختلفةٍ بناءً على مفاتيح التقسيم. فعليًا، يُمثّل كل قسمٍ مجلدًا فرعيًا منفصلًا ضمن مجلد الجدول في نظام ملفات Hadoop الموزع (HDFS)، وهو ما يسمح لـ Hive بتجاهل البيانات التي لا يحتاجها.

تُعدّ خاصية التقسيم مفيدةً عندما يحتوي الجدول على مفتاح تقسيم واحد أو أكثر. تُشكّل مفاتيح التقسيم عناصر أساسية لتحديد كيفية تخزين البيانات في الجدول. لا يُخزّن مفتاح التقسيم داخل ملفات البيانات نفسها، بل تُشفّر قيمته في اسم المجلد، لذا يُمكن للاستعلام الذي يُصفّي البيانات بناءً على هذا المفتاح أن يتجاهل مجلدات كاملة قبل قراءة أي صف. يُطلق على هذه العملية اسم "تقليم التقسيم".

على سبيل المثال: -

لدى العميل بيانات تجارة إلكترونية خاصة بعملياته في الهند، حيث تُذكر عمليات كل ولاية (38 ولاية) كوحدة واحدة. إذا استخدمنا عمود الولاية كمفتاح تقسيم، وقمنا بتقسيم بيانات الهند ككل، فسنحصل على عدد الأقسام (38 قسمًا)، وهو ما يساوي عدد الولايات (38) الموجودة في الهند. وبذلك، يمكن عرض بيانات كل ولاية على حدة في جداول الأقسام.

عينة Code مقتطف برمجي للأقسام

تُنفَّذ الأوامر الستة التالية بالتسلسل في واجهة Hive. كل أمر منها يُمثِّل خطوة منفصلة، ​​وتُظهر لقطات الشاشة التالية نفس التسلسل أثناء تنفيذه على مجموعة حوسبة حقيقية.

  1. إنشاء جدول allstates
    create table allstates(state string, District string,Enrolments string)
    
    row format delimited
    
    fields terminated by ',';
    
  2. جارٍ تحميل البيانات في الجدول الذي تم إنشاؤه allstates
    Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
  3. إنشاء جدول الأقسام
    create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
  4. للتقسيم علينا تعيين هذه الخاصية
    set hive.exec.dynamic.partition.mode=nonstrict
  5. تحميل البيانات في جدول الأقسام
    INSERT OVERWRITE TABLE state_part PARTITION(state)
    SELECT district,enrolments,state from  allstates;
  6. المعالجة الفعلية وتشكيل جداول الأقسام بناءً على الحالة كمفتاح قسم

سيكون هناك 38 قسمًا مُخرجًا في وحدة تخزين HDFS، وسيُسمى الملف باسم الحالة. سنتحقق من ذلك في هذه الخطوة.

تُظهر لقطات الشاشة التالية تنفيذ الكود المذكور أعلاه.

في الشاشة الأولى، يتم تنفيذ الخطوة 1 عند خلية> يقوم الموجه بإنشاء أولستاتس جدول بثلاثة أعمدة وفاصلة كفاصل بين الحقول.

إنشاء جدول allstates باستخدام Hive shell بثلاثة أعمدة مفصولة بعلامات

تغطي الشاشة التالية الخطوتين 2 و3: يتم تحميل ملف AllStates.csv في أولستاتسوالجدول المقسم جزء من الولاية يتم إنشاؤها باستخدام الحالة المعلنة كمفتاح للتقسيم.

تحميل ملف AllStates.csv إلى مجلد allstates وإنشاء الجدول المقسم state_part

تظهر الخطوتان 4 و 5 بعد ذلك. تم ضبط وضع التقسيم الديناميكي على الوضع غير الصارم، ويؤدي بيان INSERT OVERWRITE إلى تشغيل مهمة MapReduce التي تُظهر سطور سجلها تحميل قسم واحد لكل قيمة حالة.

يتم تحميل مخرجات مهمة MapReduce عن طريق تحميل قسم واحد من Hive لكل قيمة حالة

يؤكد عرض دليل المستودع في نظام ملفات Hadoop الموزع (HDFS) نتيجة الخطوة 6 - حيث يُظهر النظام 38 عنصرًا، واحد منها state_part/state= دليل لكل ولاية.

قائمة HDFS تعرض 38 دليل تقسيم state_part في مستودع Hive

من الكود أعلاه، نقوم بالأشياء التالية

  1. إنشاء جدول باسم allstates يحتوي على 3 أعمدة بأسماء مثل الولاية والمنطقة والتسجيلات
  2. جارٍ تحميل البيانات في جدول allstates
  3. إنشاء جدول الأقسام مع الحالة كمفتاح القسم
  4. في هذه الخطوة، قم بتعيين وضع التقسيم على أنه غير صارم (سيؤدي هذا الوضع إلى تنشيط وضع التقسيم الديناميكي).
  5. تحميل البيانات في جدول التقسيم state_part
  6. المعالجة الفعلية وتشكيل جداول الأقسام بناءً على الحالة كمفتاح قسم
  7. سيكون هناك 38 مخرجًا للأقسام في وحدة تخزين HDFS، وسيكون اسم الملف هو اسم الحالة. في هذه الخطوة، نرى مخرجات الأقسام الـ 38 في HDFS.

التقسيم الثابت مقابل التقسيم الديناميكي في هايف

يستخدم المثال العملي أعلاه التقسيم الديناميكي، لكن Hive يدعم أسلوبين للتحميل، ويحدد الفرق بينهما مقدار الوقت المُستغرق.ping - ومقدار المخاطر التي تنطوي عليها كل حمولة.

التقسيم الثابت يُحدد اسم القسم في العبارة نفسها، لذلك يجب معرفة القيمة قبل تشغيل التحميل، ويجب أن تملأ عبارة واحدة قسمًا واحدًا بالضبط. التقسيم الديناميكي يسمح Hive بقراءة قيمة القسم من العمود الأخير في قائمة SELECT وإنشاء الدلائل في وقت التشغيل، ولهذا السبب يحتاج المثال إلى INSERT واحد فقط لإنتاج 38 دليلًا.

البعد التقسيم الثابت التقسيم الديناميكي
قيمة التقسيم يتم توفيرها يدويًا في بند التقسيم اقرأ البيانات أثناء التشغيل من عمود SELECT
عدد الأقسام لكل عبارة واحد كثير
الاعداد يعمل في الوضع الصارم الافتراضي يجب ضبط hive.exec.dynamic.partition.mode على الوضع غير الصارم
سرعة التحميل أسرع، لأنه لا حاجة لمسح القيمة أبطأ، لأن مجموعات الوظائف تصنف الصفوف حسب المفتاح
أفضل مناسب لـ مجموعات صغيرة ومعروفة مثل الحمل اليومي مجموعات مفاتيح كبيرة أو غير معروفة مثل 38 ولاية

كما أن الأحمال الديناميكية محدودة. يحدد Hive عدد الأقسام التي يمكن أن تنشئها مهمة واحدة - افتراضيًا 100 قسم لكل مُعالج أو مُختزل و1000 قسم للعبارة بأكملها - وتفشل المهمة بمجرد تجاوز أي من الحدين، لذلك يحتاج المفتاح ذو العدد الكبير جدًا من العناصر إلى رفع هذه الحدود أو تصميم مختلف.

ما هو الدلاء؟

تُستخدم الحاويات في Hive لفصل بيانات جداول Hive إلى ملفات أو مجلدات متعددة. وهي تُستخدم للاستعلام بكفاءة، وعلى عكس التقسيم، فإن عدد الحاويات ثابت عند إنشاء الجدول، لذا لا يزداد مع البيانات.

  • يمكن تقسيم البيانات الموجودة في تلك الأقسام إلى مجموعات فرعية.
  • يتم إجراء عملية التقسيم بناءً على تجزئة أعمدة معينة قمنا بتحديدها في الجدول
  • تستخدم الحاويات نوعًا من خوارزمية التجزئة في الواجهة الخلفية لقراءة كل سجل ووضعه في الحاويات.
  • يتم تحديد الدلو الذي يهبط فيه الصف بواسطة hash_function(bucketing_column) mod num_bucketsلذلك، فإن القيم المتساوية تُوضع دائمًا في نفس الملف.
  • في Hive 0.x و 1.x، كان يجب تفعيل خاصية التجميع باستخدام set hive.enforce.bucketing=true; قبل الإدخال

هذا الإعداد الأخير هو سجل البيانات على المجموعة الحالية: دليل أباتشي هايف ملاحظة: لم يعد ذلك ضرورياً من Hive 2.x فصاعداً، لأن المحرك الآن يختار عدد المخفضات وعمود التجميع من تعريف الجدول تلقائياً.

الخطوة 1) إنشاء دلو كما هو موضح أدناه.

تُظهر الشاشة أدناه عبارة CREATE TABLE لـ سامبل باكيت، مع وجود عبارة CLUSTERED BY في الأسفل لتحديد عدد الحاويات.

Hive CREATE TABLE statement clustering samplebucket into four buckets

من لقطة الشاشة أعلاه

  • نقوم بإنشاء مجموعة بيانات تحتوي على أسماء أعمدة مثل الاسم الأول، ومعرف الوظيفة، والقسم، والراتب، والبلد
  • نقوم بإنشاء 4 دلاء هنا
  • بمجرد تحميل البيانات، يتم وضعها تلقائيًا في 4 مجموعات.
  • عمود البلد هو عمود التجميع، لذلك يتم كتابة كل صف لبلد واحد في نفس ملف التجميع

الخطوة 2) تحميل البيانات في جدول samplebucket

بافتراض أن جدول "الموظفين" قد تم إنشاؤه بالفعل في نظام Hive، سنرى في هذه الخطوة تحميل البيانات من جدول الموظفين إلى جدول samplebucket.

قبل أن نبدأ بنقل بيانات الموظفين إلى مجموعات، تأكد من أنها تتكون من أسماء أعمدة مثل الاسم الأول، ومعرف الوظيفة، والقسم، والراتب، والبلد.

هنا نقوم بتحميل البيانات إلى samplebucket من جدول الموظفين - الشاشة أدناه توضح عبارة INSERT OVERWRITE التي تقوم بعملية النسخ.

عبارة INSERT OVERWRITE التي تنسخ صفوف الموظفين إلى جدول samplebucket

الخطوة 3) عرض المجموعات الأربع التي تم إنشاؤها في الخطوة 1

يُظهر سرد دليل الجدول في نظام ملفات HDFS النتيجة الفعلية: أربعة ملفات بيانات مرقمة بدلاً من ملف واحد.

قائمة ملفات الحاويات الأربعة التي تم إنشاؤها ضمن دليل samplebucket في نظام ملفات Hadoop الموزع (HDFS).

من لقطة الشاشة أعلاه، يمكننا أن نرى أن البيانات من جدول الموظفين قد تم نقلها إلى المجموعات الأربع التي تم إنشاؤها في الخطوة 1.

تقسيم Hive مقابل تجميع البيانات: الاختلافات الرئيسية

تقوم كلتا الميزتين بتقسيم الجدول إلى أجزاء أصغر، لكنهما تفعلان ذلك على مستويات مختلفة من نظام الملفات، وتعالجان مشاكل مختلفة. يعرض الجدول أدناه الميزتين جنبًا إلى جنب.

نقطة المقارنة التقسيم التغليف
الوحدة التي تم إنشاؤها دليل لكل قيمة مفتاح ملف واحد لكل حاوية تجزئة
أُعلن مع مقسمة بواسطة مُجمّعة حسب … في n من الدلاء
عدد القطع يزداد مع عدد القيم المميزة تم إصلاح المشكلة عند إنشاء الجدول
العمود المخزن في ملفات البيانات لا – القيمة موجودة في اسم الدليل نعم، يبقى العمود عمودًا عاديًا
نوع العمود الأكثر استخدامًا عددية منخفضة، مثل الولاية أو السنة أو البلد عدد كبير من القيم الفريدة، مثل user_id أو transaction_id
الفائدة الرئيسية تتجاهل عملية تقليم الأقسام الدلائل غير الضرورية حتى أحجام الملفات، وأخذ العينات الرخيصة، وعمليات الربط على جانب الخريطة

لا يُعتبر الاثنان متنافسين. يقوم تصميم الإنتاج الشائع بتقسيم جدول الحقائق حسب التاريخ ثم تجميع كل يوم في مجموعات بناءً على مفتاح الربط، بحيث يقوم الاستعلام بتقليص البيانات إلى دليل واحد ثم يربط المجموعات داخله.

متى يُستخدم التقسيم، أو التجميع، أو كليهما؟

يبدأ الاختيار بينهما بعدد عناصر العمود وشكل الاستعلامات التي ستقرأ الجدول.

  • تقسيم عندما تقوم الاستعلامات دائمًا تقريبًا بالتصفية على نفس العمود ذي عدد القيم المنخفض، وعندما يظل عدد القيم المميزة في حدود المئات بدلاً من الملايين
  • دلو عندما يحتوي العمود المفيد على عدد كبير جدًا من القيم المميزة بحيث لا يمكن اعتباره دليلًا، أو عندما يتم ضم الجدول أو أخذ عينات منه بشكل متكرر بناءً على هذا العمود
  • استخدم الأثنين بالنسبة لجداول الحقائق الكبيرة: قسّم البيانات حسب التاريخ، ثم ضعها داخل كل قسم في مجموعة بناءً على مفتاح الربط.

تكمن المشكلة التي يجب الانتباه إليها في مشكلة الملفات الصغيرة. يؤدي تقسيم البيانات بناءً على عمود ذي عدد كبير جدًا من القيم الفريدة - مثل الطابع الزمني أو مُعرّف العميل - إلى إنشاء آلاف المجلدات الصغيرة، يحتوي كل منها على ملف أصغر بكثير من حجم كتلة نظام ملفات Hadoop الموزع (HDFS). يؤدي ذلك إلى زيادة استهلاك ذاكرة NameNode وإبطاء كل عملية مسح، وهو تحديدًا ما كان يُفترض أن يمنعه التقسيم. يتجنب التجميع هذه المشكلة لأن عدد الملفات محدود بتعريف الجدول.

يُعاني نظام التجميع من بعض العيوب: فالتخطيط لا يكون صحيحًا إلا إذا التزم به جميع الكتّاب. يُعتبر عدد المجموعات المُعلن عنه عند الإنشاء بيانات وصفية، لذا فإن أي مهمة تكتب إلى الجدول دون تجميع البيانات بشكل صحيح قد تُنتج ملفات لا تتطابق مع التخطيط المُعلن، وستقرأ عمليات أخذ العينات أو ربط المجموعات اللاحقة الصفوف الخاطئة.

الأسئلة الشائعة

قم بتشغيل الأمر SHOW PARTITIONS table_name في واجهة Hive. يقوم هذا الأمر بقراءة بيانات التعريف (metastore) وطباعة سطر واحد لكل دليل قسم، وهو أسرع من سرد مسار المستودع في HDFS، كما أنه يؤكد تزامن بيانات التعريف.

يُضيف الأمر ALTER TABLE table_name ADD PARTITION (state='Goa') دليلاً جديداً، بينما يُزيله الأمر ALTER TABLE table_name DROP PARTITION (state='Goa').ping يقوم القسم المُدار بحذف بياناته، بينما يقوم القسم المُسقط بحذفها.ping أما الإدخال الخارجي فيقوم فقط بمسح إدخال مخزن البيانات الوصفية.

يُحدد Hive عدد الأقسام الديناميكية بـ 100 قسم لكل عقدة و1000 قسم لكل عبارة افتراضيًا. يؤدي استخدام مفتاح يحتوي على قيم مميزة أكثر إلى تجاوز هذا الحد وإيقاف المهمة. لذا، يُنصح برفع قيمتي hive.exec.max.dynamic.partitions.pernode وhive.exec.max.dynamic.partitions، أو اختيار مفتاح ذي نطاق أوسع.

لا. كان ذلك ضروريًا في Hive 0.x و 1.x لإجبار عدد المُخفِّضات على مطابقة عدد الحاويات. أزالت HIVE-12331 هذه الخاصية في Hive 2.0، ويستمد المحرك الآن كلاً من عدد المُخفِّضات وعمود التجميع من الجدول.

تقرأ الدالة TABLESAMPLE(BUCKET x OUT OF y ON column) ملفات الحاويات المطابقة فقط بدلاً من مسح جميع البيانات. ولأن الصفوف تُجزأ على نفس العمود عند الكتابة، فإن أخذ العينة قابل للتكرار وأقل تكلفة بكثير من تصفية الصفوف العشوائية.

يؤدي تقسيم الجدول إلى آلاف الملفات الصغيرة إلى إهدار ذاكرة NameNode وبدء مهمة لكل ملف، مما يُبطئ عمليات المسح. وعادةً ما يتبع ذلك مفتاح تقسيم ذو عدد كبير جدًا من القيم الفريدة. ويمكن حل هذه المشكلة باستخدام مفاتيح أضعف أو تجميع الملفات أو ضغطها.

نعم. تقوم أدوات مثل Cloudera Workload XM بتحليل سجلات الاستعلامات ونماذج التعلم الآلي لترتيب الأعمدة حسب تكرار التصفية، والانحراف، والعدد، ثم تقترح تخطيطًا. ولا يزال الاقتراح بحاجة إلى مراجعة، لأنه لا يمكنه رؤية أحمال العمل المخطط لها.

يقوم برنامج Copilot بصياغة عبارات PARTITIONED BY و CLUSTERED BY بسرعة من تعليق، ويمكن للمساعدين الآليين إنشاء نص برمجي كامل للتحميل. تحقق دائمًا من عدد الحاويات والمفتاح المُنشأين مقابل العدد الحقيقي للبيانات، لأن النموذج يُخمّن ذلك من الأسماء فقط.

تلخيص هذه التدوينة بـ: