HBase是基于HDFS之上的,也可以采用存储本地模式,HBase是分布式数据库,将数据分为多份,同时是面向列的数据库,是bigtable的实现。
HBase会将随机读写转化为顺序读写,适合高并发的写入,没有数据的列是不占空间,同时在HDFS具有很好的容错性,某台服务器丢失,不会影响集体。
一个表可以存10亿行,数据的单一性,数据全为string类型。查询效率高。
查询的三种方式,可以指定rowkey查询,指定rowkey范围,scan全表扫描
一个列簇可以包含多个列,一个列只能属于一个列簇,没数据类型,用二进制存储
。。。。
‘列名称’, ‘值’
scan ‘.META.', {COLUMNS => ‘info:regioninfo'}
scan ‘t1′, {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW=> ‘xyz'}
搜索一个表中创建时间在1303668804,1303668904之间的数据
scan ‘t1′, {COLUMNS => ‘c1′, TIMERANGE => [1303668804,1303668904]}
hbase> scan ‘t1′, {FILTER =>org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}
scan 'test1', FILTER=>"ValueFilter(=,'binary:188')"
scan 'test1', FILTER=>"ValueFilter(=,'substring:88')"
scan 'test1', FILTER=>"ColumnPrefixFilter('c2') ANDValueFilter(=,'substring:88')"
scan 'test1', FILTER => "PrefixFilter ('user1')"
从user1|ts2开始,找到所有的rowkey以user1开头的
scan 'test1', {STARTROW=>'user1|ts2', FILTER => "PrefixFilter('user1')"}
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.filter.RowFilter
3.读取配值文件使用,HBaseConfiguration.create()
5.createTab()创建表,同时表Bytes.toBytes('')转化
columnPrefixFilter前缀过滤器,Pagefilter分页过滤器,ByteArrayCompare
Region文件存数据在内存,当达到一定容量会创建store文件,会存在磁盘中
HRegion Server管理一列RegionServer,HBase的存储单元是列族
2.使用HBase-server-cdh.jar中方法导入数据
Hive是存储在HDFS中,将SQL语句转化为MapReduce中的,通过Hive将表添加到HBase,Hive进行复杂的数据分析,同过HBase进行快速实时查询
Storage Headlers,Hbase所有jar包,拷贝到hive中即可
Hive表中的域都存储在HBase中,但是Hive表不需要包含Hbase中所有的列
直接拷贝hbase中的所有jar包到hive中,直接重启hive
创建hive表映射Hbase,指定存储headler和映射关系,hbase中表名称
内存越大越好,不要低于32G,64位机器,swap减少或设置为0,scancaching调大,将超时时间调长,将线程数调大
找到restapi的使用指南后,执行以下命令启动RESTServer:
bin/hbase rest start -p4444 #端口自己指定即可
TResult对单行(Row)及其查询结果(若干colunmvalue)的封装
TScan对查询多行和多列的封装,有点类似于“cursor”
TRowMutations实际上是若干个TDelete和TPut的集合,完成对一行内数据的“原子”操作
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
transport = TSocket.TSocket('localhost', 9090);
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport);
client = Hbase.Client(protocol)
contents = ColumnDescriptor(name='cf:', maxVersions=1)
client.createTable('test', [contents])
jdbc:mysql://192.168.1.9:3306/spider
--username –password mysql数据库的用户名密码
--hbase-create-table如果hbase中该表不存在则创建
--hbase-row-key hbase表中的rowkey,注意格式
--where导入是mysql表的where条件,写法和sql中一样
--split-by CREATE_TIME默认情况下sqoop使用4个并发执行任务,需要制订split的列,如果不想使用并发,可以用参数--m 1
-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
hmaseter提供的默认端口16010 RegionServer16030
HBase冷备所有设备停掉,HBase热备不需要停掉设备,可以实现增量备份
export可以将指定的表导出到hdfs中也可以到本地,一个region导出一个文件,导出的过程可以使用压缩,再倒回表需要先创建表。
copytable进行复制,实际调用mapreduce进行扫描拷贝
跨集群实现复制,通过WAL实现,可以选某些表,或者选择一些列族
Phoenix是一个关系数据库层,相当于Java的中间件,Phoenix在高并发和低延时上不行
Phoenix支持全局索引,本地索引,函数索引,三种索引方式,
jion连接,支持多租户,分页查询,动态列,跳跃扫描,散步表
./sqlline.py localhost打开phoenix的客户端
相比之下HBase快照允许管理员不拷贝数据,而直接克隆一张表,这对域服务器产生的影响最小。
使用ExportSnapshot工具将现有快照导出至其他集群。导出工具不会影响到域服务器负载,只是工作在HDFS层面,所以需要指定HDFS路径(其他集群的hbase根目录)。