1、模式定义
表
HBase中数据最终会存储在一张表或多张表中。
HTableDescriptor()
HTableDescriptor(String name)
HTableDescriptor(byte[] name)
HTableDescriptor(HTableDescriptor desc)
虽然理论上HBase的表是由行和列组成的,但从物理结构上看,表存储在不同的分区,即不同的region
region中行的逻辑与物理视图
表述性
文件大小限制、memstore刷写大小、延迟日志刷写、只读、其他选项
列族
列族名字必须是可见字符,列名可以由任意二进制字符组成
HColumnDescriptor()
HColumnDescriptor(String familyName)
HColumnDescriptor(byte[] familyName)
void addFamily(HColumnDescriptor family)
列族映射到独立存储文件
列族不能被重命名,通常是新建一个列族,然后使用API从旧列族中复制数据到新列族
2、HBaseAdmin
HBaseAdmin提供了建表、创建列族、检查表是否存在、修改表结构和列族结构和删除表功能
HBaseAdmin(Configuration conf) throws MasterNotRunningException, ZooKeeperConnectionException
HBaseAdmin实例的生命周期不宜太长
void createTable(HTableDescriptor desc)
...
Configuration conf = HBaseConfiguration.create();
HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor(Bytes.toBytes("testtable"));
HCloumnDescriptor coldef = new HCloumnDescriptor (Bytes,toBytes("colfam1"));
desc.addFamily(coldef);
admin.createTable(desc);
列操作,异步调用
void addColumn(String tableName, HColumnDescriptor column)
void deleteColumn(String tableName, HColumnDescriptor column)
void modifyColumn(String tableName, HColumnDescriptor column)
集群操作
表中所有更新在未刷写到磁盘之前都会先写入region的MemStore实例,这是显示刷写
void flush(String tableNameOrRegionName)
合并,是异步方法。调用之后会在region服务器有执行队列进行操作。majorCompact会迭代这张表的所有region,多个HFile重写成一个HFile;minor合并是合并多个小文件。
void compact(String tableNameOrRegionName)
void majorCompact(String tableNameOrRegionName)
移动,可以控制某个region在哪台服务器上线
void move(byte[] encodedRegionName, byte[] destServerName)
调用HBaseAdmin.getClusterStatus
可以查询ClusterStatus实例,这个实例包含了master搜集到整个集群信息
3、远程调用
这些服务内部直接使用基于HTable的客户端API来访问表
远程调用
4、与MapReduce集成
MR过程InputFormat
拆分输入数据,同时返回RecordReader实例,这个实例定义了键值对象的类,并提供了next方法来遍历输入的数据
对于HBase,用户需要提供一个Scan实例。
Mapper
Mapper读取一组特定的键值对,但输出其他类型
HBase提供了一个TableMapper类,将key的类强制转换成一个ImmutableByteWritable,将value类型强制转换为Result类型
Reducer
得到Mapper的输出,经过shuffle和sort的处理。每个Map输出的中间结果都会被复制到Reduce服务器,同时sort阶段会将所有shuffle的数据进行联合排序。
OutputFormat
将数据持久化到不同的位置。
许多Mapper将记录传输给Reducer,但是只有一个OutputFormat处理它对应的Reducer输出。
OutputFormat
执行时Hadoop能够知道块的位置,让操作尽可能在块所在的地方进行执行。HBase的数据也是存储在HDFS上的
一个具体的例子
https://github.com/larsgeorge/hbase-book/blob/master/ch07/src/main/java/mapreduce/AnalyzeData.java
网友评论