البرنامج التعليمي HDFS: Archiالتكنولوجيا والقراءة والكتابة Operaالإنتاج

⚡ ملخص ذكي

HDFS هي طبقة التخزين الموزعة في Hadoop، حيث تقوم بتقسيم الملفات الكبيرة جدًا إلى كتل مكررة عبر أجهزة عادية بحيث يتم تخزينها بواسطة NameNode واحد tracبيانات التعريف ks بينما تقوم العديد من عقد البيانات بتلبية طلبات القراءة والكتابة بشكل موثوق.

  • 🔘 الهندسة المعمارية: تحتوي عقدة الاسم على صورة مساحة الاسم وسجل التحرير، بينما تخزن عقد البيانات النسخ المتماثلة الفعلية للكتل.
  • ☑️ تحديد حجم الكتلة: كان Hadoop 1.x يستخدم افتراضيًا كتلًا بحجم 64 ميجابايت؛ بينما يستخدم Hadoop 2.x و 3.x افتراضيًا كتلًا بحجم 128 ميجابايت.
  • تكرار: ثلاث نسخ متماثلة لكل كتلة هي الوضع الافتراضي، موزعة على رفوف متعددة بحيث لا يؤدي تعطل الأجهزة إلى فقدان البيانات.
  • 🧪 مسار القراءة: يقوم كل من FSDataInputStream و DFSInputStream بجلب مواقع الكتل من NameNode، ثم يقومان ببث البايتات مباشرة من DataNodes.
  • 🛠️ مسار الكتابة: يقوم DFSOutputStream بتجميع الحزم في قائمة الانتظار، ويقوم DataStreamer بإنشاء مسار DataNode، وتقوم قائمة انتظار Ack بالحماية من فقدان الحزم.
  • 🧭 خيارات الوصول: org.apache.hadoop.fs Java تغطي واجهة برمجة التطبيقات (API) وواجهة سطر الأوامر الخاصة بنظام الملفات الموزعة (dfs) عمليات الفتح والقراءة والكتابة والإغلاق.

HDFS تعليمي

ما هو HDFS؟

نظام ملفات Hadoop الموزع (HDFS) هو نظام ملفات موزع لتخزين ملفات البيانات الضخمة جدًا، ويعمل على مجموعات من الأجهزة القياسية. يتميز بقدرته على تحمل الأعطال، وقابليته للتوسع، وسهولة توسيعه. يأتي Hadoop مزودًا بنظام HDFS (نظام ملفات Hadoop الموزع).

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

HDFS Architecture

تتكون مجموعة HDFS بشكل أساسي من NameNode الذي يدير بيانات تعريف نظام الملفات و داتاينودس التي تخزن البيانات الفعلية.

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

لأن عقدة الاسم الوحيدة ستكون نقطة فشل واحدة، فإن المجموعات الحالية تشغل عقدة اسم نشطة جنبًا إلى جنب مع عقدة اسم احتياطية تشارك سجل التحرير من خلال مجموعة من عقد JournalNodes، مع تجاوز الفشل التلقائي بين الاثنين.

تتم عمليات القراءة والكتابة في نظام ملفات Hadoop الموزع (HDFS) على مستوى الكتل. تُقسّم ملفات البيانات في HDFS إلى أجزاء بحجم كتل، تُخزّن كوحدات مستقلة. يبلغ حجم الكتلة الافتراضي 64 ميجابايت في Hadoop 1.x. أما في Hadoop 2.x وما بعده، فيختلف الحجم الافتراضي. حجم كتلة dfs 128 ميغا بايت.

يعتمد نظام ملفات Hadoop الموزع (HDFS) على مفهوم تكرار البيانات، حيث يتم إنشاء نسخ متعددة من كتل البيانات وتوزيعها على العقد في جميع أنحاء المجموعة لضمان توافر البيانات بشكل كبير في حالة تعطل إحدى العقد. عامل التكرار الافتراضي هو ثلاثة (dfs.replication), وعندما تتوقف عقدة البيانات عن إرسال إشارات النبض، تقوم عقدة الاسم تلقائيًا بإعادة نسخ كتلها في مكان آخر.

هل تعرف؟ الملف الموجود في HDFS، والذي يكون أصغر من كتلة واحدة، لا يشغل مساحة التخزين الكاملة للكتلة.

عرض Operaنشوئها في HDFS

يتم تلبية طلب قراءة البيانات بواسطة نظام ملفات Hadoop الموزع (HDFS) وعقدة الاسم (NameNode) وعقد البيانات (DataNodes). لنُطلق على قارئ البيانات اسم "العميل". يوضح الرسم البياني أدناه عملية قراءة الملفات في Hadoop.

تدفق بيانات عملية القراءة من نظام ملفات Hadoop الموزع (HDFS) بين العميل و NameNode و DataNodes

  1. يقوم العميل ببدء طلب القراءة عن طريق استدعاء طريقة 'open()' لكائن FileSystem؛ وهو كائن من نوع DistributedFileSystem.
  2. يتصل هذا الكائن بـ NameNode باستخدام RPC ويحصل على معلومات البيانات الوصفية مثل مواقع كتل الملف. يُرجى ملاحظة أن هذه العناوين تخص الكتل القليلة الأولى من الملف.
  3. استجابةً لطلب البيانات الوصفية هذا، يتم إرجاع عناوين عقد البيانات التي تحتوي على نسخة من تلك الكتلة.
  4. بمجرد استلام عناوين عقد البيانات، يُعاد كائن من نوع FSDataInputStream إلى العميل. يحتوي FSDataInputStream على DFSInputStream الذي يتولى التفاعلات مع عقدة البيانات وعقدة الاسم. في الخطوة الرابعة الموضحة في الرسم التخطيطي أعلاه، يستدعي العميل الدالة 'read()' التي تُنشئ اتصالاً بين DFSInputStream وأول عقدة بيانات تحتوي على أول كتلة من الملف.
  5. تُقرأ البيانات على شكل تدفقات، حيث يستدعي العميل دالة القراءة () بشكل متكرر. وتستمر عملية القراءة هذه حتى تصل إلى نهاية الكتلة.
  6. بمجرد الوصول إلى نهاية الكتلة، يقوم DFSInputStream بإغلاق الاتصال وينتقل لتحديد موقع DataNode التالي للكتلة التالية.
  7. بمجرد أن ينتهي العميل من القراءة، فإنه يستدعي الدالة close().

كتابة Operaنشوئها في HDFS

في هذا القسم، سنتعرف على كيفية كتابة البيانات في نظام ملفات Hadoop الموزع (HDFS) من خلال الملفات. الرسم التخطيطي أدناه traces that write path.

مسار عمليات الكتابة في نظام ملفات Hadoop الموزع (HDFS) باستخدام DataQueue و DataStreamer و Ack Queue

  1. يبدأ العميل عملية الكتابة عن طريق استدعاء طريقة 'create()' لكائن DistributedFileSystem الذي يقوم بإنشاء ملف جديد - الخطوة رقم 1 في الرسم التخطيطي أعلاه.
  2. يتصل كائن نظام الملفات الموزع (DistributedFileSystem) بعقدة الاسم (NameNode) عبر استدعاء RPC، ويبدأ عملية إنشاء ملف جديد. مع ذلك، لا تُرفق عملية إنشاء الملف هذه أي كتل بيانات بالملف. تقع على عاتق عقدة الاسم مسؤولية التحقق من عدم وجود الملف (الذي يتم إنشاؤه) مسبقًا، ومن امتلاك العميل الصلاحيات اللازمة لإنشائه. في حال وجود الملف مسبقًا، أو عدم امتلاك العميل الصلاحيات الكافية لإنشائه، يتم إرسال استثناء IOException إلى العميل. وإلا، تنجح العملية، وتقوم عقدة الاسم بإنشاء سجل جديد للملف.
  3. بمجرد إنشاء سجل جديد في NameNode، يتم إرجاع كائن من نوع FSDataOutputStream إلى العميل. يستخدم العميل هذا الكائن لكتابة البيانات في HDFS. يتم استدعاء دالة كتابة البيانات (الخطوة 3 في الرسم التوضيحي).
  4. يحتوي FSDataOutputStream على كائن DFSOutputStream الذي يتولى الاتصال مع عقد البيانات وعقدة الاسم. بينما يواصل العميل كتابة البيانات، يواصل DFSOutputStream إنشاء حزم بيانات. تُضاف هذه الحزم إلى قائمة انتظار تُسمى DataQueue.
  5. يوجد مكون آخر يُسمى DataStreamer يستهلك قائمة انتظار البيانات هذه. كما يطلب DataStreamer من NameNode تخصيص كتل جديدة، وبالتالي يختار DataNodes المناسبة لاستخدامها في النسخ المتماثل.
  6. الآن، تبدأ عملية النسخ المتماثل عن طريق إنشاء خط أنابيب باستخدام DataNodes. في حالتنا، اخترنا مستوى النسخ المتماثل 3 وبالتالي هناك 3 DataNodes في طور التنفيذ.
  7. يقوم DataStreamer بصب الحزم في DataNode الأول في المسار.
  8. تقوم كل عقدة بيانات في خط الأنابيب بتخزين الحزمة التي استلمتها وإعادة توجيهها إلى عقدة البيانات الثانية في خط الأنابيب.
  9. يتم الاحتفاظ بقائمة انتظار أخرى، وهي "قائمة انتظار التأكيد"، بواسطة DFSOutputStream لتخزين الحزم التي تنتظر التأكيد من DataNodes.
  10. بمجرد استلام تأكيد استلام حزمة في قائمة الانتظار من جميع عقد البيانات في خط الأنابيب، يتم إزالتها من "قائمة الانتظار للتأكيد". وفي حالة فشل أي عقدة بيانات، يتم استخدام الحزم من هذه القائمة لإعادة بدء العملية.
  11. بعد أن ينتهي العميل من كتابة البيانات، يستدعي الدالة close() (الخطوة 9 في الرسم التوضيحي). يؤدي استدعاء الدالة close() إلى إرسال حزم البيانات المتبقية إلى خط الأنابيب، ثم انتظار تأكيد الاستلام.
  12. بمجرد استلام الإقرار النهائي، يتم الاتصال بـ NameNode لإبلاغه بأن عملية كتابة الملف قد اكتملت.

الوصول إلى نظام ملفات Hadoop الموزع (HDFS) باستخدام Java API

في هذا القسم، نحاول فهم Java الواجهة المستخدمة للوصول إلى نظام ملفات Hadoop.

من أجل التفاعل مع نظام ملفات Hadoop برمجيًا، يوفر Hadoop العديد من Java تحتوي الحزمة المسماة org.apache.hadoop.fs على فئات مفيدة في التعامل مع الملفات في نظام ملفات Hadoop. تشمل هذه العمليات الفتح والقراءة والكتابة والإغلاق. واجهة برمجة تطبيقات ملفات Hadoop عامة ويمكن توسيعها للتفاعل مع أنظمة ملفات أخرى غير HDFS.

قراءة ملف من HDFS، برمجيا

كائن java.net.URL يستخدم لقراءة محتويات الملف. للبدء، نحن بحاجة إلى القيام بذلك Java التعرف على نظام ملفات Hadoop المسمى hdfs URL مخطط. يتم ذلك عن طريق استدعاء المجموعةURLطريقة StreamHandlerFactory في URL يتم تمرير نسخة من FsUrlStreamHandlerFactory إلى الكائن. يجب تنفيذ هذه الطريقة مرة واحدة فقط لكل JVMومن ثم فهو محاط بكتلة ثابتة.

مثال على الكود هو-

public class URLCat {
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }
    public static void main(String[] args) throws Exception {
        InputStream in = null;
        try {
            in = new URL(args[0]).openStream();
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

يقوم هذا الكود بفتح ملف وقراءة محتوياته. ويتم تمرير مسار هذا الملف على نظام ملفات Hadoop الموزع (HDFS) إلى البرنامج كوسيط في سطر الأوامر.

الوصول إلى نظام ملفات Hadoop الموزع (HDFS) باستخدام واجهة سطر الأوامر

هذه إحدى أبسط الطرق للتفاعل مع نظام ملفات Hadoop الموزع (HDFS). تدعم واجهة سطر الأوامر عمليات نظام الملفات مثل قراءة الملفات، وإنشاء الدلائل، ونقل الملفات، وحذف البيانات، وعرض محتويات الدلائل.

يمكننا الجري '$HADOOP_HOME/bin/hdfs dfs -مساعدة' للحصول على مساعدة مفصلة حول كل أمر. هنا، 'dfs' هو أمر shell خاص بنظام ملفات Hadoop الموزع (HDFS) يدعم أوامر فرعية متعددة. في إصدارات Hadoop الحالية نظام الملفات الموزعة HDFS الشكل المفضل، بينما الشكل الأقدم نظام ملفات هادوب يؤدي الأمر نفس العمل لأي نظام ملفات مدعوم.

مذكور أدناه بعض الأوامر المستخدمة على نطاق واسع مع بعض التفاصيل الخاصة بكل منها.

1. انسخ ملفًا من نظام الملفات المحلي إلى HDFS

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

يقوم هذا الأمر بنسخ الملف temp.txt من نظام الملفات المحلي إلى HDFS، كما هو موضح في المخرجات أدناه.

الأمر hdfs dfs -copyFromLocal ينسخ الملف temp.txt إلى HDFS

2. يمكننا عرض قائمة الملفات الموجودة في دليل باستخدام الأمر -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

في القائمة أدناه يمكننا أن نرى الملف 'temp.txt' (الذي تم نسخه سابقًا) ضمن الدليل ' / '.

يُظهر الأمر `hdfs dfs -ls` قائمةً بملف temp.txt في الدليل الجذر لنظام ملفات HDFS.

3. أمر لنسخ ملف إلى نظام الملفات المحلي من HDFS

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

يُحاكي هذا الأمر الأمر -get ويقبل مسار وجهة محليًا صريحًا كوسيط ثانٍ. يُظهر الناتج أدناه نسخ الملف temp.txt إلى نظام الملفات المحلي.

يُظهر ناتج الأمر `hdfs dfs -copyToLocal` نسخ الملف temp.txt إلى نظام الملفات المحلي.

4. الأمر لإنشاء دليل جديد

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

يتم تنفيذ الأمر بصمت، كما هو موضح في الرسالة أدناه.

الأمر hdfs dfs -mkdir يُنشئ المجلد /mydirectory في نظام ملفات HDFS

تحقق مما إذا كان المجلد قد تم إنشاؤه أم لا. الآن، يفترض أنك تعرف كيفية القيام بذلك 😉

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

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

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

ليس في مجموعة مُهيأة بشكل صحيح. يعمل نظام التوافر العالي لنظام ملفات Hadoop الموزع (HDFS) على تشغيل عقدة اسم نشطة وعقدة اسم احتياطية تتشاركان التعديلات من خلال عقدة السجل، وتقوم وحدات تحكم تجاوز الفشل في ZooKeeper بترقية العقدة الاحتياطية تلقائيًا عندما تتوقف العقدة النشطة عن الاستجابة.

كلا الخيارين يقومان بتحميل البيانات إلى نظام ملفات Hadoop الموزع (HDFS). يقتصر الخيار ‎-copyFromLocal على نظام الملفات المحلي، بينما يقبل الخيار ‎-put أي مصدر مدعوم، بما في ذلك مسار HDFS آخر أو الإدخال القياسي (stdin). السلوك متطابق فيما عدا ذلك، لذا فإن ‎-copyFromLocal يوضح الغرض فقط.

يشغل كل ملف ومجلد وكتلة مساحة من الذاكرة في NameNode، لذا فإن ملايين الملفات الصغيرة تستنفد مساحة التخزين المخصصة لها قبل امتلاء الأقراص. ويساهم دمجها في ملفات تسلسلية، أو أرشيفات Avro أو ORC أو Parquet أو HAR في الحفاظ على سهولة إدارة البيانات الوصفية.

تحتفظ عملية النسخ بثلاث نسخ كاملة، مما يكلف مساحة تخزين إضافية بنسبة 200%. أما تقنية ترميز المحو، التي أُضيفت في هادوب 3، فتخزن خلايا التكافؤ بدلاً من ذلك، وتصل إلى مستوى مماثل من المتانة مع زيادة في التكاليف بنسبة 50% تقريبًا، مما يستبدل تكلفة التخزين الأقل بتكاليف أعلى لوحدة المعالجة المركزية والشبكة أثناء عملية الاسترداد.

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

يُنجز Copilot بسرعةٍ التعليمات البرمجية الأساسية المألوفة لـ org.apache.hadoop.fs، مثل FileSystem.get، وحلقات FSDataInputStream، واستدعاءات IOUtils.copyBytes. تحقق دائمًا من الكود المُولّد مُقارنةً بإصدار Hadoop المُستخدم، لأن أسماء واجهات برمجة التطبيقات والأساليب المُهملة تختلف بشكلٍ ملحوظ بين Hadoop 2.x و 3.x.

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