البرنامج التعليمي لـ Apache Flume: ما هو، Archiمثال على التقنية وHadoop

⚡ ملخص ذكي

Apache Flume هي خدمة موزعة لجمع وتجميع ونقل كميات كبيرة من بيانات السجلات إلى HDFS، وهي مبنية حول وكلاء يربطون المصدر والقناة والمصب معًا.

  • 🔘 تشريح العامل: كل وكيل Flume هو عملية JVM تحتوي على مصدر وقناة واحدة أو أكثر ومصب.
  • ☑️ الموثوقية: لا يتحمل التسليم ذو الجهد الأفضل أي فشل في العقدة؛ ويستمر التسليم من البداية إلى النهاية حتى مع فشل العديد من العقد.
  • ✅ الإعداد: يتم تجميع فئات المصدر المخصصة في ملف JAR يتم وضعه في دليل مكتبة Flume.
  • 🧪 ترتيب: يحتوي ملف الخصائص على أسماء المصدر والقناة والمصب، ويحدد مسار HDFS وحدود التدوير.
  • 🛠️ إطلاق: ابدأ خط الأنابيب باستخدام وكيل flume-ng، وقم بتسمية الوكيل والإشارة إلى flume.conf.
  • ⚠️ مثال مؤرخ: تم إغلاق نقطة نهاية البث المباشر لتويتر الإصدار 1.1 في مارس 2023، لذا تعامل مع التمرين كنمط مصدر مخصص.

برنامج تعليمي حول Apache Flume يغطي بنية الوكيل وتكوينه ومثالًا على تدفق البيانات في Hadoop

ما هو أباتشي فلوم في Hadoop؟

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

يدعم Flume في Hadoop مصادر متعددة، بما في ذلك:

  • 'tail' (الذي يقوم بنقل البيانات من ملف محلي وكتابتها في HDFS عبر Flume، على غرار أمر Unix 'tail')
  • سجلات النظام
  • أباتشي سجل 4j (مما يتيح Java تطبيقات لكتابة الأحداث إلى الملفات في HDFS عبر Flume).

الإصدار الحالي هو Flume 1.11.0نُشر في 25 أكتوبر 2022، وهو متاح من صفحة تنزيل Apache Flumeتمت كتابة هذا الدليل الإرشادي بناءً على الإصدار 1.4.0، لذا فإن العديد من الخطوات أدناه تحمل ملاحظة حيث يتصرف الإصدار الحالي بشكل مختلف.

وهد Architecture

عامل التدفق هو JVM عملية تتكون من ثلاثة عناصر - مصدر فلوم، وقناة فلوم، ومصب فلوم - تنتقل عبرها الأحداث بعد بدءها من مصدر خارجي. يوضح الرسم التخطيطي أدناه كيفية اتصالها.

مخطط بنية Flume يوضح وكيلًا مزودًا بمصدر وقناة ومصب لتغذية نظام ملفات Hadoop الموزع (HDFS).

  1. تستهلك منصة Flume الأحداث التي يُنشئها المصدر الخارجي (خادم الويب). ويرسل المصدر الخارجي الأحداث إلى منصة Flume بتنسيق تتعرف عليه المنصة المستهدفة.
  2. يستقبل مصدر Flume حدثًا ويخزنه في قناة واحدة أو أكثر. تعمل القناة كمخزن يحتفظ بالحدث حتى يستهلكه مستقبل Flume. قد تستخدم هذه القناة نظام ملفات محليًا لتخزين هذه الأحداث.
  3. يقوم مُستقبِل Flume بإزالة الحدث من القناة وتخزينه في مستودع خارجي مثل HDFS. قد يكون هناك عدة وكلاء Flume، وفي هذه الحالة يقوم مُستقبِل Flume بإعادة توجيه الحدث إلى مصدر Flume الخاص بالوكيل التالي في التدفق.

بعض الميزات المهمة لقناة المياه

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

المسايل والمكتبة وإعداد التعليمات البرمجية المصدر

قبل أن نبدأ بالعملية الفعلية، تأكد من تثبيت Hadoop؛ إذا لم يكن مثبتًا، فتابع من خلال كيفية تثبيت هادوب أولاً. قم بتغيير المستخدم إلى 'hduser' (المعرف المستخدم أثناء تكوين Hadoop؛ يمكنك التبديل إلى معرف المستخدم المستخدم أثناء تكوين Hadoop الخاص بك).

يتم تبديل مستخدم Linux إلى hduser في الطرفية قبل بدء إعداد Flume

الخطوة 1) أنشئ مجلدًا جديدًا باسم 'FlumeTutorial'.

sudo mkdir FlumeTutorial
  1. امنح صلاحيات القراءة والكتابة والتنفيذ.
    sudo chmod -R 777 FlumeTutorial
  2. انسخ الملفات MyTwitterSource.java و MyTwitterSourceForFlume.java إلى هذا المجلد.

تحميل ملفات الإدخال من هنا

تحقق من أذونات الملفات لجميع هذه الملفات، كما هو موضح أدناه، وامنح إذن "القراءة" إذا كان مفقودًا.

عرض قائمة أذونات الملفات على الجهاز الذي تم تنزيله Java ملفات المصدر

الخطوة 2) قم بتنزيل برنامج "أباتشي فلوم" من https://flume.apache.org/download.html.

تم استخدام Apache Flume 1.4.0 في هذا البرنامج التعليمي Flume.

صفحة تنزيل Apache Flume تعرض رابط ملف tarball الثنائي للاختيار

ثم انقر للوصول إلى نسخة طبق الأصل.

تم الوصول إلى صفحة Apache المرآة بعد النقر على رابط ملف Flume المضغوط.

الخطوة 3) انسخ الملف المضغوط الذي تم تنزيله إلى المجلد الذي تختاره ثم قم بفك ضغطه.tracقم باستعراض المحتويات باستخدام الأمر التالي.

sudo tar -xvf apache-flume-1.4.0-bin.tar.gz

الطرفيةtracقم بفك ضغط ملف Flume المضغوط باستخدام الأمر sudo tar -xvf

يؤدي هذا إلى إنشاء دليل جديد باسم apache-flume-1.4.0-bin و extracيتم وضع الملفات فيه. ويُشار إلى هذا المجلد باسم في بقية المقال.

الخطوة 4) إعداد مكتبة Flume. انسخ الملفات التالية: twitter4j-core-4.0.1.jar، وflume-ng-configuration-1.4.0.jar، وflume-ng-core-1.4.0.jar، وflume-ng-sdk-1.4.0.jar إلى

/ليب/

قد تحتوي بعض أو جميع ملفات JAR المنسوخة على إذن التنفيذ، مما قد يُسبب مشكلة في تجميع الكود، لذا قم بإلغائه. في حالتي، كان ملف twitter4j-core-4.0.1.jar يحتوي على إذن التنفيذ. قمتُ بإلغائه كما هو موضح أدناه.

sudo chmod -x twitter4j-core-4.0.1.jar

إلغاء إذن التنفيذ على ملف JAR الأساسي لـ twitter4j في الطرفية

بعد ذلك، يمنح الأمر أدناه إذن "القراءة" على twitter4j-core-4.0.1.jar للجميع.

sudo chmod +rrr /usr/local/apache-flume-1.4.0-bin/lib/twitter4j-core-4.0.1.jar

يرجى ملاحظة أنني قمت بتنزيل ملف twitter4j-core-4.0.1.jar من مستودع مافنوجميع ملفات Flume JAR، أي flume-ng-*-1.4.0.jar، من org.apache.flume artifacts.

تحميل البيانات من تويتر باستخدام Flume

الخطوة 1) انتقل إلى المجلد الذي يحتوي على ملفات التعليمات البرمجية المصدرية.

الخطوة 2) قم بتعيين CLASSPATH ليحتوي على /lib/* و ~/FlumeTutorial/flume/mytwittersource/*.

export CLASSPATH="/usr/local/apache-flume-1.4.0-bin/lib/*:~/FlumeTutorial/flume/mytwittersource/*"

تصدير مسار الفئات (CLASSPATH) الذي يشير إلى مجلدات مكتبة Flume ومجلدات المصدر.

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

javac -d . MyTwitterSourceForFlume.java MyTwitterSource.java

تجميع الطرفية للاثنين Java ملفات المصدر باستخدام جافاك

الخطوة 4) أنشئ ملف JAR. أولاً، أنشئ ملف Manifest.txt باستخدام محرر نصوص من اختيارك وأضف السطر التالي إليه.

Main-Class: flume.mytwittersource.MyTwitterSourceForFlume

هنا، flume.mytwittersource.MyTwitterSourceForFlume هو اسم الفئة الرئيسية. يُرجى ملاحظة أنه يجب عليك الضغط على مفتاح الإدخال (Enter) في نهاية هذا السطر، كما هو موضح أدناه.

افتح ملف Manifest.txt في محرر نصوص باستخدام مدخل Main-Class

الآن، قم بإنشاء ملف JAR 'MyTwitterSourceForFlume.jar' كما يلي.

jar cfm MyTwitterSourceForFlume.jar Manifest.txt flume/mytwittersource/*.class

تجميع الفئات المُجمّعة في ملف MyTwitterSourceForFlume.jar

الخطوة 5) انسخ ملف JAR هذا إلى /lib/.

sudo cp MyTwitterSourceForFlume.jar <Flume Installation Directory>/lib/

يقوم الطرفية بنسخ ملف JAR المصدر المخصص إلى دليل مكتبة Flume

الخطوة 6) انتقل إلى دليل إعدادات Flume، /conf.

إذا لم يكن ملف flume.conf موجودًا، فانسخ ملف flume-conf.properties.template وأعد تسميته إلى flume.conf.

sudo cp flume-conf.properties.template flume.conf

يتم نسخ الملف flume-conf.properties.template إلى flume.conf عبر الطرفية.

إذا لم يكن الملف flume-env.sh موجودًا، فانسخ الملف flume-env.sh.template وأعد تسميته إلى flume-env.sh.

sudo cp flume-env.sh.template flume-env.sh

يتم نسخ الملف flume-env.sh.template إلى flume-env.sh عبر الطرفية.

إنشاء تطبيق تويتر

اقرأ هذا أولاً. البث المباشر الإصدار 1.1 statuses/filter تم إيقاف نقطة النهاية التي يحتاجها twitter4j 4.0.1 في 9 مارس 2023، وتم استبدالها بواجهة برمجة التطبيقات v2 التي تعمل بتقنية التدفق المُصفّى، وهي الآن على developer.x.comيقع خلف مستوى مدفوع. تعامل مع الشاشات أدناه كنمط مصدر مخصص، ثم وجّه نفس الوكيل إلى ملف أو ملف تنفيذي أو مصدر Kafka.

الخطوة 1) أنشئ تطبيقًا على تويتر عن طريق تسجيل الدخول إلى بوابة المطورين.

صفحة تسجيل دخول مطوري تويتر المستخدمة للوصول إلى قائمة التطبيقات

تظهر الصفحة الرئيسية لحساب مطوري تويتر بعد تسجيل الدخول

الخطوة 2) انتقل إلى "تطبيقاتي" (يظهر هذا الخيار عند النقر على زر "البيضة" في الزاوية العلوية اليمنى).

صفحة تطبيقاتي في بوابة مطوري تويتر

الخطوة 3) أنشئ تطبيقًا جديدًا بالنقر على "إنشاء تطبيق جديد".

الخطوة 4) املأ بيانات الطلب بتحديد اسم التطبيق ووصفه وموقعه الإلكتروني. يمكنك الرجوع إلى الملاحظات الواردة أسفل كل خانة إدخال.

نموذج إنشاء تطبيق تويتر مع حقول الاسم والوصف وموقع الويب

الخطوة 5) قم بالتمرير لأسفل الصفحة، واقبل الشروط عن طريق تحديد "نعم، أوافق" وانقر على زر "إنشاء تطبيق تويتر الخاص بك".

مربع اختيار الشروط وزر إنشاء الطلب في أسفل نموذج تويتر

الخطوة 6) في نافذة التطبيق الذي تم إنشاؤه حديثًا، انتقل إلى علامة التبويب "مفاتيح API"، وقم بالتمرير لأسفل الصفحة وانقر فوق الزر "إنشاء رمز الوصول الخاص بي".

علامة تبويب مفاتيح API في تطبيق تويتر الجديد قبل وجود رمز الوصول

تظهر تفاصيل رمز الوصول بعد استخدام زر "إنشاء رمز الوصول الخاص بي".

الخطوة 7) قم بتحديث الصفحة.

الخطوة 8) انقر على "اختبار OAuth". سيؤدي هذا إلى عرض إعدادات "OAuth" الخاصة بالتطبيق.

شاشة اختبار OAuth تعرض إعدادات OAuth الخاصة بالتطبيق

الخطوة 9) قم بتعديل ملف 'flume.conf' باستخدام إعدادات OAuth هذه. تجد أدناه خطوات تعديل ملف 'flume.conf'.

إعدادات OAuth التي تعرض قيم مفتاح المستهلك، وسر المستهلك، ورمز الوصول

نحتاج إلى نسخ مفتاح المستهلك، وسر المستهلك، ورمز الوصول، وسر رمز الوصول من أجل تحديث ملف 'flume.conf'.

ملاحظة: هذه القيم تخص المستخدم وبالتالي فهي سرية، لذا لا ينبغي مشاركتها.

تعديل ملف "flume.conf".

الخطوة 1) افتح ملف 'flume.conf' في وضع الكتابة وقم بتعيين قيم المعلمات أدناه.

sudo gedit flume.conf

انسخ المحتويات أدناه.

MyTwitAgent.sources = Twitter
MyTwitAgent.channels = MemChannel
MyTwitAgent.sinks = HDFS
MyTwitAgent.sources.Twitter.type = flume.mytwittersource.MyTwitterSourceForFlume
MyTwitAgent.sources.Twitter.channels = MemChannel
MyTwitAgent.sources.Twitter.consumerKey = <Copy consumer key value from Twitter App>
MyTwitAgent.sources.Twitter.consumerSecret = <Copy consumer secret value from Twitter App>
MyTwitAgent.sources.Twitter.accessToken = <Copy access token value from Twitter App>
MyTwitAgent.sources.Twitter.accessTokenSecret = <Copy access token secret value from Twitter App>
MyTwitAgent.sources.Twitter.keywords = guru99
MyTwitAgent.sinks.HDFS.channel = MemChannel
MyTwitAgent.sinks.HDFS.type = hdfs
MyTwitAgent.sinks.HDFS.hdfs.path = hdfs://localhost:54310/user/hduser/flume/tweets/
MyTwitAgent.sinks.HDFS.hdfs.fileType = DataStream
MyTwitAgent.sinks.HDFS.hdfs.writeFormat = Text
MyTwitAgent.sinks.HDFS.hdfs.batchSize = 1000
MyTwitAgent.sinks.HDFS.hdfs.rollSize = 0
MyTwitAgent.sinks.HDFS.hdfs.rollCount = 10000
MyTwitAgent.channels.MemChannel.type = memory
MyTwitAgent.channels.MemChannel.capacity = 10000
MyTwitAgent.channels.MemChannel.transactionCapacity = 1000

افتح ملف flume.conf في محرر نصوص مع خصائص المصدر والقناة والمستقبل الخاصة بـ MyTwitAgent

الخطوة 2) قم أيضًا بتعيين TwitterAgent.sinks.HDFS.hdfs.path كما هو موضح أدناه.

TwitterAgent.sinks.HDFS.hdfs.path = hdfs:// : / /المسيل/تغريدات/

يتم تعيين خاصية hdfs.path الخاصة بمصدر HDFS إلى اسم المضيف ورقم المنفذ ودليل HDFS الرئيسي

للعثور على ، و انظر إلى قيمة المعلمة 'fs.defaultFS' المحددة في $HADOOP_HOME/etc/hadoop/core-site.xml، كما هو موضح أدناه.

خاصية fs.defaultFS الموجودة داخل ملف core-site.xml، والتي توفر اسم المضيف والمنفذ

الخطوة 3) من أجل تفريغ البيانات إلى نظام ملفات Hadoop الموزع (HDFS) عند ورودها، احذف الإدخال أدناه إذا كان موجودًا.

TwitterAgent.sinks.HDFS.hdfs.rollInterval = 600

مثال: دفق بيانات تويتر باستخدام Flume

الخطوة 1) افتح ملف 'flume-env.sh' في وضع الكتابة وقم بتعيين قيم المعلمات أدناه.

JAVA_HOME=<Installation directory of Java>
FLUME_CLASSPATH="<Flume Installation Directory>/lib/MyTwitterSourceForFlume.jar"

افتح ملف flume-env.sh في محرر نصوص مع ضبط متغيري البيئة JAVA_HOME و FLUME_CLASSPATH.

الخطوة 2) ابدأ تشغيل هادوب.

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

الخطوة 3) اثنان من ملفات JAR الموجودة في حزمة Flume المضغوطة غير متوافقين مع Hadoop 2.2.0، لذا في هذا المثال الخاص بـ Apache Flume، نتبع الخطوات التالية لجعل Flume متوافقًا مع Hadoop 2.2.0. يُعد استبدال ملف JAR هذا إصلاحًا لإصدار 1.4.0؛ إذ أن Flume 1.11.0 يتضمن بالفعل إصدارات protobuf وGuava الحديثة، لذا لا تحتاج الحزمة المضغوطة الحديثة عادةً إلى أيٍّ منها.

أ. انقل ملف protobuf-java-2.4.1.jar من ' /lib'. انتقل إلى هذا المجلد أولاً.

قرص مضغوط /lib

sudo mv protobuf-java-2.4.1.jar ~/

يقوم الطرفية بنقل ملف protobuf-java-2.4.1.jar من مجلد مكتبة Flume

ب. ابحث عن ملف JAR المسمى 'guava' كما هو موضح أدناه.

find . -name "guava*"

أمر البحث في الطرفية لتحديد موقع ملف JAR الخاص بـ Guava.

انقل ملف guava-10.0.1.jar من ' /lib'.

sudo mv guava-10.0.1.jar ~/

يقوم الطرفية بنقل ملف guava-10.0.1.jar من مجلد مكتبة Flume

ج. قم بتنزيل ملف guava-17.0.jar من مستودع مافن، ظاهر أدناه.

صفحة مستودع Maven الخاصة بـ guava 17.0، وملف JAR البديل للتنزيل

الآن، انسخ ملف JAR الذي تم تنزيله إلى ' /lib'.

الخطوة 4) انتقل إلى قم بتشغيل الأمر /bin' وابدأ تشغيل Flume كما يلي.

./flume-ng agent -n MyTwitAgent -c conf -f <Flume Installation Directory>/conf/flume.conf

بدء تشغيل وكيل Flume المسمى MyTwitAgent باستخدام الأمر flume-ng في الطرفية

تبدو نافذة موجه الأوامر التي يقوم برنامج Flume من خلالها بجلب التغريدات على هذا النحو.

موجه الأوامر الذي يعرض وكيل Flume وهو يجلب التغريدات ويكتبها إلى نظام ملفات Hadoop الموزع (HDFS).

من رسالة نافذة الأوامر، نلاحظ أن المخرجات تُكتب في المجلد /user/hduser/flume/tweets/. الآن، افتح هذا المجلد باستخدام متصفح الويب.

الخطوة 5) للاطلاع على نتيجة تحميل البيانات، افتح الرابط http://localhost:50070/ في متصفح، ثم تصفح نظام الملفات، ثم انتقل إلى الدليل الذي تم تحميل البيانات فيه، أي

/المسيل/تغريدات/

المنفذ 50070 هو واجهة المستخدم الخاصة بـ NameNode على Hadoop 2؛ قام Hadoop 3 بنقل نفس الصفحة إلى المنفذ 9870.

متصفح HDFS يعرض دليل flume/tweets مع ملفات التغريدات المحملة

يمثل التدفق نصف عملية الابتلاع: سكوب يستورد الجداول على دفعات، ثم يقوم Flume ببث الأحداث، خنزير or خلية النحل قم بتشكيل الملفات و أوزي يُحدد جدولة السلسلة. انظر أيضًا أدوات تحليل البيانات الضخمة, عمليات الربط والعدادات في MapReduce و Talend.

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

ليس كما هو مكتوب. تم إيقاف نقطة نهاية حالة/تصفية البث المباشر v1.1 في 9 مارس 2023، ويتطلب استبدالها بواجهة برمجة التطبيقات v2 اشتراكًا مدفوعًا. لا تزال آليات Flume قائمة كعملية تطوير مخصصة.

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

يقوم برنامج Copilot بإنشاء كتل المصدر والقناة والمصب بسرعة، ولكنه يُنشئ أسماء خصائص جديدة ويخلط الإصدارات. تحقق من كل مفتاح في دليل مستخدم Flume الخاص بإصدارك قبل تشغيل البرنامج.

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

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

يُعدّ Kafka الخيار الافتراضي المعتاد حاليًا نظرًا لقدرته على الاحتفاظ بالبيانات وخدمة العديد من المستخدمين. ولا يزال Flume 1.11.0، الصادر في أكتوبر 2022، مناسبًا لجمع السجلات أحادي الاتجاه في نظام ملفات Hadoop الموزع (HDFS).

غالباً ما يكون السبب هو تعارض ملفات JAR: إذ يحتوي ملف Flume المضغوط على إصدارات خاصة به من Guava وprotobuf، والتي تتعارض مع تلك التي يحمّلها Hadoop. وعادةً ما يؤدي حذف ملف JAR القديم المرفق إلى حل المشكلة.

يحددون متى يقوم النظام بإغلاق ملف وفتح ملف جديد: حجم الملف بالبايت، وعدد مرات فتحه بعدد الأحداث، وفترة فتحه بالثواني. القيمة صفر تعطل هذا المشغل تحديداً.

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