① hbase怎么用
HBase安装及简单使用
通过之前的hadoop0.20.2的安装并调试成功,接下来我们继续安装hbase0.90.5。在安装hbase0.90.5之前,因为hbase0.90.5只支持jdk1.6,所以,我把之前的jdk1.8卸载,重新安装了jdk1.6。
第一步:
首先需要下载hbase0.90.5.tar.gz,并解压到/home/hadoop/的目录下,同时将目录修改为hbase0.90.5
第二步:
替换hadoop核心jar包,主要母的是防止hbase和hadoop版本不同出现兼容问题,造成hmaster启动异常
将hbase0.90.5/lib目录中的hadoop-core-0.20-append-r1056497.jar包进行备份后删除,再将/home/hadoop/hadoop下面的hadoop-0.20.2-core.jar赋值到/home/hadoop/hbase0.90.5目录下即可
第三步:
编辑配置文件
①/home/hadoop/hbase0.90.5/conf/hbase-env.sh
我们对行键'1001'中列族info的列名age赋值24(1001:info:age=>24),插入两次,会将最后一次的值进行合并,其中,用时间戳来区分。从图片中的时间戳不同可以看出保存的是最后一次put的内容。
② HBase存储架构
上图是HBase的存储架构图。
由上图可以知道,客户端是通过Zookeeper找到HMaster,然后再与具体的Hregionserver进行沟通读写数据的。
具体到物理实现,细节包括以下这些:
首先要清楚HBase在hdfs中的存储路径,以及各个目录的作用。在hbase-site.xml 文件中,配置项 <name> hbase.rootdir</name> 默认 “/hbase”,就是hbase在hdfs中的存储根路径。以下是hbase0.96版本的个路径作用。1.0以后的版本请参考这里: https://blog.bcmeng.com/post/hbase-hdfs.html
1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之后,会将 HFile 移到.archive 目录中,然后将之前的 hfile 删除掉,该目录由 HMaster 上的一个定时任务定期去清理。
2、 /hbase/.corrupt
存储HBase损坏的日志文件,一般都是为空的。
3、 /hbase/.hbck
HBase 运维过程中偶尔会遇到元数据不一致的情况,这时候会用到提供的 hbck 工具去修复,修复过程中会使用该目录作为临时过度缓冲。
4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 会在第一次启动之初会给每一台 RegionServer 在.log 下创建一个目录,若客户端如果开启WAL 模式,会先将数据写入一份到.log 下,当 RegionServer crash 或者目录达到一定大小,会开启 replay 模式,类似 MySQL 的 binlog。
5、 /hbase/oldlogs
当.logs 文件夹中的 HLog 没用之后会 move 到.oldlogs 中,HMaster 会定期去清理。
6、 /hbase/.snapshot
hbase若开启了 snapshot 功能之后,对某一个用户表建立一个 snapshot 之后,snapshot 都存储在该目录下,如对表test 做了一个 名为sp_test 的snapshot,就会在/hbase/.snapshot/目录下创建一个sp_test 文件夹,snapshot 之后的所有写入都是记录在这个 snapshot 之上。
7、 /hbase/.tmp
当对表做创建或者删除操作的时候,会将表move 到该 tmp 目录下,然后再去做处理操作。
8、 /hbase/hbase.id
它是一个文件,存储集群唯一的 cluster id 号,是一个 uuid。
9、 /hbase/hbase.version
同样也是一个文件,存储集群的版本号,貌似是加密的,看不到,只能通过web-ui 才能正确显示出来
10、 -ROOT-
该表是一张的HBase表,只是它存储的是.META.表的信息。通过HFile文件的解析脚本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存储的内容,如下所示:
以上可以看出,-ROOT-表记录的.META.表的所在机器是dchbase2,与web界面看到的一致:
11、 .META.
通过以上表能找到.META.表的信息,该表也是一张hbase表,通过以上命令,解析其中一个region:
以上可以看出,adt_app_channel表的数据记录在dchbase3这台reginserver上,也与界面一致,如果有多个region,则会在表名后面加上rowkey的范围:
通过以上描述,只要找到-ROOT-表的信息,就能根据rowkey找到对应的数据,那-ROOT-在哪里找呢?从本文一开始的图中可以知道,就是在zookeeper中找的。进入zookeeper命令行界面:
可以看出-ROOT-表存储在 dchbase3 机器中,对应界面如下:
以上就是HBase客户端根据指定的rowkey从zookeeper开始找到对应的数据的过程。
那在Region下HBase是如何存储数据的呢?
以下就具体操作一张表,查询对应的HFile文件,看HBase的数据存储过程。
在HBase创建一张表 test7,并插入一些数据,如下命令:
查看wal日志,通过 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,内容如下:
查看HFile文件,内容如下:
由此可见,HFile文件就是存储HBase的KV对,其中Key的各个字段包含了的信息如下:
由于hbase把cf和column都存储在HFile中,所以在设计的时候,这两个字段应该尽量短,以减少存储空间。
但删除一条记录的时候,HBase会怎么操作呢?执行以下命令:
删除了rowkey为200的记录,查看hdfs,原来的HFile并没有改变,而是生成了一个新的HFile,内容如下:
所以在HBase中,删除一条记录并不是修改HFile里面的内容,而是写新的文件,待HBase做合并的时候,把这些文件合并成一个HFile,用时间比较新的文件覆盖旧的文件。HBase这样做的根本原因是,HDFS不支持修改文件。
③ HBase中显示表的指令是
进入hbase shell命令界面:hbase shell
2. 查看表格:list
3. 查看所有命令:help
4. 创建表格(如果不记得命令格式 可以直接输入create 系统会给出提示和示例):create 'test','f1','f2','f3'
创建了一个表名为test 有f1 f2 f3三个列族的表
5. 查看表格结构信息:desc 'test'
④ hbase 数据迁移
hbase snapshot数据迁移问题
不需要提前建表,分区也会自动同步
HBase自身也提供了ExportSnapshot的方法可以从HDFS文件层基于某个快照快速的导出HBase的数据,并不会对RegionServer造成影响,但该源生的方法不支持增量
1、在源集群执行
snapshot 'src_table', 'snapshot_src_table'
snapshot的流程主要有三个步骤
加锁: 加锁对象是regionserver的memstore,目的是禁止在创建snapshot过程中对数据进行insert,update,delete操作
刷盘:刷盘是针对当前还在memstore中的数据刷到HDFS上,保证快照数据相对完整,此步也不是强制的,如果不刷会,快照中数据有不一致风险
创建指针: snapshot过程不拷贝数据,但会创建对HDFS文件的指针,snapshot中存储的就是这些指针元数据
2、在源集群执行,属于推送方式,在目标集群执行数据拉取方式
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test_snap --from hdfs://HDFS80386/hbase --to hdfs://shyt-hadoop-4031.xx.com.cn:8020/apps/hbase/data -mappers 20 -bandwidth 5
3、在目标集群执行使用hbase用户
disable 'dalishen:bbs_member'
restore_snapshot 'bbs_member_snap'
使用restore命令在目标集群自动新建表,以及与archive里的HFile建立link
执行该步骤的时候,可能会遇到权限问题,需要赋权限
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=hbase, access=WRITE, inode="/apps/hbase/data/archive/data/dalishen/bbs_member//f/.links-":hadoop:hdfs:drwxr-xr-x
源集群
groups hadoop hdfs 可以发现导入的是源集群的权限
所以需要赋权限
hdfs dfs -chmod -R 777 /apps/hbase/data/archive/data/dalishen/bbs_member/
enable 'dalishen:bbs_member'
不需要提前建表,分区也会自动同步,支持增量备份,需要指定要备份的时间范围
Table也是属于HBase数据迁移的工具之一,以表级别进行数据迁移。Table的本质也是利用MapRece进行同步的,与DistCp不同的时,它是利用MR去scan 原表的数据,然后把scan出来的数据写入到目标集群的表。这种方式也有很多局限,如一个表数据量达到T级,同时又在读写的情况下,全量scan表无疑会对集群性能造成影响。
1.3->1.1 高到低版本 不需要提前建表,分区也会自动同步
检查是否开启同步
echo "list_replicated_tables" | hbase shell -n |grep dalishen:app_deviceid
没有的话执行
enable_table_replication 'tname'
1.源集群hadoop查询数据量,如太大先别迁移超过5000w
hbase org.apache.hadoop.hbase.maprece.RowCounter 'dalishen:app_deviceid'
2.源集群上执行 替换表名
hbase org.apache.hadoop.hbase.maprece.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D maprece.task.timeout=6000000 --families=f:f --peer.adr=10.52.24.42:2181:/hbase-unsecure --new.name=dalishen:app_deviceid dalishen:app_deviceid
3.目标集群上执行数据量对比下
hbase org.apache.hadoop.hbase.maprece.RowCounter 'dalishen:app_deviceid'
4.指定时间戳进行增量同步
hbase org.apache.hadoop.hbase.maprece.CopyTable -Dhbase.client.scanner.caching=1000 -Dmapred.map.tasks.speculative.execution=false -D maprece.task.timeout=6000000 --starttime=1600792683760 --endtime=1600792684760 --families=f:f --peer.adr=172.18.12.7:2181:/hbase --new.name=testwang testwang
在源集群进入hbase shell
1、 add_peer '1', 'shyt-hadoop-4032.xxx.com.cn,shyt-hadoop-4031.xxx.com.cn,shyt-hadoop-4030.xxx.com.cn:2181:/hbase-unsecure'
2、修改REPLICATION_SCOPE属性=1,全局模式,此数据会被复制给所有peer
alter 'testwang',{NAME => 'f' ,REPLICATION_SCOPE => '1'}
3、hbase(main):006:0> enable_table_replication 'testwang'
0 row(s) in 0.0860 seconds
The replication swith of table 'testwang' successfully enabled
验证在源集群 put 'testwang','1005','f:name','1005'
在目标集群 get 'testwang','1005'
校验数据量:通count
hbase org.apache.hadoop.hbase.maprece.RowCounter 'testwang'
查看同步状态: status 'replication'
建议大表先进行snapshot方式同步,然后再利用进行增量数据同步,小表直接 table数据迁移,最后配置hbase replication peer实时同步