HBase使用场景:
什么时候使用HBase:
①数据总量:如果只有数百万行和一些读写操作,是不需要HBase的。而如果有数十亿列,同时在很短时间内有数以千计的读写操作,这时就应该考虑HBase
② 如果数据模式是动态的或者可变的
③ 如果很多列包含很多null值
④ 当有大量的动态行
⑤ 如果数据包含不定数量的列
⑥ 如果需要维护数据的版本
⑦ 如果需要高扩展性
⑧ 如果需要在记录中做内置的压缩
⑨ 如果需要大量的I/O什么时候不使用HBase:
① 当数据规模总量不大时
② 当需要JOIN和其他一些关系型数据库特性时
③ 如果关系数据能满足需求模式设计
① 避免生成连续序列或时间戳的行键,这在大量写入的时候可能会到导致读取线程挂起
② 总是让列族名和行键更小
③ 使用复合行健设计,以指定扫描的开始行键:Scan s = new Scan(startID) Table.getscanner(s)
HBase管理
压缩:hbase>major_compact #将每个store合成一个StoreFile
添加节点:bin/hbase-daemon.sh start regionserver
删除节点:
① 停止负载平衡器:hbase>balance_switch false
② 在退役的节点上停止RegionServer:hbase>hbase-daemon.sh stop regionserver
③ 当RegionServer停止了,它将关闭所有的region
④ Zookeeper上的RegionServer临时节点将消失
⑤ master节点将注意到RegionServer已经关闭并认为它已经崩溃
⑥ RegionServer的region服务重新分配完成另一种优雅的删除节点方式:
① bin/graceful_stop.sh
② 这种方式里会始终启动平衡器
③ 在退役的节点上停止RegionServer:hbase>hbase-daemon.sh stop regionserverHBase备份
离线备份:
hadoop discp hdfs://namenode:9000/hbase hdfs://datanode1:9000/hbaseBackup
将数据从hdfs://namenode:9000/hbase复制到hdfs://datanode1:9000/hbaseBackup
在线备份:
① 快照:
开启快照功能:<name>hbase.snapshot.enabled</name> <value>true</value>
重启集群
hbase>snapshot ‘emptable’,’baksnapshot01082014’ #表名、快照名
查看快照列表
hbase>list_snapshot
删除快照
hbase>delete_snapshot ‘baksnapshot01082014’
使用快照克隆一个表
hbase>clone_snapshot ‘baksnapshot01082014’,’emptable’
恢复一个表到快照状态
hbase>disable ‘table’ hbase>restore_snapshot ‘baksnapshot01082014’
② 复制:
修改配置:<name>hbase.replication</name> <value>true</value>
重启集群
在主集群执行以下命令,添加对等集群:add_peer ‘ID’’CLUSTER_KEY’ ID指定一个短整型,CLUSTER_KEY设置为从集群
开启列族的复制
disable ‘table’ alter ‘table’,{NAME=>’colFam’,REPLICATION_SCOPE=>’1’} enable ‘table’ 设置为1表示开启复制,0表示关闭
执行
hbase>list_peers
查看任意RegionServer的日志来验证是否复制成功
停止复制的命令stop_replication
③ 使用Export和Import进行备份和恢复:
hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> [<versions> [starttime] [endtime]] hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
ImportTsv可以将Tab分割的数据(Tsv)导入到HBase表:
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <hdfs-inputdir>
④ CopyTable
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=Copynewtable
new.name指定目标的新表名
过滤器
过滤器可以配合get或scan使用,通过RPC传到RegionServer端,RegionServer获取的数据通过过滤器进行过滤,然后返回给客户端
Scan scan = new Scan(); scan.setFileter(new ValueFilter(CompareOp.EQUAL,new SubstringComparator(“shash”)));