定义:
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提
供的分布式数据存储同样,HBase在Hadoop之上提供了相似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不一样于通常的关系数据库,它是一个适合于非结构化数据存储的数据库。另外一个不
同的是HBase基于列的而不是基于行的模式。
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— ********************************************************************HBase********************************************************************************************* —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 1、HBase特色 —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— Hbase是一个面向列的分布式存储系统。 1)存储量大 :能够存储很大的数据量,而关系型数据库是有瓶颈的(一个表能够有数十亿行,上百万列) 2)面向列 : 每行都有一个可排序的主键(rowkey),和任意多的列,列能够根据须要动态的增长,同一张表中能够有不少大相径庭的列 3) 稀疏 : 对于空的列(null ) 不占用存储空间的,表能够设计的很是稀疏 4)数据多版本 :每一个数据能够有多个版本存储,默认状况下版本号自动分配的,通常来讲就是插入时间戳。 5)数据类型单一:在Hbase中数据都是字符串,没有类型 ———————————————————————————————————————————————————————————————————— 2、基本概念 ———————————————————————————————————————————————————————————————————— 推荐概念理解网址:https://blog.csdn.net/devcy/article/details/79790113 1)表空间(namespace) :相似于mysql中数据库的概念(database) 2) 表(table) 3) 行(row) 3) 列(Column) 4) 单元格(cell): 都是由时间戳,具体的值组成(能够看下列的模型) 5) 行键(rowkey) ①全部的行是按照rowkey的字典序进行排序的,字典序是按照二进制逐字节进行比较的 (就是每一个key的第一位进行比较,而后第二位进行比较,而后第三位,例如:100比20小) ②行键老是惟一的,而且只出现一次,行键能够是任意的字节 支持64kb 6) 列簇:(column family):由若干个列构成一个列簇 注意:①列簇在建表的时候就须要定义好,而且不能频繁修改,数量也不要太多 ②空的列(null ) 不占用存储空间的,表能够设计的很是稀疏 ———————————————————————————————————————————————————————————————————— 3、组件 ———————————————————————————————————————————————————————————————————— HBase的服务器体系结构听从简单的主从服务器架构,它由HRegion Server集群 + HBase Master集群服务器 + ZK集群组成 。 主节点Hmaster在整个集群当中只有一个在运行,从节点HRegionServer有很 多个在运行。即只有一个机器上面跑的进程是Hmaster,不少机器上面跑的进程是HRegionServer, ZK在HBase和Hadoop HA中同样,都是保存元数据的。 Hadoop HA : ①保存镜像文件和编辑日志 ②保证集群中只有一个NN HBase: ①存储HBase的-ROOT-表和.META.表 ②保证HBase Master集群只有一个HBase Master 区别:①NN中有镜像文件和编辑日志,因此DN中的心跳检测发送给NN。可是HBase Master没有元数据,因此心跳检测有ZK代替! ②Hadoop HA中起到共享存储系统,可是在HBase中,倒是起到HBase Master 和 HRegion Server的中介做用!! Zookeeper: ①保证任什么时候候,集群中只有一个HMaster(HBase没有单点故障!!!能够同时启动多个,可是ZK得保证每时刻只有一个HMaster运行); ②存储HBase的-ROOT-表和.META.表: -ROOT-表:记录了全部.META.表的元数据信息,-ROOT-表只有一个Region --->意思是-ROOT-表只有一张 .META.表:记录了Hbase中全部表的全部HRegion的元数据信息(位置信息等),.META.表能够有多个Region ----->意思是-META-表能够有多张 因此说-ROOT保存的是多张.META表的元数据信息 ③实时监控HRegion Server的信息(心跳检测),并实时通知给HMaster; 注:HBase没有单点故障!!!能够同时启动多个,可是ZK得保证每时刻只有一个HMaster运行 HMaster:
①为HRegionServer分配HRegion
②管理HRegionServer的负载均衡(合并的storeFile文件向其余HRegion Server迁移)
③在HRegionServer停机后,负责失效HRegionServer上
HRegion迁移工做。java
④在Region Split后,负责新Region的分配
⑤HDFS上的垃圾文件回收(storeFile合并、切分都在HDFS上进行)mysql
注:HMaster须要知道HRegionServer的信息,这些信息都有Zookeeper提供! HRegion Server: ①监控维护Region,处理对这些HRegion的响应,请求; ②负责切分在运行过程当中变得过大的HRegion。 HLog HLog:用来作灾难恢复使用,HLog记录本台region server上全部HRegion数据的全部变动,一旦region server 宕机,就能够从log中进行恢复。 注:每一个HRegion Server只有一个HLog HRegion:(结合图来看) 注意: ①一张表由多个HRegion组成,根据rowkey划分 : eg:分为三个HRegion,那么他们的存储rowkey值会是(0000-2999)(3000-5999)(6000-8999),分布在不一样的HRegion Server ②HRegion由多个store组成,每一个store对应一个列族: eg:好比一张表有十个列族,那么HRegion会有十个store
③store有一个memstore(缓存区)和多个HFile文件组成:git
eg:对写数据时,会先写进memstore,memstore达到阈值时,溢写成文件StoreFile。github
HRegion会将大量的热数据、访问频次最高的数据存储到MemStore中,这样用户在读写数据的时候不须要从磁盘中进行操做,
直接在内存中既能够读取到数据,正由于MemStore这个重要角色的存在,Hbase才能支持随机,高速读取的功能sql
④MemStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存(二进制)shell
⑤当多个StoreFile文件达到必定的大小后,会触发Compact合并操做,合并为一个StoreFile
⑥当Storefile大小超过必定阈值(256M)后,会把当前的HRegion分割为两个(Split),并由Hmaster分配到相应的HRegionServer,实现负载均衡!!
注:每一个HRegionServer至关于一个DN,但有些DN没有HRegionServer。
因此HMaster将分割后的StoreFile文件数据移到HRegionServer(HDFS)上,这过程必需要实现负载均衡数据库
注:HBase是经过DFS client把数据写到HDFS上apache
———————————————————————————————————————————————————————————————————— 4、HBase读写流程 ———————————————————————————————————————————————————————————————————— 写数据流程: 1,Client先访问zookeeper的root表,而后访问meta表,从meta表获取相应HRegion信息 2,经过HRegion信息,找到相应的regionserver 3,把数据操做、真实数据分别写到HLog和MemStore上一份 4,MemStore达到一个阈值后则把数据刷成一个StoreFile文件。(若MemStore中的数据有丢失,则能够HRegionServer上的HLog上恢复) 5,当多个StoreFile文件达到必定的大小后,会触发Compact合并操做,合并为一个StoreFile,(这里同时进行版本的合并和数据删除。) 6,当Storefile大小超过必定阈值后,HRegionServer会把当前的Region分割为两个(Split),并由Hmaster分配到相应的HRegionServer,实现负载均衡 注:HFile是HBase中真正实际数据的存储格式,HFile是二进制格式文件,StoreFile就是对HFile进行了封装(其实就是一个东西) HBase读数据流程 1,Client先访问zookeeper的root表,而后访问meta表,从meta表获取相应HRegion信息 2,找到这个HRegion对应的regionserver 3,查找对应的HRegion 5,先从MemStore找数据,若是没有,再到StoreFile上读(为了读取的效率)。 注意: ①Client访问hbase上数据时并不须要Hmaster参与,数据的读写也只是访问RegioneServer。 ②HMaster仅仅维护这table和Region的元数据信息,负载很低。 ③HBase是经过DFS client把数据写到HDFS上 ④HFile是HBase中真正实际数据的存储格式,HFile是二进制格式文件,StoreFile就是对HFile进行了封装(其实就是一个东西) ⑤MemStore溢写文件成StoreFile,和对StoreFile进行合并都是在HDFS上进行的 ———————————————————————————————————————————————————————————————————— 4、Hbase寻址过程 ———————————————————————————————————————————————————————————————————— HBase 有两张特殊表(都在ZK上): .META.:记录了用户全部表拆分出来的的 Region 映射信息,.META.能够有多个 Regoin(rowkey段) -ROOT-:记录了.META.表的 Region 信息,至关于给META表的内容作了一次索引 Client 访问用户数据前须要首先访问 ZooKeeper,找到-ROOT-表的 Region 所在的位置,然 后访问-ROOT-表, 接着访问.META.表,从META表中找到RowKey段所在的HRegion Server的位置信息,最后才能找到用户数据的位置去访问, 中间须要屡次 网络操做,不过 client 端会作 cache 缓存。 ———————————————————————————————————————————————————————————————————— 4、基本命令 ———————————————————————————————————————————————————————————————————— bin/hbase shell //进入shell list_namespace //列出全部命名空间 list_namespace_tables 'hbase' //列出命名空间hbase中的全部表 create_namespace 'test' //建立命名空间 drop_namespace 'test' //删除命名空间 create 'test:t1', 'f1', 'f2', 'f3' //在命名空间test中建立表t1,有三个列族:‘f1 , 'f2' , 'f3' disable 'test:t1' drop 'test:t1' //删除表必须先禁用 put 'test:t1','1001','f1:name','tiantian' //添加数据 put 'test:t1','1001','f1:age','98' put 'test:t1','1001','f1:age','98' put 'test:t1','1001','f1:age','98' get 'test:t1','1001' //获得key=1001全部列 get 'test:t1','1001','f1' //获得key=1001列族下的全部列 get 'test:t1','1001','f1:name' //查询key=1001的名字 get 'test:t1','1001',{COLUMN=>'info:age',VERSIONS=>2} //获得两个版本的年龄 count 'test:t1' //表的记录数 delete 'test:t1','1001','f1:name' //删除1001的name数据 scan 'test:t1' //Scan 相似于mysql中的select * 可是在实际开发中不建议使用。若是使用请买好车票 scan 'test:t1',{COLUMNS =>'f1:name'} //指定列族扫描 注:①若是没有指定命名空间,默认是defult命名空间 get 't1','1001' //获得defult下key=1001全部列 ②当输入create、get、put等关键字中回车,会显示相关命令的实例。 ———————————————————————————————————————————————————————————————————— ———————————————————————————————————————————————————————————————————— 5、HBase API ———————————————————————————————————————————————————————————————————— 注:Hbase和Hive、MR同样都有本身的API实现,能够用java去实现增删查改。 ———————————————————————————————————————————————————————————————————— 6、Rowkey的设计原则 ———————————————————————————————————————————————————————————————————— ①RowKey惟一原则:必须在设计上保证其惟一性。 ②RowKey长度原则:通常设计成定长。建议是越短越好 ③RowKey散列原则: 若是用时间戳作rowkey,那么HRegion多是(0-6)(6-12)(12-18)(18-24); 那么产生的结果是(12-18)(18-24)的数据不少, 因此通常把时间戳倒过来,20180213-->31208102 热点问题: 1、加盐:是在rowkey的前面分配随机数,当给rowkey随机前缀后,它就能分布到不一样的region中 2、哈希:将rowkey转化为hash值,除以集群个数,就能避免热点问题 3、反转:时间戳反转过来,避免热点问题 ———————————————————————————————————————————————————————————————————— 7、Hbase Filter ———————————————————————————————————————————————————————————————————— 就至关于过滤器,理解为sql语句的过滤条件 where 对查询出来的结果进行过滤,操做Hbase的过滤器能够经过shell的方式完成 1 RowFilter:筛选出匹配的全部行 2 ValueFilter:按照具体的值来筛选单元格 3 ColumnPrefixFilter 按照列的前缀来查找单元格 需求: 1 找到访问的网站www.umeng.com的记录 scan 'ns1:phoneLog',FILTER=>"ValueFilter(=,'binary:www.umeng.com')" 注:Filter的重要性会愈来愈低,因为phoenix,毕竟sql是公用的。 ———————————————————————————————————————————————————————————————————— 8、Hbase的优化 ———————————————————————————————————————————————————————————————————— 1、配置MemStore缓存区的大小 2、配置文件合并 compact阈值 3、配置文件拆分的阈值与split 4、还有其余的诸如垃圾回收机制 ———————————————————————————————————————————————————————————————————— ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— ********************************************************************HBase集成MapReduce*************************************************************************** ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 1、Hbase与MapReduce集成 ———————————————————————————————————————————————————————————————————— ———————————————————————————————————————————————————————————————— ①系统集成 ———————————————————————————————————————————————————————————————— ———————————————————————————————————————————————————————————— 1)安装配置 ———————————————————————————————————————————————————————————— Hbase与MapRedcue内部已经作好了集成,直接调用便可 集成的模式: 答:Hbase中读取数据,则能够做为map的输入, 将数据写到hbase中,Hbase就能够做为reduce的输入 步骤: ①把HBase集成的jar包加载到hadoop的classpath路径中(不然会报ClassNotFoundException) vi /etc/profile: export HBASE_HOME=/opt/app/hbase-1.3.1 export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`$HBASE_HOME/bin/hbase mapredcp` ②查看集成的示例命令 hadoop jar /opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar //须要将hadoop_home/bin追加到path CellCounter: Count cells in HBase table. WALPlayer: Replay WAL files. completebulkload: Complete a bulk data load. copytable: Export a table from local cluster to peer cluster. export: Write table data to HDFS. exportsnapshot: Export the specific snapshot to a given FileSystem. import: Import data written by Export. importtsv: Import data in TSV format. rowcounter: Count rows in HBase table. ———————————————————————————————————————————————————————————— 2)集成实例(必须在HMaster上运行) ———————————————————————————————————————————————————————————— ①测试统计行数命令(rowcounter) hadoop jar /opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar rowcounter test:t1 注:会自动的统计test:t1表的行数 ②测试导入命令(importcsv) 1)create 'test:t1','f1','f2' //建立一个表,表中含有两个列族(f1,f2) 2) 建立一个1.csv 1,tiantian,shankou,92 2,xuewei,jingbian,89 3) hdfs dfs -put ./1.csv / //上传文件到hdfs上 4) hadoop jar /opt/app/hbase-1.3.1/lib/hbase-server-1.3.1.jar importtsv -Dimporttsv.separator=, //文件中的分隔符 -Dimporttsv.columns=HBASE_ROW_KEY, f1:name, f2:location, f2:age test:t1 /1.csv 5)测试:scan 'test:t1' ———————————————————————————————————————————————————————————————— ②java集成Hbase与MapReduce ———————————————————————————————————————————————————————————————— 系统集成其实就是运行hbase自带的jar包 因此咱们其实也能够写MR程序,打包成jar,只不过Map和Reduce继承的TableMapper和TableReducer ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— ******************************************************************** Hbase整合hive********************************************************************************** ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— Hbase:负责存储和读取,没有分析数据的能力, hive:对数据进行分析是hive的基本功能, ①原理: 内部表: 在hive中建立表,在建立的时候hbase同时建立,而且数据保存在hbase中 外部表: 在hbase中已经存在了一张表,hive建立外部表对hbase中表进行映射,数据仍是存在hbase中 ②配置过程省略; eg: CREATE TABLE hbase_table_1(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") //rowkey-------------->key TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz"); //列族cf1中的列val----->value 注:hive:hbase_table_1 -------> hbase: xyz (两张表的映射) ③当导入数据时,首先建立一个普通的表,导入数据,以后使用查询的方式,导入关联表中 load data local inpath '/data/test.txt' into table hbase_table_2; insert overwrite table hbase_table_1 select key ,value from hbase_table_2; —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— ********************************************************************Phoenix 与Hbase的集成************************************************************************** ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 安装步骤省略: phoenix : 利用相似于sql语句对hbase进行增删查改。 语法:http://forcedotcom.github.io/phoenix/ ————————————————————————————————————————————————————————————————————