2010-11-08 77 views
14

我們試圖使用HBase來存儲時間序列數據。我們目前的模型將時間序列存儲爲單元格內的版本。這意味着單元最終可能會存儲數百萬個版本,並且此時間序列上的查詢將使用Get類中的setTimeRange方法檢索一系列版本,該方法在HBase中的Get類中提供。使用HBase存儲時間序列數據

例如

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

這是在HBase中存儲時間序列數據的合理模型嗎?

將數據存儲在多列(是否可以跨列查詢)或行更合適的替代模型?

回答

17

我不認爲你應該使用版本來存儲時間序列在這裏。不是因爲它不起作用,而是因爲它不是針對特定用例而設計的,還有其他方法。


我建議你時間序列存儲爲時間步長爲列限定符和值將是數據本身。喜歡的東西:

{ 
    "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()

+0

無論您是將時間步放在rowkey還是列限定符中,最好都可以通過您的數據訪問模式來確定。如果您通常傾向於獲取掃描中的所有列,並且刪除不是主要方案,那麼rowkey設計會有很大意義。 – Larsenal 2013-12-05 00:46:52

6

如果我要在HBase上構建一個時間系列解決方案,我肯定會看到StumbleUpon的開源版本http://opentsdb.net/,因爲它在SU內部使用,我認爲它是穩定的,並獲得持續的支持。

0

+1 for openTSDB它有許多技巧來簡化基於時間的彙總查詢。

至於原始問題,你可以有任意多的單元格版本,只要你想(沒有限制)。沒有性能損失,'Get'被實現爲HBase中的掃描,並且setTimeRange是非常有效的過濾器。

相關問題