一、什么是Hbae(Hbase的介绍)?
????????1、Hbase的原型是Google的BigTable论文,受到该论文思想启发,目前作为hadoop的子项目来开发维护用来支持结构化的数据存储。
? ? ? ? 2、Hbase是一个高可用、高性能、面向列、可伸缩的分布式存储系统。
二、Hbase的特性
1、海量存储:Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正式因为Hbase良好的扩展性,才为海量数据的存储提供了便利。
2、列式存储:这里的列式存储其实说的是列族存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
3、极易扩展:
Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。 通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
4、高并发:由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。
5、稀疏:稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
三、Hbase架构图详解
????????
?Hbase架构详解: ? ? ? ? 0、Client:提供访问hbase的接口
? ? ? ? 1、Hmaster:处理Hregion的分配或转移。如果Hregion的数据量过大,Hmaster会对拆分后的Region重新分配RegionServer。(如果发现失效的HRegion,也会将失效的HRegion分配到正常的HRegionServer中)
? ? ? ? 2、zookeper:存储hbase的原数据(meta表)
? ? ? ? 3、HRegionServer:它是处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点。
? ? ? ? 4、Hlog:在我们写数据时首先是写到内存,然而为了防止数据没写到内存,我们会写一份hlog到hdfs
? ? ? ? 5、Hregion:它里边会有多个store,每个store相当于一个列族
? ? ? ? 6、Store:相当于列族下边的列(当然一个列族下边可以有多个列)
? ? ? ? 7、Memstore:数据首先会写到我们的Menstore里边(相当于一个内存可以设置它的大小以及阈值,当存满或者到达它的这个阀值,就会刷写到我们的硬盘上)
? ? ? ? 8、StoreFile:当Memstore存满之后,剩余的刷写到硬盘(storefile、hflie这两个本质上是一个东西)在hbase中它叫storefile
? ? ? ? 9、Hfile:在hdfs中它叫hfile?
Hbase架构总结:
? ? ? ? 首先client客户端是数据进入hbase的接口,经过zookeper元数据分配数据所需要进入的regionserver,进入regionserver先经过hlog预写入hdfs中存储,regionserver管理者hmaster分配的region进入磁盘中如果memstore达到一定阀值切分成Hfile传入hdfsclient中进行小文件合并成大文件,最后传入hadoop? datenode中
? ? ? ? 如果regionserver出现宕机会通过zookeeper向Hmaster请求重新创建一个Hregionserver将宕机的regionservr中的region分配给新建的regionserver中,还有一种情况就是region中的store的大小和数量达到一定阀值会分配出一个region分配给其他regionserver达到负载均衡的表现。
四、自定义hbase
public class HBaseSinkFunction extends RichSinkFunction<OrderGoodsWideEntity> {
Connection connection = null;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","hadoop101:2181,hadoop102:2181,hadoop103:2181");
connection = ConnectionFactory.createConnection(conf);
}
@Override
public void invoke(OrderGoodsWideEntity value, Context context) throws Exception {
//获取核心操作对象
Admin admin = (HBaseAdmin)connection.getAdmin();
//获取操作表名
Table table = connection.getTable(TableName.valueOf("orderDetail"));
//向表中插入数据
//输入参数遍历存入hbase
//行键
Put put = new Put(Bytes.toBytes(value.getOrgId()));
//列族,列名,值
put.addColumn(Bytes.toBytes("columns"),Bytes.toBytes("areaId"),Bytes.toBytes(value.getOrderId().toString()));
table.put(put);
}
@Override
public void close() throws Exception {
super.close();
connection.close();
}
}
五、在我们大数据开发中为什么使用hbase存储数据??
? ? ? ? 首先hbase是支持OLAP(在线分析)操作的,并且hbase读取速度快,方便调用,做后边分析处理的一个数据存储框架,当然也有弊端,不支持复杂sql的查询,需要借助phoeinx。?
如果有总结不到位的地方,大家可以评论留言,再次完善。
|