2016-10-22 137 views
1

我們正在消耗非常大的數據,需要儘快寫入,因爲我們使用HDFS,因此我們更願意使用它。數據幾乎沒有結構化,我們很少會對它們進行基本查詢。數據與一些字段保持一致,每行代表另一個數據。HDFS上非結構化數據行的數據存儲格式

key1=str key2=30.3 key3=longtexthere 

另一個數據行:

key1=3 key5=abc 

SequenceFile似乎是最自然的,但我無法找到如何多行存儲在一個單一的SequenceFile。

目前,在我們的臨時解決方案中,我們有多個寫入多個文本文件的寫入器。所以當需要查詢時,我們會同時讀取它們。但是,當前的文本文件包含1000行,我不認爲爲每行創建單個SequenceFile都是可行的,因此在查詢時,它會一次性存儲元數據並讀取許多太多文件。

我認爲這個問題可以通過使用HBase或Cassandra這樣的columunar數據庫來解決,但我們幾乎需要使用HDFS。我是否遺漏了SequenceFiles或我們應該使用columunar數據庫?

+0

你有固定數量的按鍵/列嗎? – oae

+0

@oae不,雖然它們不是固定的,但它們很少被擴展,這意味着有時我們添加新的列,但舊數據沒有它們。 – Mustafa

回答

1

所以序列文件格式是這樣的: <key, value> <key, value> <key, value> ... 其中鍵是一個WritableComparable和值是一個Writable。 現在是什麼,很多人都在做 - 你可以做同樣的 - 是:

  • 只有使用鑰匙或價值「列」
  • 實現自定義可寫,它封裝了一組其他Writables的(稱之爲記錄,排,...)

這樣你就可以建立你想要的一切。可寫的記錄可以有一個固定的模式,就像它包含'IntWritable,Text,IntWritable,IntWritable'(取決於你的字段)。或者如果你不想支持不同的類型,你可以使用現有的ArrayWritable作爲你的'記錄'。 瞭解每個文件的模式(例如,將其放入序列文件的元數據中,將允許您讀取具有不同/演變模式的文件)

因此,其大量的手工製作,但構建可以非常有效靈活的結構從來沒有使用它,但看看http://pangool.net/userguide/schemas.html,認爲他們已經建模suche一個靈活的記錄/元組架構上的序列文件頂部

底線,我認爲你可以實現你想要的序列文件。 但是,我建議也看看列表文件格式,如ParquetORC files。這些來自他們自己的折衷,但你會有更高的壓縮率和sel有效讀取(列投影,濾波器下推)。你也不必發明模式/元組結構。