HBase简介目录1.HBase简介2.Hbase数据模型3.Hbase体系结构4.HBase提供的接口5.HBase优化6.HBase用途HBase简介Hadoop生态系统成员名用途Pig基于hadoo的数据流系统,Pig是SQL-like语言,是在MapReduce上构建的一种高级查询语言,把一些运算编译进MapReduce模型的Map和Reduce中,并且用户可以定义自己的功能hive基于hadoop的数据仓库,由facebook开源,最初用于解决海量结构化日志数据统计问题,hive定义了一种类似sql的查询语言(HQL),将sql转化为MapReduce任务在hadoop上执行,通常用于离线分析sqoop是sql-to-hadoop的缩写,主要用于传统数据库和hadoop之间的数据传输。数据的导入和导出本质上市MR程序,充分利用MR的并行化和容错性AvroAvro是一个RPC项目,有点类似Google的protobuf和Facebook的thrift。avro用来做以后hadoop的RPC,使hadoop的RPC更快、数据结构更紧凑。HBase基于HDFS是一个开源的,基于列存储模型的分布式数据库。HDFS分布式文件系统MapReduce实现了MapReduce编程框架ZooKeeperZookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,利用zookeeper可以避免单点故障。它提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。HBase简介HBase是一个分布式的、多版本的、面向列的开源数据库利用HadoopHDFS作为其底层存储系统,提供高可靠性、高吞吐、列存储、可伸缩、实时读写的数据库系统。利用HadoopMapReduce来处理HBase中的海量数据利用Zookeeper作为协同服务。HBase简介HBase中表的特点大:一个表可以有上亿行,上百万列(列多时,插入变慢)面向列:面向列(族)的存储和权限控制,列(族)独立检索。稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。每个cell中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;HBase中的数据都是字符串,没有类型;HBASE特点强一致性同一行数据的读写只在同一台RegionServer上进行水平伸缩Region的自动分裂以及Master的balance;只用增加Datanode机器即可增加容量;只用增加RegionServer机器即可增加读写吞吐量HBASE特点行事务同一行的列的写入是原子的;按列存储+三维有序SortedMap(RowKey,List(SortedMap(Column,List(Value,Timestamp))))rowKey(ASC)+columnLabel(ASC)+Version(DESC)--valueHBASE特点支持有限查询方式和一级索引仅支持单行事务仅支持三种查询方式(singlerowkey、rangerowkey、scanallrowsoftable)【可通过hive等实现多表关联查询】仅基于rowkey的索引高性能随机读写和Hadoop无缝集成Hadoop分析后的结果可直接写入HBase;存放在HBase的数据可直接通过Hadoop来进行分析。HBase与RDBMS对比HBaseRDBMS数据类型只有字符串丰富的数据类型数据操作简单的增删改查各种各样的函数,表连接存储模式基于列存储基于表格结构和行存储数据保护更新后旧版本仍然会保留替换可伸缩性轻易的进行增加节点,可扩展性高需要中间层目录1.HBase简介2.HBase数据模型3.Hbase体系结构4.HBase提供的接口5.HBase优化6.HBase用途逻辑视图、物理视图12HBase以表的形式存储数据。表由行和列组成。列划分为若干个列族(rowfamily)RowKeyTimeStampColumn-family1(realtime)Column-family2(info)Column-family3CF”priceCF”url“CF”domain“taobao1233456t1111“taobao.com/1234“taobao.comt2221“taobao.com/1234”“taobao.com”t3100“taobao.com/1234”“taobao.com”RowKeyTimeStampColumn“realtimetaobao123456t1Price:111t2Price:221t3Price:100逻辑视图物理视图RowKeyTimeStampColumn”info”url:…….“domain:……t2”url:………“domain:…….HBase每个列族存储为一个Store存储结构RowlengthrowKey的字符长度RowrowKey的值columnFamilyLengthcolumnFamily的长度columnFamilycolumnFamily的值columnqualifiercolumntimestamp时间戳(版本)KeytypeKey的类型(Put,Delete,DeleteColumn,DeleteFamily)Hbase是基于列存储的数据库,可简单认为每个ColumnFamily对应一张存储表,表格的RowKey、Timestamp和column确定了每条记录的唯一索引。在物理层面上,表格的数据是通过StoreFile来存储的,每个StoreFile相当于一个可序列化的Map,Map的key和value都是可解释型字符数组,如key的字符数组主要由以下信息组成(value于此类似):而多个map整合到一起,便形成一张松散的、可分布式的、多维的、可序列话的BigTableHBase数据表中一些关键概念Rowkey键ColumnFamily列族Cellqualifier列族修饰符(列)Timestamp时间戳Region区域Cell单元格键Rowkey表中行的键是字节数组(最大长度是64KB)任何字符串都可以作为键;表中的行根据行的键值进行排序,数据按照Rowkey的字典序(byteorder)排序存储;所有对表的访问都要通过键通过单个rowkey访问通过rowkey的range全表扫描列族ColumnFamilyHBase表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分预先定义。如create‘info’,‘realtime’;列名以列族作为前缀,每个“列族”都可以有多个列成员(column);如info:name,realtime:price,新的列族成员可以随后按需、动态加入;权限控制、存储以及调优都是在列族层面进行的;同一列族成员最好有相同的访问模式和大小特征;HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。单元格修饰符Cellqualifier通过列族:单元格修饰符,可以具体到某个列;可以把单元格修饰符认为是实际的列名;在列族存在,客户端随时可以把列添加到列族;HTabletable=newHTable(conf,tableName);Getget=newGet(rowKey.getBytes());Resultrs=table.get(get);for(KeyValuekv:rs.raw()){System.out.print(newString(kv.getRow())+);System.out.print(newString(kv.getFamily())+:);System.out.print(newString(kv.getQualifier())+);System.out.print(kv.getTimestamp()+);System.out.println(newString(kv.getValue()));}时间戳Timestamp在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。时间戳的类型是64位整型。时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。区域RegionHBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据;每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region;当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Region上。Cell单元格由行和列的坐标交叉决定;单元格是有版本的;单元格的内容是未解析的字节数组;由{rowkey,column(=family+label),version}唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。锁HBase的写操作是锁行的,每一行都是一个原子元素,无论对行进行访问的事务涉及多少列,对行的更新都是原子的,也就是说要么成功要么失败不会存在成功一部分的情况。HBase中数据表的物理存储方式物理存储231、Table中的所有行都按照rowkey的字典序排列。2、Table在行的方向上分割为多个HRegion。物理存储243、Region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Region就会等分会两个新的Region。当table中的行不断增多,就会有越来越多的Region。物理存储254、Region是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Region可以分布在不同的Regionserver上。但一个Region是不会拆分到多个Regionserver上的。物理存储265、Region虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,Region由一个或者多个Store组成,每个store保存一个columnfamily。每个Strore又由一个memStore和0至多个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上。物理存储27HFile的格式为:物理存储HFile分为六个部分:DataBlock段:保存表中的数据,这部分可以被压缩,hbaseI/O的基本单元MetaBlock段(可选的):保存用户自定义的kv对,可以被压缩。FileInfo段:HFile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。DataBlockIndex段:DataBlock的索引。每条索引的key是被索引的block的第一条记录的key。MetaBlockIndex段(可选的):MetaBlock的索引。Trailer段:这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先读取Trailer,Trailer保存了每个段的起始位置(段的MagicNumber用来做安全check),然后,DataBlockIndex会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个block读取到内存中,再找到需要的keyDataBlockIndex采用LRU机制淘汰,该blockcache的大小直接影响读性能。HFile的DataBlo