参考kafka官方文档,版本1.0.x
参考kafka官方文档,版本1.0.x
在Thrift,Protobuf和avro序列化框架中,不约而同使用了zigzag编码来对数字进行编码,从而达到减少数据传输量的目的。
zigzag算法的核心主要是去除二进制数字中的前导0,因为在绝大多数情况下,我们使用到的整数,往往是比较小的。
在avro编码中,对于字符串Martin,长度为6,而6的二进制为0000 0110,其中首位置的0为符号位,在zigzag编码中,正数的符号位会移动到末尾,其它位往前移动一位,所以会变成0000 1100,即0c,再后面的字节是字符串UTF-8编码后的结果
在protobuf编码中,对于字符串的Martin,刚开始的字节表示其id和数据类型,下一个字节表示其长度,后面的字节是字符串UTF-8编码后的结果
参考:《数据密集型应用系统设计》的 Schema evolution in Avro, Protocol Buffers and Thrift
Avro,Protocol Buffer和Thrift中的模式演化(译)
该文章对比了常用的一些存储底层所使用的数据结构。
MySQL,MongoDB的索引使用的就是B+树
B+树在多读少写(相对而言)的情境下比较有优势。
B+树的主要优点:
B+树的缺点:
参考
在Airbnb的rowkey设计案例中,使用了hash法避免了写入热点问题,其中
Event_key标识了一条日志的唯一性,用于将来自Kafka的日志数据进行去重;
Shard_id是将Event_key进行hash(可以参考es的路由哈希算法Hashing.murmur3_128)之后,对Shard_num进行取余后的结果,Shard_num感觉应该是当前hbase表region server的总数,由于airbnb在hbase中存储的是实时日志数据,并开启了Hbase的TTL,所以当前hbase表中的数据总量应该是可预测的,即region server数量不会无限增加
Shard_key应该就是当前业务的region_start_keys+shard_id,比如当前业务分配的前缀为00000,同时规划了100个table regions给这个业务,即00-99,那么Shard_key的范围就是0000000-0000099
rowkey就是Shard_key.Event_key,比如0000000.air_events.canaryevent.016230-a3db-434e
参考:
在美团点评的文章中,介绍了HiveSQL转化为MapReduce的过程