一问读懂Apache Kudu( 三 )

与Kudu中其他模块中的数据结构不同,MemRowSet中的数据使用行式存储 。因为数据都在内存中,所以性能也是可以接受的,而且Kudu对在MemRowSet中的数据结构进行了一定的优化 。
DiskRowSet
当MemRowSet被flush到硬盘上,就变成了DiskRowSet 。当MemRowSet被flush到硬盘的时候,每32M就会形成一个新的DiskRowSet,这主要是为了保证每个DiskRowSet不会太大,便于后续的增量compaction操作 。Kudu通过将数据分为base data和delta data,来实现数据的更新操作 。Kudu会将数据按列存储,数据被切分成多个page,并使用B-tree进行索引 。除了用户写入的数据,Kudu还会将主键索引存入一个列中,并且提供布隆过滤器来进行高效查找 。
Compaction
为了提高查询性能,Kudu会定期进行compaction操作,合并delta data与base data,对标记了删除的数据进行删除,并且会合并一些DiskRowSet 。
分区
和许多分布式存储系统一样,Kudu的table是水平分区的 。BigTable只提供了range分区,Cassandra只提供hash分区,而Kudu提供了较为灵活的分区方式 。当用户创建一个table时,可以同时指定table的的partition schema,partition schema会将primary key映射为partition key 。一个partition schema包括0到多个hash-partitioning规则和一个range-partitioning规则 。通过灵活地组合各种partition规则,用户可以创造适用于自己业务场景的分区方式 。
四、Kudu的应用
Kudu的应用场景很广泛,比如可以进行实时的数据分析,用于数据可能会存在变化的时序数据应用等,甚至还有人探讨过使用Kudu替代Kafka的可行性(详情请戳) 。不过Kudu最有名和最成功的应用案例,还是国内的小米 。小米公司不仅使用Kudu,还深度参与了Kudu的开发 。Kudu项目在2012年10月由Cloudera公司发起,2015年10月对外公布,2015年12月进入Apache孵化器,但是小米公司早在2014年9月就加入到Kudu的开发中了 。
下面我们可以跟随Cloudera在宣传Kudu时使用的ppt来看一看Kudu在小米的使用 。

一问读懂Apache Kudu

文章插图
 
小米 use case
从上图中我们可以看到,Kudu在小米主要用来对手机app和后端服务的RPC调用事件进行追踪,以及对服务进行监控 。在小米的使用场景下,Kudu集群已经达到每天200亿次写入,并且还在增长 。
Kudu除了优秀的性能,更为重要的是可以简化数据处理的流程 。在使用Kudu以前,小米的数据处理流程是这样的:
一问读懂Apache Kudu

文章插图
 
before Kudu
可以看到,数据处理的流程很长 。这种处理模式不但较为复杂,而且latency较高,通常需要等待较长的时间(1 hour - 1day)才能得到分析结果 。下面再来看看使用Kudu以后的数据处理流程是怎样的:
一问读懂Apache Kudu

文章插图
 
after Kudu
使用Kudu以后,数据处理的链路被简化了,而且得益于Kudu对随机读写和数据分析操作的支持都很好,可以直接对Kudu中的数据进行交互式分析,降低了系统复杂度,并且latency被大大缩短(0 ~ 10s) 。
五、进一步学习
如果您看了本文的介绍后想进一步学习Kudu,以下途径可以帮助您快速入门:
  1. 官方文档永远是学习开源项目的最好去处 。
  2. Kudu的论文可以帮助您深入了解Kudu的设计思想 。
  3. Raft协议,虽然不属于Kudu的内容,但是Kudu的一致性协议使用了Raft协议,了解Raft协议可以帮助您更好地了解Kudu及其他分布式开源系统 。
  4. 这篇博客也许能对您在如何使用Kudu的问题上有一些启发 。
文章参考地址:https://www.jianshu.com/p/83290cd817ac比较遗憾的是,由于Kudu还很年轻,所以并没有比较好的相关书籍出版 。计算机是一门实践性较强的学科,所以动手实践是成为Kudu专家的必经之路 。
Apache Kudu主节点(Master)迁移
一问读懂Apache Kudu

文章插图
 
提前修改机器上kudu账号可以登录,(/etc/passwd),之后都是以kudu执行命令
1、将每个master的记录下来kudu fs dump uuid --fs_wal_dir=/home/data/kudu-master --fs_data_dirs=/home/data/kudu-master 2>/dev/null
2、存活的一个master上执行kudu local_replica cmeta print_replica_uuids --fs_wal_dir=/home/data/kudu-master --fs_data_dirs=/home/data/kudu-master 00000000000000000000000000000000 2>/dev/null
3、根据前两步确定dead master的uuid4、在新master机器上执行,uuid为dead master的标识kudu fs format --fs_wal_dir=/home/data/kudu-master --fs_data_dirs=/home/data/kudu-master --uuid=af4f6c30a3b04d86ae0172598d443a32


推荐阅读