一个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