tonglin0325的个人主页

zigzag编码原理

在Thrift,Protobuf和avro序列化框架中,不约而同使用了zigzag编码来对数字进行编码,从而达到减少数据传输量的目的。

zigzag算法的核心主要是去除二进制数字中的前导0,因为在绝大多数情况下,我们使用到的整数,往往是比较小的。

参考:小而巧的数字压缩算法:zigzag

在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中的模式演化(译)

 

存储底层数据结构对比

该文章对比了常用的一些存储底层所使用的数据结构。

1.B+树

MySQL,MongoDB的索引使用的就是B+树

B+树在多读少写(相对而言)的情境下比较有优势。

B+树的主要优点:

  • 1.结构比较扁平,高度低(一般不超过4层),随机寻道次数少;
  • 2.数据存储密度大,且都位于叶子节点,查询稳定,遍历方便;
  • 3.叶子节点形成有序链表,范围查询转化为顺序读,效率高。相对而言B树必须通过中序遍历才能支持范围查询。

B+树的缺点:

  • 1.如果写入的数据比较离散,那么寻找写入位置时,子节点有很大可能性不会在内存中,最终会产生大量的随机写,性能下降。
  • 2.如果B+树已经运行了很长时间,写入了很多数据,随着叶子节点分裂,其对应的块会不再顺序存储,而变得分散。这时执行范围查询也会变成随机读,效率降低了。

参考:从B+树到LSM树,及LSM树在HBase中的应用

2.LSM树(Log-structured Merge-Tree/日志结构的合并树)

全文 >>

HBase学习笔记——rowkey

1.Airbnb rowkey设计案例

在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

参考:

Reliable and Scalable Data Ingestion at Airbnb

全文 >>