HBase是基于HDFS之上的,也可以采用存储本地模式,HBase是分布式数据库,将数据分为多份,同时是面向列的数据库,是bigtable的实现。
HBase会将随机读写转化为顺序读写,适合高并发的写入,没有数据的列是不占空间,同时在HDFS具有很好的容错性,某台服务器丢失,不会影响集体。
一个表可以存10亿行,数据的单一性,数据全为string类型。查询效率高。
专业术语与数据模型
rowkey主键
查询的三种方式,可以指定rowkey查询,指定rowkey范围,scan全表扫描
column Family列族
一个列簇可以包含多个列,一个列只能属于一个列簇,没数据类型,用二进制存储
时间戳和存储单元
每一个存储单元中会存储多个版本的数据,类似于MAP
每一个列簇会在HDFS中创建一个文件
HBase shell
创建表
create '表名称',‘列族名称’
。。。。
添加数据
put '表名称',‘行名称’,
‘列名称’, ‘值’
查看数据
get '表名称',‘行名称’
统计总数
count '表名称'
删除
delete '表名称',‘行名称’,‘列名称’
删除表
disable drop
查看某列
scan '表名称',{colunm=>'列族:列名'}
scan表
组命令
status集群状态
whoami操作是谁
namespace用来创建隔离级别
list_namespace
create_namespace创建命名空间
scan的详细用法
搜索一个表的某一列
scan ‘.META.', {COLUMNS => ‘info:regioninfo'}
搜索一个表的c1和c2列,输出从xyz开始的10行数据
scan ‘t1′, {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW=> ‘xyz'}
搜索一个表中创建时间在1303668804,1303668904之间的数据
scan ‘t1′, {COLUMNS => ‘c1′, TIMERANGE => [1303668804,1303668904]}
hbase> scan ‘t1′, {FILTER => “(PrefixFilter (‘row2′)AND (QualifierFilter (>=, ‘binary:xyz'))) AND (TimestampsFilter( 123, 456))”}
hbase> scan ‘t1′, {FILTER =>org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}
搜索值为188的数据列
scan 'test1', FILTER=>"ValueFilter(=,'binary:188')"
搜索包含88的数据列
scan 'test1', FILTER=>"ValueFilter(=,'substring:88')"
搜索列族c2同时值包含88的用户
scan 'test1', FILTER=>"ColumnPrefixFilter('c2') ANDValueFilter(=,'substring:88')"
搜索列族为s同时包含123和222的用户
scan 'test1', FILTER=>"ColumnPrefixFilter('s') AND (ValueFilter(=,'substring:123') OR ValueFilter(=,'substring:222') )
搜索rowkey开头为user1的用户
scan 'test1', FILTER => "PrefixFilter ('user1')"
从user1|ts2开始,找到所有的rowkey以user1开头的
scan 'test1', {STARTROW=>'user1|ts2', FILTER => "PrefixFilter('user1')"}
查询rowkey里面包含ts3的
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.filter.RowFilter
scan 'test1', {FILTER =>RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),SubstringComparator.new('ts3'))}
使用正则查询
scan 'test1', {FILTER =>RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),RegexStringComparator.new('^userd |tsd $'))}
HBase Java
1.修改pom依赖
将仓库地址修改为mavenCDH
2.导入HBase依赖,以及Hadoop依赖
3.读取配值文件使用,HBaseConfiguration.create()
4.获得表的操作对象HBaseAdmin
5.createTab()创建表,同时表Bytes.toBytes('')转化
6.关闭资源
创建共用方法获取表
扫描器
Scan scan = new Scan();
scan.getScan,返回迭代器,打印结果
遍历结果集CellUtil
过滤器
创建过滤器
columnPrefixFilter前缀过滤器,Pagefilter分页过滤器,ByteArrayCompare
HBase数据存储
HRegion Server
Hlog文件日志文件
Region文件存数据在内存,当达到一定容量会创建store文件,会存在磁盘中
Client中delete是打入标签,不是真正的删除。
HRegion Server管理一列RegionServer,HBase的存储单元是列族
1.client写数据到MemStore,当数据量达到一定值后通过Flush,将数据保存到磁盘中StoreFile中,当StoreFile达到一定量值后,触发Compact操作,合并为一个文件,当数据达到一定量,触发split操作,分割为两个Region,两个region下线,由regionServer管理,同时删除一些存储空间(比如被delete标记的文件),会创建新的region
更新和添加都是在compact阶段。
HBase 自带MapReduce程序
1.导入Hadoop与Hbase的环境变量
2.使用HBase-server-cdh.jar中方法导入数据
Hive集成Hbase
Hive是存储在HDFS中,将SQL语句转化为MapReduce中的,通过Hive将表添加到HBase,Hive进行复杂的数据分析,同过HBase进行快速实时查询
hive整合Hbase
hive映射Hbase的表0.90,0.92上
Storage Headlers,Hbase所有jar包,拷贝到hive中即可
Hive表中的域都存储在HBase中,但是Hive表不需要包含Hbase中所有的列
方法:
直接拷贝hbase中的所有jar包到hive中,直接重启hive
创建hive表映射Hbase,指定存储headler和映射关系,hbase中表名称
HBase的集群调优
内存越大越好,不要低于32G,64位机器,swap减少或设置为0,scancaching调大,将超时时间调长,将线程数调大
HBase的Rest
找到restapi的使用指南后,执行以下命令启动RESTServer:
bin/hbase rest start -p4444 #端口自己指定即可
Rest是使用http浏览器操作数据库
HBase的Thrift
TColumn对列的封装
TColumnValue对列及其值的封装
TResult对单行(Row)及其查询结果(若干colunmvalue)的封装
TGet对查询一行(row)的封装,可以设置行内的查询条件
TPut与TGet一样,只是它是写入若干“列”
TDelete与TGet一样,只是它是删除若干“列”
TScan对查询多行和多列的封装,有点类似于“cursor”
TRowMutations实际上是若干个TDelete和TPut的集合,完成对一行内数据的“原子”操作
python使用thrift连接Hbase
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from hbase import Hbase
from hbase.ttypes import *
transport = TSocket.TSocket('localhost', 9090);
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport);
client = Hbase.Client(protocol)
transport.open()
contents = ColumnDescriptor(name='cf:', maxVersions=1)
client.createTable('test', [contents])
print client.getTableNames()
sqoop的使用
import
-D
sqoop.hbase.add.row.key=true
--connect
jdbc:mysql://192.168.1.9:3306/spider
--username
root
--password
root
--table
TEST_GOODS
--columns
ID,GOODS_NAME,GOODS_PRICE
--hbase-create-table
--hbase-table
tt_goods
--column-family
cf
--hbase-row-key
ID
--where
ID>=5
-m
注:参数含义解释
-D sqoop.hbase.add.row.key=true是否将rowkey相关字段写入列族中,默认为false,默认情况下你将在列族中看不到任何rowkey中的字段。注意,该参数必须放在import之后。
--connect数据库连接字符串
--username –password mysql数据库的用户名密码
--table Test_Goods表名,注意大写
--hbase-create-table如果hbase中该表不存在则创建
--hbase-table对应的hbase表名
--hbase-row-key hbase表中的rowkey,注意格式
--column-family hbase表的列族
--where导入是mysql表的where条件,写法和sql中一样
--split-by CREATE_TIME默认情况下sqoop使用4个并发执行任务,需要制订split的列,如果不想使用并发,可以用参数--m 1
importTsv的使用
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv'-Dimporttsv.separator=,' -Dimporttsv.columns='HBASE_ROW_KEY,city'-Dimporttsv.bulk.output=/user/yarn/output user_info /user/yarn
-Dimporttsv.skip.bad.lines=false –若遇到无效行则失败
-Dimporttsv.separator=| –文件中代替tabs的分隔符
-Dimporttsv.columns=HBASE_ROW_KEY,city输入行的格式
-Dimporttsv.timestamp=currentTimeAsLong –导入时使用指定的时间戳
-Dimporttsv.mapper.class=my.Mapper –使用用户指定的Mapper类来代替默认的
-Dimporttsv.bulk.output=/user/yarn/output作业的输出目录
hbaseorg.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles/user/yarn/outputuser_info
Hbase WEB
hmaseter提供的默认端口16010 RegionServer16030
可以使用hbase的compact和split
HBase冷备所有设备停掉,HBase热备不需要停掉设备,可以实现增量备份
export可以将指定的表导出到hdfs中也可以到本地,一个region导出一个文件,导出的过程可以使用压缩,再倒回表需要先创建表。
copytable进行复制,实际调用mapreduce进行扫描拷贝
HBase的集群复制
什么是集群复制?
跨集群实现复制,通过WAL实现,可以选某些表,或者选择一些列族
集群复制采用主集群推送的方式
Phoenix连接Hbase交互
Phoenix是一个关系数据库层,相当于Java的中间件,Phoenix在高并发和低延时上不行
Phoenix支持全局索引,本地索引,函数索引,三种索引方式,
同时支持CSV加载到表中,使用的是bulkload工具
提供查询服务器,trace轨迹追踪
支持序列的特性,提供统计信息的收集
jion连接,支持多租户,分页查询,动态列,跳跃扫描,散步表
insert使用upsert
使用phoenix
./sqlline.py localhost打开phoenix的客户端
!table查看所有表
psql.py导入csv
select * from table
HBase中的快照
快照就是一份元信息的合集。
相比之下HBase快照允许管理员不拷贝数据,而直接克隆一张表,这对域服务器产生的影响最小。
使用ExportSnapshot工具将现有快照导出至其他集群。导出工具不会影响到域服务器负载,只是工作在HDFS层面,所以需要指定HDFS路径(其他集群的hbase根目录)。