Cassandra集群數據初始化的實現步驟
一個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的消息服務和Gossip服務。
2. 創建Cassandra的文件目錄。
3. 關閉Cassandra的壓縮功能。
4. 等待一個Range的delay時間。
在Reducer中,reduce階段進行以下操作:
1. 根據每一個key創建其對應的ColumnFamily
2. 創建RowMutation的消息
3. 將消息發送到集群中所有應該獲得該數據的節點中。
在Reducer中,close階段進行以下操作:
1. 等待消息服務中所有的消息發送完畢。
2. 完畢Cassandra的消息服務和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
【編輯推薦】
- MongoDB CEO談NoSQL的大數據量處理能力
- 拋棄關系數據庫 PHP程序員應了解MongoDB的五件事
- MongoDB,無模式文檔型數據庫簡介
- 關系數據庫的末日是否已經來臨
- 扔掉沉沒成本 嘗試關系數據庫替代品OODBMS