对,我正在研读这本书,今天开始,我希望我看完后能有收获和大家分享,这个日志作为开始,勉励自己!

对,我应该静下心,做一些我更喜欢的事情,不能在自我陶醉中迷失!

断断续的看,到今天大概把这本书看完了,没想到这本书的开始,经历了一件令人愤怒的事情,不料,刚刚看完这本书,经历了一件伤心的事情,足以影响人生轨迹。生活还要继续,读书笔记还是要写。

不过也只能做个提纲式的总结,具体的大家还是要去看书,我的水平只能告诉大家这本书给我带来的收获。

1.HBase建立在Apache Hadoop和Apache Zookeeper这些分布系统之上,HBase也提供单机部署的方式,当然用的是HBase自管理的Zookeeper和linux本地的文件系统。理论上HBase可以运行在任何分布式文件系统上。

2.HBase的数据结构可以认为是一种key-value形式,其中key由行健、列族、列限定符和时间版本四个坐标唯一确定,value就是一个值。HBase理论上是一个无限高的高表,不是一个无限宽的宽表。HBase中所有数据都是作为原始数据(raw data)使用字节数组(byte[])的形式存储的。这个keyvalue的数据库存储格式可以用java代码如下表示


Map<RowKey, Map<ColumnFamily, Map<ColumnQualifier, Map<Version, Data>>>>


3.实践中,使用HTablePool比直接使用HTable更为常见,连接池的方式



HTablePool pool = new HTablePool();
HTableInterface usersTable = pool.getTable("users");
...// work with the table
usersTable.close();



4.HBase执行写入时会写到两个地方:预写日志(write-ahead log,也称HLog)和MemStore。只有两个地方都返回写成功,才认为写动作完成。当MemStore填满后(可以设置大小),其中的数据会刷写到硬盘,生成一个HFile。一个列族可以有多个HFile,但一个HFile不能存储多个列族的数据。每个列族有一个MemStore。

5.HBase的行健值设计是关键,行健值经常希望是均衡分布的,诸如MD5或SHA1等散列算法通常用来实现这种均衡分布,这个的作用是为写优化,当往HBase表写入大量数据时,我们希望在RegionServer上分散负责来进行优化(散列+salting)。散列提供的定长效果也会让事情变得更轻松。如果把时间设计到行健中,那么时间取反会让我们scan的时候先获取到最新的数据。

6.Hadoop是用java编写的,HBase也是用java编写的,原生的HBase客户端也是用java编写的,HBase也提供了其他不使用Java的客户端选择(基于JVM的和不基于JVM的),这部分我略过了,有兴趣的朋友可以看下。JRuby、REST网关、Thrift网关。

7.文中提到HBase与GIS配合使用的一个应用实例,主要是关于地理位置的处理,一个简单的地理位置包括经度纬度,geohash的编码用经纬度交织编码,这样比较靠近的两个点在存储上也比较靠近,找寻附近的节点类应用就只要读取小块内容就可以,实现最近邻居查询,优化了读。

8.Hadoop和HBase生产机器的部署建议,Hadoop Namenode,JobTracker和Secondary Namenode通常用专门的硬件部署,不要用廉价的机器。Zookeeper和HBase Master可以共享节点,Zookeeper需要奇数跟个实例才能满足做出决策的法定服务器数量,Zookeeper推荐配置专用的硬盘写数据,Zookeeper在内存里提供所有的服务,不过它需要将数据持久化存储到硬盘。HBase RegionServer很耗内存,但是又不能给它配置太大的内存,否则会遇到Java垃圾回收stop-the-world问题。大概不要超过15G的堆空间,因为太大了垃圾回收执行的频率会变小,但是垃圾回收每次出现,将持续很长时间,因为它要扫描更大的内存区域。理想的做法是关闭RegionServer节点上的交换,sysctl -w vm.swappiness=0

9.HBase可以提供集群间复制,但是推荐zookeeper是自管理的。可以用HBase自带的工具做主从,主主备份,也可以用Mapreduce提供更加灵活的备份手段。