Hair Shreedharan大作《Using Flume:Flexible,Scalable and Reliable Data Streaming》原版授权翻译,未经允许不得转载!
Apache HBase是Hadoop生态系统中的键值对数据库。经常用于实时写入和更新数据。也可以用于提供实时服务,代替传统的数据库。它建立在HDFS上并且依赖于HDFS的副本机制。从逻辑上来讲,HBase数据模型类似于数据写入到有若干行和列的表的数据库,它的列不是固定模式,而是可以由客户端动态创建生成。(每个行健可以有一个不同列的集合而且没有一个表示固定列集合的固定模式)。
每一行用一个已知的键做为行键存取,这和标准数据库系统中的主键非常相似。根据需要一个行键可以有多个列,但是每行中的每一个列只能有一个对应的值(不过HBase可以保留多个“版本”——该行对应列的最后n个值)。HBase将所有列分组为列族,一起保存到HDFS。所以,把相似模式写入和获取的数据分为一个列簇通常是一个好主意。
HBase客户端API允许使用Java程序与HBase集群进行交互。使用Put的方式写入到HBase,代表一次写入一行。每个Put方法通过远程过程调用(RPC)来写入相同行中的多列。HBase也支持Increment方法,可以用在列中的增量值作为计数器。像Put,Increment方法也可以在一个RPC访问中更新相同行的多个列值。
在Flume和HBase交互环境中,虽然HBase提供了更新和删除数据的RPC调用,不过我们只关心Put和Increment,。更多的细节可以参考HBase权威指南 [hbase-client] 。除了Java可以和HBase进行交互外,HBase提供了Thrift API,可以参考Apache HBase wiki [hbase-thrift] 。
除了客户端API以外,HBase提供了一个和HBase集群交互的Shell客户端。HBase Shell有处理写入、获取、增量、删除、扫描的命令等,也可以创建、禁用、清空和删除表 [hbase-shell] 。可以用下面的命令开始一个HBase Shell:
hbase shell
HBase提供基于单行数据操作的原子性保证。如果在单个Put相同的行写入多个列, 它可以保证读取旧的所有的列的值或者所有列的新值,不会一部分新值一部分旧值。不过,HBase没有提供事务或ACID(原子性、一致性、隔离性、持久性)。由于在多行中没有事务,因此不能给客户端读取多行提供一致性保证。
如上所述,HBase基于HDFS构建。因此在HBase中的数据可以自动备份。它将HBase的行划分为Region。一个Region是两个固定值之间行键的集合。 HBase将整个数据集分为多个Region,每个Region由叫做RegionServer的服务托管。在任何时候,一个RegionServer托管一个独有的Region,不过单个RegionServer也可以托管多个Region。通过RegionServer托管的那个Region来进行每行数据的读或写。决定哪一个服务器加载的Region的服务是HBase Master。Master是HDFS NameNode的HBase版本。Master也会决定一个太大的Region什么时候进行分裂等。
Flume允许用户在HBase中Put数据或者增量统计。用户可以将自定义代码嵌入到Flume中,用于将Flume的事件转换为HBase的Put或Increment操作。我们将会在117页“使用序列化器翻译Flume事件为HBase Puts和Increments”小节中讲解到。
本章中讨论了HDFS和HBase的基本概念。尽管Flume支持其他系统,不过HDFS和HBase这些系统是最重要和最常用的。在 sinks 章节,将会讨论如何以可扩展的方式写入数据到这些系统。