我正在構建數據索引,這將需要以(document, term, weight)
的形式存儲大量三元組。我將存儲高達幾百萬這樣的行。目前我正在MySQL中做這個簡單的表格。我將文檔和術語標識符存儲爲字符串值,而不是外鍵到其他表。我正在重新編寫軟件並尋找更好的數據存儲方式。看看HBase的工作方式,這似乎很適合架構。我可以將document
映射到{term => weight}
,而不是存儲大量的三元組。HBase是否有意義,如果它沒有在分佈式環境中運行?
我在單個節點上這樣做,所以我不在乎分佈式節點等。我應該堅持使用MySQL,因爲它的工作原理,還是明智的嘗試HBase?我看到Lucene將它用於全文索引(這與我正在做的類似)。我的問題是,單個HBase節點如何與單個MySQL節點進行比較?我來自Scala,所以直接的Java API可以通過JDBC和MySQL解析每個查詢的優勢嗎?
我主要關心的是插入速度,因爲這是以前的瓶頸。處理完後,我最終可能會把數據放回到MySQL中進行實時查詢,因爲我需要做一些在MySQL中更好的計算。
我會嘗試兩種原型,但我相信社區可以給我一些有價值的見解。
什麼是您的插入模式?隨機的,批量的,有序的?在批次插入過程中是否應該關閉鍵?確保使用插入表(...)values(),(),(),(),(),()...(),();所以你不要分析儘可能多的語句,讓文本增長到大約mysql服務器通道限制的大小。 – Don 2009-11-07 02:32:29
插入將是隨機的:我將掃描數十萬個文件,每個文檔產生數百個元組。沒有排序(但我想通過加權頻率從另一端進行排序)。 在我以前的MySQL實現中,是的,我按照您的建議將輸入分爲多個批次。我不記得尺碼,但我嘗試了正確的尺碼。我也做延期插入,因爲在插入時我不關心實時可用的數據。 – Joe 2009-11-07 09:18:21
看過MapReduce之後,這看起來像我可以以不同方式解決的問題(即不是連續寫入表中,而是運行單個批處理),但可能更好。 – Joe 2009-11-07 09:19:06