一個Cassandra叢集需要投入時候,絕大多數時候都是會有初始化資料的,比如部落格網站中所有的部落格資料,資料分析網站中所有的網頁資訊,電子商務網站中所有的商品資訊等等。這些初始化資料往往量的都非常大,不適用直接使用Thrift API的方式談談Cassandra的用戶端)直接匯入。Facebook曾經使用了叫做BinaryMemTable的方式匯入使用Binary Memtable將大量資料匯入Cassandra)。
我們在叢集中安裝Hadoop和Cassandra,假設我們需要初始化的資料可以匯入成一個一般檔案txt檔案),然後上傳到HDFS中。其中每一台機器既是Cassandra的節點也是Hadoop的Slave機器,並且每一台Slave機器的Reduce的個數為1。
為了將大量的資料匯入到叢集中,我個人認為有如下2中方案。
使用BinaryMemTable
1.運行MapReduceJob
在Mapper中按照Key對匯入的資料進行分區。
在Reducer中,configure階段進行以下操作:
1. 初始化Cassandra的Message Service和Gossip服務。
2. 建立Cassandra的檔案目錄。
3. 關閉Cassandra的壓縮功能。
4. 等待一個Range的delay時間。
在Reducer中,reduce階段進行以下操作:
1. 根據每一個key建立其對應的ColumnFamily
2. 建立RowMutation的訊息
3. 將訊息發送到叢集中所有應該獲得該資料的節點中。
在Reducer中,close階段進行以下操作:
1. 等待Message Service中所有的訊息發送完畢。
2. 完畢Cassandra的Message Service和Gossip服務。
2.啟動Cassandra叢集
在Cassandra啟動後,手動執行壓縮操作,合并之前產生的大量的SSTable檔案。
自己產生SSTable檔案
1.啟動Cassandra叢集
啟動後,確保整個叢集的ring已經建立起來。
2.運行MapReduceJob
在Mapper中,configure階段進行以下操作:
1. 隨機串連一台Cassandra機器
2. 擷取Cassandra叢集的token map
在Mapper中,map階段進行以下操作:
1. 根據資料的key對應的節點地址劃分資料
二次排序
1. 將節點地址和key相應的資料作為一個Group
2. Group中的資料按照key的升序排序
在Reducer中,configure階段進行以下操作:
1. 為每一個ColumnFamily建立一個SStableWriter執行個體。
在Reducer中,reduce階段進行以下操作:
1. 根據每一個key建立其對應的ColumnFamily
2. 調用相應的SStableWriter.append()方法,將資料寫入到指定的SStable檔案中。
在Reducer中,close階段進行以下操作:
1. 調用每一個ColumnFamily的SStableWriter.closeAndOpenReader()方法。
2. 將產生的SSTable檔案SCP到應該屬於的Cassandra的data目錄中。
3.重新啟動Cassandra叢集
原文標題:Cassandra叢集資料初始化方案的構想
連結:http://www.cnblogs.com/gpcuster/archive/2010/07/03/1770452.html