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

تُعدّ الجداول والأقسام والمجموعات أجزاءً من نمذجة بيانات Hive. يُعرّف الجدول المخطط، ويقسم القسم هذا الجدول إلى مجلدات على القرص، وتقسم المجموعة البيانات داخل المجلد إلى عدد ثابت من الملفات.
ما هي الأقسام؟
تُعدّ أقسام Hive طريقةً لتنظيم الجداول في أقسامٍ عن طريق تقسيمها إلى أجزاءٍ مختلفةٍ بناءً على مفاتيح التقسيم. فعليًا، يُمثّل كل قسمٍ مجلدًا فرعيًا منفصلًا ضمن مجلد الجدول في نظام ملفات Hadoop الموزع (HDFS)، وهو ما يسمح لـ Hive بتجاهل البيانات التي لا يحتاجها.
تُعدّ خاصية التقسيم مفيدةً عندما يحتوي الجدول على مفتاح تقسيم واحد أو أكثر. تُشكّل مفاتيح التقسيم عناصر أساسية لتحديد كيفية تخزين البيانات في الجدول. لا يُخزّن مفتاح التقسيم داخل ملفات البيانات نفسها، بل تُشفّر قيمته في اسم المجلد، لذا يُمكن للاستعلام الذي يُصفّي البيانات بناءً على هذا المفتاح أن يتجاهل مجلدات كاملة قبل قراءة أي صف. يُطلق على هذه العملية اسم "تقليم التقسيم".
على سبيل المثال: -
لدى العميل بيانات تجارة إلكترونية خاصة بعملياته في الهند، حيث تُذكر عمليات كل ولاية (38 ولاية) كوحدة واحدة. إذا استخدمنا عمود الولاية كمفتاح تقسيم، وقمنا بتقسيم بيانات الهند ككل، فسنحصل على عدد الأقسام (38 قسمًا)، وهو ما يساوي عدد الولايات (38) الموجودة في الهند. وبذلك، يمكن عرض بيانات كل ولاية على حدة في جداول الأقسام.
عينة Code مقتطف برمجي للأقسام
تُنفَّذ الأوامر الستة التالية بالتسلسل في واجهة Hive. كل أمر منها يُمثِّل خطوة منفصلة، وتُظهر لقطات الشاشة التالية نفس التسلسل أثناء تنفيذه على مجموعة حوسبة حقيقية.
- إنشاء جدول allstates
create table allstates(state string, District string,Enrolments string) row format delimited fields terminated by ',';
- جارٍ تحميل البيانات في الجدول الذي تم إنشاؤه allstates
Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
- إنشاء جدول الأقسام
create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
- للتقسيم علينا تعيين هذه الخاصية
set hive.exec.dynamic.partition.mode=nonstrict - تحميل البيانات في جدول الأقسام
INSERT OVERWRITE TABLE state_part PARTITION(state) SELECT district,enrolments,state from allstates;
- المعالجة الفعلية وتشكيل جداول الأقسام بناءً على الحالة كمفتاح قسم
سيكون هناك 38 قسمًا مُخرجًا في وحدة تخزين HDFS، وسيُسمى الملف باسم الحالة. سنتحقق من ذلك في هذه الخطوة.
تُظهر لقطات الشاشة التالية تنفيذ الكود المذكور أعلاه.
في الشاشة الأولى، يتم تنفيذ الخطوة 1 عند خلية> يقوم الموجه بإنشاء أولستاتس جدول بثلاثة أعمدة وفاصلة كفاصل بين الحقول.
تغطي الشاشة التالية الخطوتين 2 و3: يتم تحميل ملف AllStates.csv في أولستاتسوالجدول المقسم جزء من الولاية يتم إنشاؤها باستخدام الحالة المعلنة كمفتاح للتقسيم.
تظهر الخطوتان 4 و 5 بعد ذلك. تم ضبط وضع التقسيم الديناميكي على الوضع غير الصارم، ويؤدي بيان INSERT OVERWRITE إلى تشغيل مهمة MapReduce التي تُظهر سطور سجلها تحميل قسم واحد لكل قيمة حالة.
يؤكد عرض دليل المستودع في نظام ملفات Hadoop الموزع (HDFS) نتيجة الخطوة 6 - حيث يُظهر النظام 38 عنصرًا، واحد منها state_part/state= دليل لكل ولاية.
من الكود أعلاه، نقوم بالأشياء التالية
- إنشاء جدول باسم allstates يحتوي على 3 أعمدة بأسماء مثل الولاية والمنطقة والتسجيلات
- جارٍ تحميل البيانات في جدول allstates
- إنشاء جدول الأقسام مع الحالة كمفتاح القسم
- في هذه الخطوة، قم بتعيين وضع التقسيم على أنه غير صارم (سيؤدي هذا الوضع إلى تنشيط وضع التقسيم الديناميكي).
- تحميل البيانات في جدول التقسيم state_part
- المعالجة الفعلية وتشكيل جداول الأقسام بناءً على الحالة كمفتاح قسم
- سيكون هناك 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 في الأسفل لتحديد عدد الحاويات.
من لقطة الشاشة أعلاه
- نقوم بإنشاء مجموعة بيانات تحتوي على أسماء أعمدة مثل الاسم الأول، ومعرف الوظيفة، والقسم، والراتب، والبلد
- نقوم بإنشاء 4 دلاء هنا
- بمجرد تحميل البيانات، يتم وضعها تلقائيًا في 4 مجموعات.
- عمود البلد هو عمود التجميع، لذلك يتم كتابة كل صف لبلد واحد في نفس ملف التجميع
الخطوة 2) تحميل البيانات في جدول samplebucket
بافتراض أن جدول "الموظفين" قد تم إنشاؤه بالفعل في نظام Hive، سنرى في هذه الخطوة تحميل البيانات من جدول الموظفين إلى جدول samplebucket.
قبل أن نبدأ بنقل بيانات الموظفين إلى مجموعات، تأكد من أنها تتكون من أسماء أعمدة مثل الاسم الأول، ومعرف الوظيفة، والقسم، والراتب، والبلد.
هنا نقوم بتحميل البيانات إلى samplebucket من جدول الموظفين - الشاشة أدناه توضح عبارة INSERT OVERWRITE التي تقوم بعملية النسخ.
الخطوة 3) عرض المجموعات الأربع التي تم إنشاؤها في الخطوة 1
يُظهر سرد دليل الجدول في نظام ملفات HDFS النتيجة الفعلية: أربعة ملفات بيانات مرقمة بدلاً من ملف واحد.
من لقطة الشاشة أعلاه، يمكننا أن نرى أن البيانات من جدول الموظفين قد تم نقلها إلى المجموعات الأربع التي تم إنشاؤها في الخطوة 1.
تقسيم Hive مقابل تجميع البيانات: الاختلافات الرئيسية
تقوم كلتا الميزتين بتقسيم الجدول إلى أجزاء أصغر، لكنهما تفعلان ذلك على مستويات مختلفة من نظام الملفات، وتعالجان مشاكل مختلفة. يعرض الجدول أدناه الميزتين جنبًا إلى جنب.
| نقطة المقارنة | التقسيم | التغليف |
|---|---|---|
| الوحدة التي تم إنشاؤها | دليل لكل قيمة مفتاح | ملف واحد لكل حاوية تجزئة |
| أُعلن مع | مقسمة بواسطة | مُجمّعة حسب … في n من الدلاء |
| عدد القطع | يزداد مع عدد القيم المميزة | تم إصلاح المشكلة عند إنشاء الجدول |
| العمود المخزن في ملفات البيانات | لا – القيمة موجودة في اسم الدليل | نعم، يبقى العمود عمودًا عاديًا |
| نوع العمود الأكثر استخدامًا | عددية منخفضة، مثل الولاية أو السنة أو البلد | عدد كبير من القيم الفريدة، مثل user_id أو transaction_id |
| الفائدة الرئيسية | تتجاهل عملية تقليم الأقسام الدلائل غير الضرورية | حتى أحجام الملفات، وأخذ العينات الرخيصة، وعمليات الربط على جانب الخريطة |
لا يُعتبر الاثنان متنافسين. يقوم تصميم الإنتاج الشائع بتقسيم جدول الحقائق حسب التاريخ ثم تجميع كل يوم في مجموعات بناءً على مفتاح الربط، بحيث يقوم الاستعلام بتقليص البيانات إلى دليل واحد ثم يربط المجموعات داخله.
متى يُستخدم التقسيم، أو التجميع، أو كليهما؟
يبدأ الاختيار بينهما بعدد عناصر العمود وشكل الاستعلامات التي ستقرأ الجدول.
- تقسيم عندما تقوم الاستعلامات دائمًا تقريبًا بالتصفية على نفس العمود ذي عدد القيم المنخفض، وعندما يظل عدد القيم المميزة في حدود المئات بدلاً من الملايين
- دلو عندما يحتوي العمود المفيد على عدد كبير جدًا من القيم المميزة بحيث لا يمكن اعتباره دليلًا، أو عندما يتم ضم الجدول أو أخذ عينات منه بشكل متكرر بناءً على هذا العمود
- استخدم الأثنين بالنسبة لجداول الحقائق الكبيرة: قسّم البيانات حسب التاريخ، ثم ضعها داخل كل قسم في مجموعة بناءً على مفتاح الربط.
تكمن المشكلة التي يجب الانتباه إليها في مشكلة الملفات الصغيرة. يؤدي تقسيم البيانات بناءً على عمود ذي عدد كبير جدًا من القيم الفريدة - مثل الطابع الزمني أو مُعرّف العميل - إلى إنشاء آلاف المجلدات الصغيرة، يحتوي كل منها على ملف أصغر بكثير من حجم كتلة نظام ملفات Hadoop الموزع (HDFS). يؤدي ذلك إلى زيادة استهلاك ذاكرة NameNode وإبطاء كل عملية مسح، وهو تحديدًا ما كان يُفترض أن يمنعه التقسيم. يتجنب التجميع هذه المشكلة لأن عدد الملفات محدود بتعريف الجدول.
يُعاني نظام التجميع من بعض العيوب: فالتخطيط لا يكون صحيحًا إلا إذا التزم به جميع الكتّاب. يُعتبر عدد المجموعات المُعلن عنه عند الإنشاء بيانات وصفية، لذا فإن أي مهمة تكتب إلى الجدول دون تجميع البيانات بشكل صحيح قد تُنتج ملفات لا تتطابق مع التخطيط المُعلن، وستقرأ عمليات أخذ العينات أو ربط المجموعات اللاحقة الصفوف الخاطئة.







