باستخدام HBase لتخزين بيانات السلاسل الزمنية

StackOverflow https://stackoverflow.com/questions/4126259

  •  29-09-2019
  •  | 
  •  

سؤال

نحن نحاول استخدام hbase لتخزين بيانات السلسلة الزمنية. النموذج الذي لدينا حاليًا يخزن السلاسل الزمنية كإصدارات داخل الخلية. هذا يعني أن الخلية قد تنتهي في نهاية المطاف تخزين ملايين الإصدارات ، وأن الاستعلامات في هذه السلسلة الزمنية ستسترجع مجموعة من الإصدارات باستخدام طريقة setTimerange المتاحة على فئة GET In hbase.

على سبيل المثال

{
    "row1" : {
        "columnFamily1" : {
            "column1" : {
                1 : "1",
                2 : "2"
            },
            "column2" : {
                1 : "1"
            }
        }
    }
}

هل هذا نموذج معقول لتخزين بيانات السلسلة الزمنية في HBase؟

هل النموذج البديل لتخزين البيانات في أعمدة متعددة (هل من الممكن الاستعلام عبر الأعمدة) أو الصفوف أكثر ملاءمة؟

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

المحلول

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


أقترح عليك تخزين السلسلة الزمنية كخطوة زمنية كأهل العمود وستكون القيمة هي البيانات نفسها. شيء مثل:

{
    "row1" : {
        "columnFamily1" : {
            "col1-000001" : "1"
            "col1-000002" : "2"
            "col1-000003" : "91"
            "col2-000001" : "31"
            }
        }
    }
}

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


هناك خيار واقعي آخر هو أن يكون لديك معرف للسجل كجزء أول من Rowkey ، ولكن بعد ذلك يكون لديك خطوة زمنية في Rowkey أيضًا. شيء مثل:

{
    "fooseries-00001" : {
        "columnFamily1" : {
            "val" : "1"
            }
        }
    }
    "fooseries-00002" : {
        "columnFamily1" : {
            "val" : "2"
            }
        }
    }

}

هذه الميزة الجميلة التي سيكون من السهل جدًا إجراء عمليات مسح النطاق في سلسلة معينة. على سبيل المثال ، سيكون سحب خطوات Fooseries من 104 إلى 199 تافهة لتنفيذ وتكون فعالة.

الجانب السلبي لهذا الجزء هو حذف سلسلة كاملة سيتطلب المزيد من الإدارة والمزامنة. الجانب السلبي الآخر هو أن تحليلات MapReduce ستواجه صعوبة في إجراء أي نوع من التحليل على هذه البيانات. مع النهج أعلاه ، سيتم نقل السلسلة الزمنية بأكملها إلى واحدة map() اتصل ، بينما هنا ، map() سيتم استدعاؤه لكل إطار.

نصائح أخرى

إذا كنت سأقوم ببناء حل سلسلة زمنية على HBase ، فسأقوم بالتأكيد بإلقاء نظرة على http://opentsdb.net/ إصدار مفتوح المصدر من StumbleUpon ، حيث يتم استخدامه داخليًا من قِبل SU ، أود أن يكون مستقرًا وأحصل على دعم مستمر.

ألق نظرة على Zohmg.

في الواقع هناك ورقة تسمى: "نموذج بيانات ثلاثي الأبعاد في HBase لتحليل مجموعة بيانات السلاسل الزمنية الكبيرة" (2012) (الشرائح فقط) مما يدل على تحسين الأداء لنموذج البيانات الذي يستغل حقل الإصدار من HBase ، مثل الدعائم السائل. لكنه لم يكن مصممًا لعقد "إصدارات" لا حصر لها ولكن دلو من الخلايا (Sensordata لمدة ساعة أو يوم).

+1 بالنسبة لـ OPENTSDB ، يقوم بالعديد من الحيل لتبسيط استعلامات Rollup المستندة إلى الوقت.

بالنسبة للسؤال الأصلي ، يمكنك الحصول على أكبر عدد ممكن من إصدارات الخلايا (لا يوجد حد). لا توجد عقوبة أداء ، يتم تنفيذ "GET" كمسح على أي حال في HBase و SetTimerange هو مرشح فعال للغاية.

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