1、hbase的基本介绍:
google三篇论文: bigtable ==》 HBase
hbase也是一个nosql数据库 ,基于hadoop上面的一个nosql数据库
hbase主要是用于存储结构和和半结构化松散数据

hbase支持的所有的数据类型都是 :byte[]

hbase的特点:
大:一个表可以有上十亿行,上百万列
面向列:面向列(族)的存储和权限控制,列(族)独立检索。
稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。


hbase是一个nosql非关系型数据库,hbase是基于hdfs的数据存储
数据库:肯定要支持频繁的增删改查
hbase是基于hdfs的数据存储:hbase的数据存储在hdfs上面
hdfs能不能够支持频繁的增删改查???
hdfs设计支持:面向一次写入,多次读出。不适合频繁的增删改查

hbase与hadoop关系:紧耦合关系,hbase的数据都是存储在hdfs上面的

hdfs:适合存储大文件,支持一次写入,多次读取
hbase:使用key,value对来存储数据,支持随机读写操作

hbase依赖于hdfs,注意:如果要操作hbase,一定要保证hadoop正常启动


RDBMS与hbase的对比:
RDBMS:关系型数据库
HBase:nosql非关系型数据库
关系型数据库:例如mysql或者oracle。主要是字段个数一定,字段类型也一定了。使用标准sql语句来进行查询操作
面向行式存储,具有acid的特性,支持事务的操作
插入一张表数据,更新一张表数据,删除一张表数据,这三个操作可以放到一个事务里面去执行

非关系型数据库nosql:
使用wal来存储日志:write ahead log
使用行键 rowkey来进行查询数据 :类似于mysql主键,但是与主键不太一样
使用行,列,列族,单元格cell来进行存储以及区分数据
hbase不支持ACID特性,但是hbase支持单行数据操作事务
hbase是支持单行数据的事务性,不支持多条数据一起操作的事务性
不支持表的join操作


hbase简要特征:
1、适合存储海量数据 每天上亿条数据轻松搞定
2、面向列式存储
3、极易扩展 :hbase的扩展性来源于hdfs的
4、支持高并发的访问请求
5、稀疏表:如果某些字段为空值,并不会占用磁盘存储空间,所以hbase可以轻松的做到上百万列


HBase的架构:
HMaster:主节点,主要负责集群的管理,分配region给RegionServer,还包括从节点的上线和下线
HRegionServer:从节点,主要负责客户端的数据存储与读取,管理region
HRegionServer:1个HLog + 多个Region
HLog:预写日志,将数据的操作记录给保存下来,便于数据的恢复
Region:一个region里面 有多个store模块
store模块:1个memoryStore 128M + 多个StoreFile
多个storeFile会合并成为一个大的HFile存储在hdfs上面


hbase数存储在hdfs上面,需要依赖于hadoop,hbase还需要使用zk来存储一些元数据信息(包括节点的信息)

如果需要搭建hadoop的时候,我们要保证hadoop与zookeeper正常启动

HBase的集群环境安装:
下载安装包解压
更改配置文件
分发到其他机器上
其他机器更改一些特殊配置
启动集群即可

 

HBase的表模型:
表名:tableName
columnFamily:列族
创建一张表,最少需要两个条件:表名 + 列族名

column:列。每一个列都是归属于某一个列族下面的
列族有一点类似于某一些列归放到一起
columnFamily1:专门存放用户属性
columnFamily2:专门存放订单数据

HBase当中列族不宜过多:一般创建一个hbase表,列族大概在1-5个范围之内
rowkey:rowkey是唯一标识我们一条数据的
timeStamp:时间戳,操作数据的时间戳
versionnum:数据的版本号


rowkey + 列名 + 列值 + timestamp + versionum这些都是我们在插入数据的时候动态生成的

注意:插入一条数据的时候,需要指定rowkey,指定属于哪一个列族,
指定列族下面的列名(如果列名不存在,那么久动态进行创建),r
然后再指定列值(cell)
hbase的稀疏表
一个列族下面,可以动态的创建上百万个列


hbase的数据添加操作:


hbase的数据查询操作:查询hbase当中的数据

有三种方式的查询:
第一种方式:通过rowkey直接获取数据
get rowkey

第二种: 全表扫描,这种方式没有人用
scan tableName


第三种方式:指定rowkey的扫描范围
scan startRowy endRowkey
hbase的rowkey有一个特性,所有的rowkey都是按照字典的顺序 进行排列


使用过滤器来进行查询,查询value值为'zhangsan'数据
get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}


查询列名包含 a

get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}

scan可以加上各种限制条件:限制列名 包含a
限制列值 为 zhangsan
限制rowkey以 rk开头的


hbase当中的更新操作:更新操作与hbase的插入操作命令一模一样,只不过有这个rowkey就更新,没有rowkey就进行插入保存

 

drop:删除表,需要先手动禁用表,删除了表之后,表就不存在了
truncate:只清空表数据,表还存在,先是自动禁用表,删除表,再创建表


hbase的查询操作:
get biaoming rowkek

scan biaoming 限制条件

 

hbase当中的过滤器查询:
比较过滤器:主要就是用于比较一些值的情况
专用过滤器:主要就是用于过滤一些条件不符合的数据


rowFilter:专门用于过滤hbase数据的rowkey作用的
familyFilter:专门用于过滤列族名称
QualifierFilter:专门用于过滤列名
valueFilter:对我们列值进行比较过滤

SingleColumnFilter:用于单列值的过滤,满足条件的数据的所有字段都会返回给客户端
prefixFilter:前缀的过滤器,过滤某些前缀开头的数据
PageFilter:分页的过滤器


HBase当中的数据,实际上是存在这么几个地方的
memoryStore:内存空间
storeFile:也会存储数据
HFile:hdfs上面的数据存储
Hlog:预写日志

region与store都是逻辑划分,里面再进一步划分,才到数据真实的存储的物理位置


HBase的数据写入过程
第一步:客户端发起请求,请求写入数据
第二步:客户端连接zk,获取一张特殊表hbase:meta表位置
第三步:客户端连接meta所在的regionServer,读取meta表的数据信息
第四步:客户端与对应的regionServer通信,准备写入数据
第五步:数据先写入到HLog,然后再写入到memoryStore里面去,以上两步操作成功,就认为数据已经写入成功

 

A Store is the same thing as a ColumnFamily
一个store模块对应一个列族
compcat:主要是将数据从storeFile到HFile的过程
split的过程:当HFile达到10GB的时候,就会进行分裂


flush:从memoryStore到StoreFile
compact:从StoreFile到HFile ==》 丢掉删除掉的数据,合并数据的历史版本
split:当HFile达到10Gb的时候,region就会进行切分

 

课程总结:
1、hbase的基本介绍:hbase是大数据领域一个nosql的非关系型数据库,主要是用于快速的存取数据的
hbase基于hdfs上面的
hbase里面所有的存储的数据数据类型:byte[]

2、hbase与hadoop关系:紧耦合关系

3、HBase的特征:稀疏表:HBase当中的列可以达到上百万个,如果列没有值,不占用磁盘空间

4、HBase的基本架构: 知道
HMaster:主节点,主要负责集群的管理,分配region给RegionServer,还包括从节点的上线和下线
HRegionServer:从节点,主要负责客户端的数据存储与读取,管理region
一个HRegionServer: 1个HLog + 多个Region
一个Region:多个store模块 一个store模块对应一个列族
1个store模块:1个memoryStore+ 多个StoreFile

6、HBase的集群环境搭建 搞定


7、HBase的shell操作以及高级shell管理命令 知道

8、hbase的JavaAPI开发 :hbase的增删改查,以及过滤器查询
9、HBase的底层原理:
列族

列值
versionnum
timestamp

HBase的读写过程:知道

HBase三个机制: 知道
flush:从memoryStore到StoreFile
compact:从StoreFile到HFile
split的过程:当HFile达到10GB的时候,就会进行分裂

 

 

1、hbase基本介绍:
hbase是一个大数据领域nosql非关系型数据库,稀疏表
2、hbase与hadoop的关系:紧耦合的关系,hbase基于hdfs的数据存储
3、RDBMS与HBase对比 了解一下
rdbms:支持事务,支持多行数据操作事务性的问题
hbase:支持事务,只不过支持单行数据操作的事务性问题
4、HBase的简要特征:
海量数据存储
列式存储
易于扩展
支持高并发请求读写
稀疏表:hbase当中存储的数据可以很容易的到达上亿行,上百万列 。如果有些字段为空值,不会占用磁盘空间

5、hbase的基本架构:
HMaster:主节点。负责集群管理,以及region分配
HRegionServer:从节点。管理region
一个HRegionServer = 1个 HLog + 多个region
1个region = 多个store模块=一个store模块对应一个列族
1个store模块 = 1个memoryStore:内存空间128M + 多个storeFile
多个storeFile最后会进行合并,合并成为一个大的HFile存放到HDFS上面去

6、hbase的集群环境搭建

7、hbase的shell操作以及高级shell管理命令
8、hbase的Java代码开发 主要就是对hbase的增删改查
9、hbase的底层实现原理:
系统架构:主从结构 主备架构
hbase的表模型:
rowkey:行键,类似于mysql主键
列族ColumnFamily:列族
column:列
cell:存放数据值
versionNum:版本号
timestamp:时间戳
创建hbase表的时候,最少需要两个条件:表名 + 列族名
column,cell值,rowkey,versionNum,timestamp ==》都是在插入数据的时候动态指定的

hbase数据的物理存储结构:
HLog:预写日志
memoryStore:内存空间128M
StoreFile:memoryStore溢写之后的数据文件
HFile:hdfs的存储文件
hbase的读写请求过程:
写请求:
第一步:客户端发起请求写入数据
第二步:客户端连接zookeeper寻找一张特殊表hbase:meta表
第三步:确定了hbase:meta表位置之后,与对应的HRegionServer服务器进行通信,读取hbase:meta表的元数据信息
第四步:与对应的region所在的regionServer进行通信,将数据写入到对应的region里面去
第五步:首先将数据写入到HLog里面去,然后将数据写入到memoryStore里面去
第六步:以上两步写入成功,就直接给客户端返回写入成功状态


读请求:BloomFilter
第一步:客户端发起读数据请求
第二步:客户端连接zookeeper寻找一张特殊表hbase:meta
第三步:确定了hbase:meta表位置之后,与对应的HRegionServer服务器进行通信,读取hbase:meta表的元数据信息
第四步:get scan 如果是get操作,根据rowkey的值,直接与对应的region进行通信,获取数据
,如果使用的scan操作,需要所有的region都进行数据扫描,然后返回符合条件的数据
第五步:将获取的数据返回给客户端即可

region管理:主要是依靠HMaster的管理
regionServer的上线和下线都是依靠zookeeper
master的工作机制:依靠zookeeper进行选举

HBase的三个机制:
flush:数据从memoryStore到storeFile
compat:数据从storeFile到HFile
split:切分HFile的过程

 

hbase与mr的集成
需求:通过mr的程序,读取hbase一张表的数据,然后写入到另外一张表里面去
这里我们将myuser这张表当中f1列族的name和age字段写入
到myuser2这张表的f1列族当中去

如果需要从HBase当中读取数据,那么我们的mapper类需要继承 TableMapper
如果需要将数据写入到hbase里面去,那么我们的reduce需要继承 TableReducer

 


将hdfs的数据写入到hbase里面去
0007 zhangsan 18
0008 lisi 25
0009 wangwu 20


线上的HBase的数据库,现在有大量的数据需要快速的插入到hbase表里面去

将数据放到hdfs上面去,然后使用mr的程序读取hdfs的数据,写入到hbase里面去


可以通过bulk load的方式批量的加载数据到hbase里面来
其实底层原理很简单:就是将数据文件的格式转换成为HFile这种格式,直接被HBase识别

 


/export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-client-1.2.0-cdh5.14.0.jar
:/export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-server-1.2.0-cdh5.14.0.jar
:/export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-prefix-tree-1.2.0-cdh5.14.0.jar
:/export/servers/hbase-1.2.0-cdh5.14.0/lib/htrace-core-3.2.0-incubating.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-common-1.2.0-cdh5.14.0.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/zookeeper-3.4.5-cdh5.14.0.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/guava-12.0.1.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-hadoop-compat-1.2.0-cdh5.14.0.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/netty-all-4.0.23.Final.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-protocol-1.2.0-cdh5.14.0.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/protobuf-java-2.5.0.jar:/export/servers/hbase-1.2.0-cdh5.14.0/lib/metrics-core-2.2.0.jar

 

 

hbase与hive对比:
hive依赖于hadoop :数存储在hdfs上面,数据的计算使用MR,hive是一个数据仓库的工具,主要用于数据分析工作
hbase依赖于hadoop:数据存储在hdfs上面,hbase也可以与mr集成,hbase是一个nosql数据库

数据仓库:主要是用于数据分析
数据库:主要是用于支持业务系统的增删改查

hbase不支持sql语句的查询

 

hive与hbase的整合:
第一个方向:数据在hive当中,将hive分析的结果,保存到hbase表里面去
第二个方向:数据在hbase当中,在hive当中建表,映射hbase的表数


创建hive表并加载数据:
create external table if not exists course.score(id int,cname string,score int)
row format delimited fields terminated by '\t' stored as textfile ;

查询score表里面所有的数据,结果保存到hbase表里面去

insert overwrite table xxxx select from xxx

在hive当中创建的一个表course.hbase_score
stored by:指定表的存储格式 textfile orc parquet
with serdeproperties类似于 row format delimited fields terminated by '\t'
tblproperties("hbase.table.name" = "hbase_score")指定hbase的表名称

 

create table course.hbase_score(id int,cname string,score int)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = "cf:name,cf:score")
tblproperties("hbase.table.name" = "hbase_score");

insert overwrite table course.hbase_score select id,cname,score from course.score;

需求二:数据已经存在了hbase当中,需要对hbase当中的数据进行分析,可以写mr的程序
可以创建hive表,映射hbase表数据,使用hql语句的方式来分析hbase当中的数据,就不用写MR的程序了

hive当中创建表,映射hbase表数据,数据实际上在hbase里面了
CREATE external TABLE course.hbase2hive(id int, name string, score int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name,cf:score")
TBLPROPERTIES("hbase.table.name" ="hbase_hive_score");

sqoop导入数据

bin/sqoop import \
--connect jdbc:mysql://192.168.29.22:3306/library \
--username root \
--password 123456 \
--table book \
--columns "id,name,price" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_book" \
--num-mappers 1 \
--split-by id


将hbase表数据导出到mysql里面去

sqoop不支持直接导出hbase的表到mysql里面去
将hbase表搞到hive里面去
hbase存储数据 ==》 hive表table2 映射hbase表数据 ==》 insert overwrite table table3 select from table2 ==> 使用sqoop导出table3 表数据

 

 


CREATE EXTERNAL TABLE course.hbase2mysql (id int,name string,price int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" =":key,info:name, info:price"
)
TBLPROPERTIES( "hbase.table.name" = "hbase_book",
"hbase.mapred.output.outputtable" = "hbase2mysql");

 

 

bin/sqoop export -connect jdbc:mysql://192.168.29.22:3306/library -username root -password 123456 -table book -export-dir /user/hive/warehouse/course.db/hbase2mysqlin --input-fields-terminated-by '\001' --input-null-string '\\N' --input-null-non-string '\\N';

 

hbase的预分区:
如果创建hbase表,没有指定有多少个region,默认一个region,所有的数都会写入到这一个region里面来,
等到region里面的数据写入到10Gb的时候,region就会进行分裂
region变成两个:


1、手动指定预分区
create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']

2、使用16进制算法生成预分区
create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}


3、将分区规则保存在文件里面
create 'staff3','partition2',SPLITS_FILE => '/export/servers/splits.txt'

4、使用JavaAPI创建预分区

 


HBase的rowkey设计至关重要,
第一个原因:hbase的数据查询比较脆弱,不支持sql语句的查询 scan + 过滤器
第二个原因:rowkey对数据的负载均衡比较重要
第三个原因:rowkey是我们数据检索重要条件

设计原则:
长度原则:rowkey设计不要太长,不能超过64KB,一般每个rowkey都是10-100个字节左右的长度
散列原则:尽量将rowkey的数据进行均衡的散列
order表数据需要存储
lsdjflsf_orderId_timestamp
唯一原则:数据的rowkey不能重复,rowkey重复,会产生数据相互覆盖问题。将进场访问的数据存储到一块,将相同类型的数据存储到一块
,加快数据检索的速度

rowkey的热点问题:大量的数据都在同一个region里面,其他的region里面没有什么数据
后果:数据倾斜

加盐:给rowkey的高位添加随机散列值
哈希:取hashcode码值
反转:对rowkey进行反转

 

使用手机号进行查询:158 137 159
13391508745 反转 54780519331 可以避免数据热点问题
时间戳的反转:使用时间戳来进行反转


一个月50亿,一年12个月 600亿条数据

改成了HBase:

13391506445 2019-02-22 12:04:59 5MB754KB 无线上网(4G) 115.170.79 0.18 非定向; 套外资费-飞young19云卡(线下)

进行查询:
rowkey的设计:
查询条件:手机号,查询类型,起始时间, 结束时间

手机号反转_查询业务类型_数据发生时间

scan :使用复合键来设计hbase的rowkey
54460519331_网络流量(类型)_2019:02:01 起始rowkey
54460519331_网络流量(类型)_2019:02:28 结束rowkey

hbase的协处理器:主要有两大类:observer endpoint
协处理器作用:可以帮助我们做一些数据的操作,以及数值统计的统计


一级索引:就是按照rowkey进行检索 查询限制非常大
不支持
select * from user where name ='zhangsan' and age >28 and sex = 'male'

二级索引:将需要查询字段的保存到易于查询的数据库里面去,例如mysql,oracle,solr,es


observer:主要是类似于关系型数据库当中的触发器,出现某些特定时间的时候,就会触发调用
endpoint:主要是用于hbase当中求平均值,最大值,最小值等等


动态的挂载协处理器:
alter 'proc1',METHOD => 'table_att','Coprocessor'=>'hdfs://node01:8020/processor/process.jar|cn.itcast.hbasemr.demo4.MyProcessor|1001|'

 

 

二级索引:主要是为了解决hbase的数据查询比较脆弱的问题

说白了:就是以空间换时间的思想

hbase的调优:了解