1、HBase介绍shell
1、基本概念数据库
HBase是一种Hadoop数据库,常常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键、列键和时间戳创建索引,是一个能够随机访问的存储和检索数据的平台。HBase不限制存储的数据的种类,容许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase被设计成在一个服务器集群上运行,能够相应地横向扩展。数组
2、HBase使用场景和成功案例缓存
3、HBase Shell命令行交互:服务器
启动Shell $ hbase shellapp
列出全部的表 hbase > listeclipse
建立名为mytable的表,含有一个列族hb hbase > create ' mytable' , 'hb'异步
在‘mytable’表的'first'行中的‘hb:data’列对应的数据单元中插入字节数组‘hello HBase’分布式
hbase > put 'mytable' , 'first' , 'hb:data' , 'hello HBase' oop
读取mytable表 ‘first’行的内容 hbase > get 'mytable' , 'first'
读取mytable表全部的内容 hbase > scan ‘mytable'
2、入门
1、API
和数据操做有关的HBase API有5个,分别是 Get(读),Put(写),Delete(删),Scan(扫描)和Increment(列值递增)
2、操做表
首先要建立一个configuration对象
Configuration conf = HBaseConfiguration.create();
使用eclipse时的话还必须将配置文件添加进来。
conf.addResource(new Path("E:\\share\\hbase-site.xml"));
conf.addResource(new Path("E:\\share\\core-site.xml"));
conf.addResource(new Path("E:\\share\\hdfs-site.xml"));
使用链接池建立一张表。
HTablePool pool = new HTablePool(conf,1);
HTableInterface usersTable = pool.getTable("users");
3、写操做
用来存储数据的命令是put,往表里存储数据,须要建立Put实例。并制定要加入的行
Put put = new Put(byte[] row) ;
Put的add方法用来添加数据,分别设定列族,限定符以及单元格的指
put.add(byte[] family , byte[] qualifier , byte[] value) ;
最后提交命令给表
usersTable.put(put);
usersTable.close();
修改数据,只需从新提交一次最新的数据便可。
HBase写操做的工做机制:
HBase每次执行写操做都会写入两个地方:预写式日志(write-ahead log,也称HLog)和MemStore(写入缓冲区),以保证数据持久化,只有当这两个地方的变化信息都写入并确认后,才认为写动做完成。MemStore是内存里的写入缓冲区,HBase中数据在永久写入硬盘以前在这里累积,当MemStore填满后,其中的数据会刷写到硬盘,生成一个HFile。
4、读操做
建立一个Get命令实例,包含要查询的行
Get get = new Get(byte[] row) ;
执行addColumn()或addFamily()能够设置限制条件。
将get实例提交到表会返回一个包含数据的Result实例,实例中包含行中全部列族的全部列。
Result r = usersTable.get(get) ;
能够对result实例检索特定的值
byte[] b = r.getValue(byte[] family , byte[] qualifier) ;
工做机制:
BlockCache用来保存从HFile中读入内存的频繁访问的数据,避免硬盘读,每一个列族都有本身的BlockCache。从HBase中读出一行,首先会检查MemStore等待修改的队列,而后检查BlockCache看包含该行的Block是否最近被访问过,最后访问硬盘上的对应HFile。
5、删除操做
建立一个Delete实例,指定要删除的行。
Delete delete = new Delete(byte[] row) ;
能够经过deleteFamily()和deleteColumn()方法指定删除行的一部分。
6表扫描操做
Scan scan = new Scan() 能够指定起始行和结束行。
setStartRow() , setStopRow() , setFilter()方法能够用来限制返回的数据。
addColumn()和addFamily()方法还能够指定列和列族。
HBase模式的数据模型包括:
表:HBase用表来组织数据。
行:在表里,数据按行存储,行由行键惟一标识。行键没有数据类型,为字节数组byte[]。
列族:行里的数据按照列族分组,列族必须事先定义而且不轻易修改。表中每行拥有相同的列族。
列限定符:列族里的数据经过列限定符或列来定位,列限定符没必要事先定义。
单元:存储在单元里的数据称为单元值,值是字节数组。单元由行键,列族或列限定符一块儿肯定。
时间版本:单元值有时间版本,是一个long类型。
一个HBase数据坐标的例子:
HBase能够看作是一个键值数据库。HBase的设计是面向半结构化数据的,数据记录可能包含不一致的列,不肯定大小等。
3、分布式的HBase、HDFS和MapReduce
1、分布式模式的HBase
HBase将表会切分红小的数据单位叫region,分配到多台服务器。托管region的服务器叫作RegionServer。通常状况下,RgionServer和HDFS DataNode并列配置在同一物理硬件上,RegionServer本质上是HDFS客户端,在上面存储访问数据,HMaster分配region给RegionServer,每一个RegionServer托管多个region。
HBase中的两个特殊的表,-ROOT-和.META.,用来查找各类表的region位置在哪。-ROOT-指向.META.表的region,.META.表指向托管待查找的region的RegionServer。
一次客户端查找过程的3层分布式B+树以下图:
HBase顶层结构图:
zookeeper负责跟踪region服务器,保存root region的地址。
Client负责与zookeeper子集群以及HRegionServer联系。
HMaster负责在启动HBase时,把全部的region分配到每一个HRegion Server上,也包括-ROOT-和.META.表。
HRegionServer负责打开region,并建立对应的HRegion实例。HRegion被打开后,它为每一个表的HColumnFamily建立一个Store实例。每一个Store实例包含一个或多个StoreFile实例,它们是实际数据存储文件HFile的轻量级封装。每一个Store有其对应的一个MemStore,一个HRegionServer共享一个HLog实例。
一次基本的流程:
a、 客户端经过zookeeper获取含有-ROOT-的region服务器名。
b、 经过含有-ROOT-的region服务器查询含有.META.表中对应的region服务器名。
c、 查询.META.服务器获取客户端查询的行键数据所在的region服务器名。
d、 经过行键数据所在的region服务器获取数据。
HFile结构图:
Trailer有指向其余块的指针,Index块记录Data和Meta块的偏移量,Data和Meta块存储数据。默认大小是64KB。每一个块包含一个Magic头部和必定数量的序列化的KeyValue实例。
KeyValue格式:
该结构以两个分别表示键长度和值长度的定长数字开始,键包含了行键,列族名和列限定符,时间戳等。
预写日志WAL:
每次更新都会写入日志,只有写入成功才会通知客户端操做成功,而后服务器能够按需自由地批量处理或聚合内存中的数据。
编辑流在memstore和WAL之间分流的过程:
处理过程:客户端经过RPC调用将KeyValue对象实例发送到含有匹配region的HRegionServer。接着这些实例被发送到管理相应行的HRegion实例,数据被写入到WAL,而后被放入到实际拥有记录的存储文件的MemStore中。当memstore中的数据达到必定的大小之后,数据会异步地连续写入到文件系统中,WAL能保证这一过程的数据不会丢失。
2、HBase和MapReduce
从MapReduce应用访问HBase有3种方式:
做业开始时能够用HBase做为数据源,做业结束时能够用HBase接收数据,任务过程当中用HBase共享资源。
阶段map
protected void map(ImmutableBytesWritable rowkey,Result result,Context context){
};
从HBase表中读取的做业以[rowkey:scan result]格式接收[k1,v1]键值对,对应的类型是ImmutableBytesWritable和Result。
建立实例扫描表中全部的行
Scan scan = new Scan();
scan.addColumn(…);
接下来在MapReduce中使用Scan实例。
TableMapReduceUtil.initTableMapperJob(tablename,scan,map.class,
输出键的类型.class,输出值的类型.class,job);
reduce阶段
protected void reduce(
ImmutableBytesWritable rowkey,Iterable<put>values,Context context){
};
把reducer填入到做业配置中,
TableMapReduceUtil.initTableReducerJob(tablename,reduce.class,job);
3、HBase实现可靠性和可用性
HDFS做为底层存储,为集群里的全部RegionServer提供单一命名空间,一个RegionServer读写数据能够为其它全部RegionServer读写。若是一个RegionServer出现故障,任何其余RegionServer均可以从底层文件系统读取数据,基于保存在HDFS里的HFile开始提供服务。接管这个RegionServerz服务的region。
4、优化HBase
1、随机读密集型
优化方向:高效利用缓存和更好的索引
2、顺序读密集型
优化方向:减小使用缓存。
优化方向:不要太频繁刷写,合并或者拆分。
-XX:CMSInitiatingOccupancyFraction=70
4、混合型
优化方向:须要反复尝试各类组合,而后运行测试,获得最佳结果。
影响性能的因素还包括: