البرنامج التعليمي HDFS: Archiالتكنولوجيا والقراءة والكتابة Operaاستخدام نشوئها Java API
ما هو HDFS؟
HDFS هو نظام ملفات موزع لتخزين ملفات بيانات كبيرة جدًا، ويعمل على مجموعات من الأجهزة الأساسية. وهو متسامح مع الأخطاء وقابل للتطوير وسهل التوسع للغاية. يأتي Hadoop مع HDFS (أنظمة الملفات الموزعة Hadoop).
عندما تتجاوز البيانات سعة التخزين على جهاز مادي واحد، يصبح من الضروري تقسيمها على عدد من الأجهزة المنفصلة. يُطلق على نظام الملفات الذي يدير عمليات تخزين محددة عبر شبكة من الأجهزة اسم نظام الملفات الموزع. يعد HDFS أحد هذه البرامج.
HDFS Architecture
تتكون مجموعة HDFS بشكل أساسي من NameNode الذي يدير نظام الملفات البيانات الوصفية و داتاينودس الذي يخزن البيانات الفعلية.
- عقدة الاسم: يمكن اعتبار NameNode سيد النظام. يحافظ على شجرة نظام الملفات والبيانات الوصفية لجميع الملفات والأدلة الموجودة في النظام. ملفين "صورة مساحة الاسم" و "تحرير السجل" يتم استخدامها لتخزين معلومات البيانات الوصفية. لدى Namenode معرفة بجميع عقد البيانات التي تحتوي على كتل بيانات لملف معين، ومع ذلك، فهو لا يخزن مواقع الكتل بشكل مستمر. تتم إعادة بناء هذه المعلومات في كل مرة من datanodes عند بدء تشغيل النظام.
- عقدة البيانات: عقد البيانات هي وحدات تابعة توجد على كل جهاز في مجموعة وتوفر التخزين الفعلي. وهي مسؤولة عن تقديم الطلبات وقراءتها وكتابتها للعملاء.
تتم عمليات القراءة والكتابة في HDFS على مستوى الكتلة. يتم تقسيم ملفات البيانات في HDFS إلى أجزاء بحجم الكتلة، والتي يتم تخزينها كوحدات مستقلة. حجم الكتلة الافتراضي هو 64 ميجابايت.
يعتمد HDFS على مفهوم تكرار البيانات حيث يتم إنشاء نسخ متعددة من كتل البيانات وتوزيعها على العقد في جميع أنحاء المجموعة لتمكين توفر البيانات بدرجة عالية في حالة فشل العقدة.
هل تعرف؟ الملف الموجود في HDFS، والذي يكون أصغر من كتلة واحدة، لا يشغل مساحة التخزين الكاملة للكتلة.
عرض Operaنشوئها في HDFS
يتم تقديم طلب قراءة البيانات بواسطة HDFS وNameNode وDataNode. دعنا نسمي القارئ "عميلًا". يوضح الرسم التخطيطي أدناه عملية قراءة الملف في Hadoop.
- يبدأ العميل طلب القراءة عن طريق الاتصال 'يفتح()' طريقة كائن نظام الملفات؛ إنه كائن من النوع نظام الملفات الموزعة.
- يتصل هذا الكائن بـ namenode باستخدام RPC ويحصل على معلومات البيانات التعريفية مثل مواقع كتل الملف. يرجى ملاحظة أن هذه العناوين هي الكتل القليلة الأولى من الملف.
- استجابة لطلب البيانات الوصفية هذا، يتم إرجاع عناوين DataNodes التي تحتوي على نسخة من تلك الكتلة مرة أخرى.
-
بمجرد تلقي عناوين DataNodes، يتم كتابة كائن FSDataInputStream يتم إرجاعها إلى العميل. FSDataInputStream يحتوي DFSInputStream الذي يعتني بالتفاعلات مع DataNode وNameNode. في الخطوة 4 الموضحة في الرسم البياني أعلاه، يقوم العميل باستدعاء 'يقرأ()' الطريقة التي تسبب DFSInputStream لإنشاء اتصال مع DataNode الأول مع الكتلة الأولى من الملف.
-
تتم قراءة البيانات في شكل تدفقات يستدعي فيها العميل 'يقرأ()' الطريقة مرارا وتكرارا. هذه العملية اقرأ() تستمر العملية حتى تصل إلى نهاية الكتلة.
- بمجرد الوصول إلى نهاية الكتلة، يغلق DFSInputStream الاتصال وينتقل لتحديد موقع DataNode التالي للكتلة التالية
- بمجرد انتهاء العميل من القراءة، فإنه يتصل إغلاق () الأسلوب.
كتابة Operaنشوئها في HDFS
في هذا القسم، سوف نفهم كيفية كتابة البيانات في HDFS من خلال الملفات.
- يبدأ العميل عملية الكتابة عن طريق استدعاء طريقة 'create()' لكائن DistributedFileSystem الذي ينشئ ملفًا جديدًا - الخطوة رقم 1 في الرسم التخطيطي أعلاه.
- يتصل كائن DistributedFileSystem بـ NameNode باستخدام استدعاء RPC ويبدأ إنشاء ملف جديد. ومع ذلك، فإن عملية إنشاء الملف هذه لا تربط أي كتل بالملف. تقع على عاتق NameNode مسؤولية التحقق من أن الملف (الذي يتم إنشاؤه) غير موجود بالفعل وأن العميل لديه الأذونات الصحيحة لإنشاء ملف جديد. إذا كان الملف موجودًا بالفعل أو لم يكن لدى العميل أذونات كافية لإنشاء ملف جديد، فعندئذٍ IOEException يتم طرحه للعميل. وإلا، تنجح العملية ويتم إنشاء سجل جديد للملف بواسطة NameNode.
- بمجرد إنشاء سجل جديد في NameNode، يتم إرجاع كائن من النوع FSDataOutputStream إلى العميل. يستخدمه العميل لكتابة البيانات في HDFS. يتم استدعاء طريقة كتابة البيانات (الخطوة 3 في الرسم التخطيطي).
- يحتوي FSDataOutputStream على كائن DFSOutputStream الذي يعتني بالاتصال مع DataNodes وNameNode. بينما يستمر العميل في كتابة البيانات، DFSOutputStream يستمر في إنشاء الحزم بهذه البيانات. يتم وضع هذه الحزم في قائمة انتظار تسمى باسم قائمة انتظار البيانات.
- هناك عنصر آخر يسمى DataStreamer الذي يستهلك هذا قائمة انتظار البيانات. يطلب DataStreamer أيضًا من NameNode تخصيص كتل جديدة وبالتالي اختيار DataNodes المرغوبة لاستخدامها في النسخ المتماثل.
- الآن، تبدأ عملية النسخ المتماثل عن طريق إنشاء خط أنابيب باستخدام DataNodes. في حالتنا، اخترنا مستوى النسخ المتماثل 3 وبالتالي هناك 3 DataNodes في طور التنفيذ.
- يقوم DataStreamer بصب الحزم في DataNode الأول في المسار.
- تقوم كل DataNode في خط الأنابيب بتخزين الحزمة المستلمة بها وإعادة توجيهها إلى DataNode الثاني في خط الأنابيب.
- يتم الاحتفاظ بقائمة انتظار أخرى، "Ack Queue" بواسطة DFSOutputStream لتخزين الحزم التي تنتظر الإقرار من DataNodes.
- بمجرد استلام تأكيد استلام حزمة في قائمة الانتظار من جميع عقد البيانات في خط الأنابيب، يتم إزالتها من "قائمة الانتظار للتأكيد". وفي حالة فشل أي عقدة بيانات، يتم استخدام الحزم من هذه القائمة لإعادة بدء العملية.
- بعد أن ينتهي العميل من كتابة البيانات، فإنه يستدعي طريقة إغلاق () (الخطوة 9 في الرسم التخطيطي) استدعاء لإغلاق ()، مما يؤدي إلى تدفق حزم البيانات المتبقية إلى خط الأنابيب متبوعًا بانتظار الإقرار.
- بمجرد استلام الإقرار النهائي، يتم الاتصال بـ NameNode لإخباره بأن عملية كتابة الملف قد اكتملت.
الوصول إلى HDFS باستخدام JAVA API
في هذا القسم نحاول أن نفهم Java الواجهة المستخدمة للوصول إلى نظام ملفات Hadoop.
من أجل التفاعل مع نظام ملفات Hadoop برمجيًا، يوفر Hadoop فئات JAVA متعددة. تحتوي الحزمة المسماة org.apache.hadoop.fs على فئات مفيدة في التعامل مع ملف في نظام ملفات Hadoop. تتضمن هذه العمليات الفتح والقراءة والكتابة والإغلاق. في الواقع، واجهة برمجة التطبيقات للملفات في Hadoop عامة ويمكن توسيعها للتفاعل مع أنظمة ملفات أخرى غير HDFS.
قراءة ملف من HDFS، برمجيا
الكائن java.net.URL يستخدم لقراءة محتويات الملف. للبدء، نحن بحاجة إلى القيام بذلك Java التعرف على نظام URL hdfs الخاص بـ Hadoop. ويتم ذلك عن طريق الاتصال setURLStreamHandlerFactory يتم تمرير الطريقة على كائن 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); } } }
يفتح هذا الرمز ويقرأ محتويات الملف. يتم تمرير مسار هذا الملف على HDFS إلى البرنامج كوسيطة سطر الأوامر.
الوصول إلى HDFS باستخدام واجهة سطر الأوامر
هذه إحدى أبسط الطرق للتفاعل مع HDFS. تدعم واجهة سطر الأوامر عمليات نظام الملفات مثل قراءة الملف وإنشاء الدلائل ونقل الملفات وحذف البيانات وسرد الدلائل.
يمكننا الجري '$HADOOP_HOME/bin/hdfs dfs -مساعدة' للحصول على مساعدة تفصيلية بشأن كل أمر. هنا، ""دفس"" هو أمر shell لـ HDFS يدعم أوامر فرعية متعددة.
مذكور أدناه بعض الأوامر المستخدمة على نطاق واسع مع بعض التفاصيل الخاصة بكل منها.
1. انسخ ملفًا من نظام الملفات المحلي إلى HDFS
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
يقوم هذا الأمر بنسخ ملف temp.txt من نظام الملفات المحلي إلى HDFS.
2. يمكننا سرد الملفات الموجودة في الدليل باستخدام -لس
$HADOOP_HOME/bin/hdfs dfs -ls /
يمكننا أن نرى ملف "temp.txt" (منسوخ سابقًا) مدرج تحت '/' الدليل.
3. أمر لنسخ ملف إلى نظام الملفات المحلي من HDFS
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
نستطيع ان نرى temp.txt نسخ إلى نظام الملفات المحلي.
4. الأمر لإنشاء دليل جديد
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
تحقق مما إذا تم إنشاء الدليل أم لا. الآن، يجب أن تعرف كيفية القيام بذلك 😉