سؤال

أنا ألعب مع hadoop وقم بإنشاء كتلة عقدة اثنين على أوبونتو. مثال WordCount يعمل على ما يرام.

الآن أود أن أكتب برنامج MAPRREDUC الخاص بي لتحليل بعض بيانات السجل (السبب الرئيسي: يبدو بسيطا ولدي الكثير من البيانات)

كل سطر في السجل ضمن هذا التنسيق

<UUID> <Event> <Timestamp>

حيث يمكن أن يكون الحدث في البداية، ابدأ، توقف، خطأ وبعض الآخر. ما يهمني معظمه هو الوقت المنقضي بين الأحداث البداية والتوقف عن نفس uuid.

على سبيل المثال، يحتوي السجل الخاص بي على إدخالات مثل هذه

35FAA840-1299-11DF-8A39-0800200C9A66 START 1265403584
[...many other lines...]
35FAA840-1299-11DF-8A39-0800200C9A66 STOP 1265403777

يقرأ برنامجي الحالي الخطي من خلال الملفات، ويتذكر أحداث البدء في الذاكرة، ويكتب الوقت المنقضي إلى ملف بمجرد العثور على حدث نهاية المقابلة (خطوط مع أحداث أخرى يتم تجاهلها حاليا، فإن أحداث الأخطاء إبطال UUID وسوف يتم تجاهلها أيضا1

أرغب في ميناء هذا البرنامج إلى برنامج Hadoop / Mapreduce. لكنني لست متأكدا من كيفية القيام بمطابقة الإدخالات. تقسيم / قميص الملف سهل، وأعتقد أن العثور على المباريات سيكون من فئة تقليل. ولكن كيف تبدو هذه؟ كيف يمكنني العثور على إدخالات الرياضيات في وظيفة MapReduce؟

يرجى مراعاة أن تركيزي الرئيسي هو فهم Hadopo / Mapreduce؛ الروابط الخنزير وبرامج Apache الأخرى موضع ترحيب، ولكن أود حل هذا واحد مع Hadoop / Mapreduce النقي. شكرا لك.

1) نظرا لأن السجل مأخوذ من تطبيق قيد التشغيل، قد لا تحتوي بعض الأحداث البديلة على أحداث نهاية المقابلة، وسوف تكون هناك أحداث نهاية دون بدء تشغيل، بسبب تقسيم LogFile

هل كانت مفيدة؟

المحلول

إذا قمت بإنشاء UUID في الخريطة ك Key: emit(<uuid>, <event, timestamp>) سوف تتلقى في تقليل جميع الأحداث من هذا uuid:key = UUID, values = {<event1, timestamp1>, <event2, timestamp2>}

ثم يمكنك فرز الأحداث على الطابع الزمني وتقرر ما إذا كانت تنبعث منها في ملف ناتج أم لا.

مكافأة: يمكنك استخدام job.setSortComparatorClass(); لإعداد فئة الفرز الخاصة بك، لذلك ستحصل على إدخالاتك تم فرزها بالفعل في الطوابع الزمنية في الحد:

public static class BNLSortComparator extends Text.Comparator {
  public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
    String sb1, sb2;
    try {
      sb1 = Text.decode(b1, s1, l1);
      ...

نصائح أخرى

أعتقد أنك يمكن أن تفعل ذلك من خلال جعل وظيفة الخريطة الخاصة بك إخراج UUID كمفتاح لها وبقية الخط كقيمتها. ثم سيتم تمرير وظيفة تقليل مجموعة من جميع إدخالات السجل مع نفس UUID. نظرا لأنها تعالجها، فيمكنك تتبع الأحداث المختلفة التي يراها واتخاذ إجراءات وفقا لذلك - على سبيل المثال، عندما يرى حدث بدء التشغيل، فيمكنه تعيين متغير محلي إلى الوقت المستخرج من سطر البداية، ثم عندما يرا ذلك حدث يمكن استخراج الوقت منه، طرح وقت البدء، وإخراج الفرق (والقيام بالمثل إذا كان يرى التوقف قبل البدء).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top