ملاحظة
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
فـي مجموعة HBase، قد تقرر أنك ترغب في إزالة البيانات بعد أن تتقادم إما لتحرير بعض التخزين وتوفير التكاليف حيث لم تعد هناك حاجة إلى البيانات القديمة، إما للامتثال للوائح. عند الحاجة إلى ذلك، تحتاج إلى تعيين TTL في جدول على مستوى ColumnFamily لتنتهي صلاحيتها وحذف البيانات القديمة تلقائيا. بينما يمكن تعيين TTL أيضا على مستوى الخلية، عادة ما يكون تعيينه على مستوى ColumnFamily خيارًا أكثر ملاءمة لأن سهولة الإدارة ولأن TTL الخلية (المعبر عنها بالملي ثانية) لا يُمكنها تمديد العمر الفعلي للخلية إلى ما بعد إعداد TTL على مستوى ColumnFamily (يتم التعبير عنه بالثواني)، لذلك يمكن أن تستفيد أوقات الاستبقاء الأقصر المطلوبة فقط على مستوى الخلية من تعيين TTL على مستوى الخلية.
على الرغم من تعيين TTL، قد تلاحظ في بعض الأحيان أنك لا تحصل على التأثير المطلوب، أي أن بعض البيانات لم تنته صلاحيتها و/أو لم ينخفض حجم التخزين.
المتطلبات الأساسية
اتبع الخطوات والأوامر المحددة، افتح اتصالين ssh إلى مجموعة HBase:
في إحدى الجلسات، تحتفظ جلسات ssh بواجهة bash الافتراضية.
في جلسة ssh الثانية، قم بتشغيل HBase shell عن طريق التشغيل، الأمر التالي.
hbase shell
تحقق مما إذا تم تكوين TTL المطلوب وما إذا تمت إزالة البيانات منتهية الصلاحية مـن نتيجة الاستعلام
اتبع الخطوات المحددة لفهم مكان المشكلة. ابدأ بالتحقق مما إذا كان السلوك يحدث لجدول مُعين أو لكافة الجداول. إذا لم تكن متأكدًا ما إذا كانت المشكلة تؤثر على جميع الجداول أو جدول معين، فما عليك سوى اعتبار اسم جدول مُعين للبداية كمثال.
تحقق أولا من تكوين TTL لـ ColumnFamily للجداول الهدف. قم بتشغيل الأمر التالي في جلسة عمل ssh حيث قمت بتشغيل HBase shell ومراقبة الإخراج. تم تعيين TTL لمجموعة أعمدة واحدة إلى 50 ثانية، أما ColumnFamily الآخر فليس له قيمة مكونة لـ TTL، وبالتالي فإنه يظهر على أنه «FOREVER» (لم يتم تكوين البيانات في عائلة العمود هذه لتنتهي صلاحيتها).
describe 'table_name'
إذا لم يتم تكوينه، يتم تعيين TTL الافتراضي إلى "FOREVER". هناك احتمالان لعدم انتهاء صلاحية البيانات كما هـو متوقع وإزالتها من نتيجة الاستعلام.
- إذا كان TTL يحتوي على أي قيمة أخرى، ثم "FOREVER"، فراقب قيمة عائلة العمود ولاحظ القيمة بالثوان (انتبه بشكل خاص إلى القيمة المرتبطة بقياس الوحدة حيث إن TTL الخلية في ms، ولكن TTL لعائلة العمود بالثوان) لتأكيد ما إذا كانت هي القيمة المتوقعة. إذا لم تكن القيمة التي تمت ملاحظتها صحيحة، فقم بتصحيح ذلك أولا.
- إذا كانت قيمة TTL هي «FOREVER» لجميع عائلات الأعمدة، فكون TTL كخطوة أولى ثم قـم بمراقبة ما إذا انتهت صلاحية البيانات كما هو متوقع.
إذا قمت بتكوين TTL وكان له القيمة الصحيحة ل ColumnFamily، فإن الخطوة التالية هـي التأكد من أن البيانات منتهية الصلاحية لم تعد تظهر عند إجراء عمليات فَحص الجداول. عند انتهاء صلاحية البيانات، يجب إزالتها وعـدم ظهورها في نتائج جدول الفحص. قم بتشغيل الأمر أدناه فـي HBase shell للتحقق.
scan 'table_name'
تحقق من عدد وحجم StoreFiles لكل جدول لكـل منطقة لملاحظة ما إذا كانت أي تغييرات مرئية بعد عملية الضغط
قبل الانتقال إلى الخطوة التالية، من جلسة ssh مع bash shell، قم بتشغيل الأمر التالي للتحقق من العدد الحالي من StoreFiles والحجم لكل StoreFile يظهر حاليًا لـ ColumnFamily الذي تم تكوين TTL له. لاحظ أولا الجدول و ColumnFamily الذي تقوم بإجراء الفحص له، ثم قم بتشغيل الأمر التالي في جلسة ssh (bash).
hdfs dfs -ls -R /hbase/data/default/table_name/ | grep "column_family_name"
من المحتمل أن يكون هناك المزيد من النتائج الموضحة في الإخراج، نتيجة واحدة لكل معرف منطقة يشكل جزءا من الجدول وبين 0 والمزيد من النتائج ل StoreFiles الموجودة تحت كل اسم منطقة، ل ColumnFamily المحدد. لحساب العدد الإجمالي للصفوف في إخراج النتيجة أعلاه، قـم بتشغيل الأمر التالي.
hdfs dfs -ls -R /hbase/data/default/table_name/ | grep "column_family_name" | wc -l
تحقق مـن عدد وحجم StoreFiles لكل جدول لكل منطقة بعد المسح
استنادًا إلى TTL الذي تم تكوينه لكل ColumnFamily ومقدار البيانات المكتوبة في الجدول لـ ColumnFamily الهدف، قد لا يزال جزء من البيانات موجودا في MemStore ولا تتم كتابته ك StoreFile إلى التخزين. وبالتالي، للتأكد من كتابة البيانات إلى التخزين كـ StoreFile، قبل الوصول إلى الحد الأقصى لحجم MemStore المكون، يمكنك تشغيل الأمر التالي في HBase shell لكتابة البيانات مـن MemStore إلى StoreFile على الفور.
flush 'table_name'
لاحظ النتيجة عـن طريق تشغيل مرة أخرى في bash shell الأمر.
hdfs dfs -ls -R /hbase/data/default/table_name/ | grep "column_family_name"
يتم إنشاء ملف مخزن إضافي مقارنة بمخرجات النتيجة السابقة لكل منطقة يتم فيها تعديل البيانات، يتضمن StoreFile المحتوى الحالي ل MemStore لتلك المنطقة.
تحقق من عدد وحجم StoreFiles لكل جدول لكل منطقة بعد الضغط الرئيسي
عند هذه النقطة، تمت كتابة البيانات مـن MemStore إلى StoreFile، في التخزين، ولكن قـد تظل البيانات منتهية الصلاحية موجودة في واحد أو أكثر من StoreFiles الحالي. على الرغم من أن الضغطات الطفيفة يمكن أن تساعد في حذف بعض الإدخالات منتهية الصلاحية، إلا أنه ليس من المضمون إزالتها جميعا كضغط بسيط. لا يحدد جميع StoreFiles للضغط، بينما يقوم الضغط الرئيسي بتحديد جميع StoreFiles للضغط في تلك المنطقة.
أيضًا، هناك حالة أخرى عندما لا يؤدي الضغط البسيط إلى إزالة الخلايا التي انتهت مدة صلاحية TTL فيها. هناك خاصية تسمى MIN_VERSIONS ويتم تعيينها افتراضيًا إلى 0 فقط (راجع في الإخراج أعلاه من وصف "table_name" الخاصية MIN_VERSIONS=>'0'). إذا تم تعيين هذه الخاصية إلى 0، فإن الضغط الثانوي يزيل الخلايا مع انتهاء صلاحية TTL. إذا كانت هذه القيمة أكبر من 0، فقد لا يزيل الضغط الثانوي الخلايا التي انتهت صلاحيتها حتى إذا لمس الملف المُقابل كجزء من الضغط. تقوم هـذه الخاصية بتكوين الحد الأدنى لعدد إصدارات الخلية التي يجب الاحتفاظ بها، حتى إذا انتهت صلاحية TTL لهذه الإصدارات.
للتأكد من حذف البيانات منتهية الصلاحية أيضًا من التخزين، نحتاج إلى تشغيل عملية ضغط رئيسية. عند اكتمال عملية الضغط الرئيسية، فإنها تترك وراءها StoreFile واحد لكل منطقة. فـي HBase shell، قم بتشغيل الأمر لتنفيذ عملية ضغط رئيسية على الجدول:
major_compact 'table_name'
اعتمادا على حجم الجدول، يمكن أن تستغرق عملية الضغط الرئيسية بعض الوقت. استخدم الأمر التالي في HBase shell لمراقبة التقدم. إذا كان الضغط لا يزال قيد التشغيل عند تنفيذ الأمر التالي، فستحصل على الإخراج ك "MAJOR"، ولكن إذا اكتمل الضغط، فستحصل على كإخراج "NONE".
compaction_state 'table_name'
عندما تظهر حالة الضغط على أنها "NONE" في hbase shell، إذا قمت بالتبديل بسرعة إلى bash وتشغيل الأمر.
hdfs dfs -ls -R /hbase/data/default/table_name/ | grep "column_family_name"
لاحظ أنه تم إنشاء StoreFile إضافي بالإضافة إلى الملفات السابقة لكل منطقة لكل ColumnFamily وبعد عدة لحظات يتم الاحتفاظ ب StoreFile الأخير الذي تم إنشاؤه فقط لكل منطقة لكل عائلة عمود.
بالنسبة لمنطقة المثال أعلاه، بمجرد انقضاء اللحظات الإضافية، يمكننا ملاحظة أنه يبقى StoreFile واحد. أيضا، يتم تقليل الحجم الذي يشغله هذا الملف على التخزين بسبب الضغط الرئيسي. عند هذه النقطة، يتم حذف أي بيانات منتهية الصلاحية لم يتم حذفها من قبل (بواسطة ضغط رئيسي آخر)، بعد تشغيل عملية الضغط الرئيسية الحالية.
إشعار
بالنسبة إلى تمرين استكشاف الأخطاء وإصلاحها هذا، قمت بتشغيل الضغط الرئيسي يدويا. ولكن في الممارسة العملية، فإن القيام بذلك يدويا للعديد من الجداول يستغرق وقتا طويلا. بشكل افتراضي، يتم تعطيل الضغط الرئيسي في مجموعة HDInsight. يرجع السبب الرئيسي لإبقاء الضغط الرئيسي معطلا بشكل افتراضي إلى أداء عمليات الجدول عندما يكون الضغط الرئيسي قيد التقدم. ومع ذلك، يمكنك تمكين الضغط الرئيسي عن طريق تكوين قيمة الخاصية hbase.hregion.majorcompaction
في ms أو يمكنك استخدام مهمة علامة تبويب cron أو نظام خارجي آخر لجدولة الضغط في وقت مناسب لك، مع حمل عمل أقل.
الخطوات التالية
إذا لم تشاهد مشكلتك أو لم تتمكن من حلها، فتفضل بزيارة إحدى القنوات التالية للحصول على مزيد من الدعم:
احصل على إجابات من خبراء Azure عبر دعم مجتمع Azure.
تواصل مع @AzureSupport - حساب Microsoft Azure الرسمي لتحسين تجربة العملاء. توصيل مجتمع Azure بالموارد المناسبة:
answers
وsupport
و.experts
إذا كنت بحاجة إلى مزيد من المساعدة، فيمكنك إرسال طلب دعم من مدخل Microsoft Azure. حدد Support من شريط القائمة أو افتح المحور Help + support. لمزيد من المعلومات التفصيلية، راجع كيفية إنشاء طلب دعم Azure. يتم تضمين الوصول إلى إدارة الاشتراك ودعم الفواتير في اشتراك Microsoft Azure، ويتم توفير الدعم التقني من خلال إحدى خطط دعم Azure.