- 快照就是某一时刻的结构和数据,可以使用快照来将某个表回复到某个时刻的结构和数据,而且不需要担心创建和恢复的过程会很慢,这个过程只需要数秒就可以完成
-
是怎么做到这么快恢复的?,快照只是保存了一份文件列表,通过修改表示所连接的文件来改变表的数据,这样做会相当快并且不消耗额外的磁盘空间
-
使用:首先要确认是否开启了快照功能,检查hbase-site.xml和hbase-default.xml文件
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
-
下面将是列出数据库中的快照列表的操作
List<SnapshotDescription> snapshotDescriptions = admin.listSnapshots();
- 也可以使用
listSnapshots(Pattern pattern)
来匹配快照
-
目前hbase中是没有快照的,现在我们新建一个表,并插入数据
hbase(main):007:0> put 'test','row1','cf:name','wzq'
-
然后我们创建此表的快照
admin.snapshot("mytest_snapshot",TableName.valueOf("test"));
-
这时候再次查看将出现一个新建快照,快照的作用是恢复数据,现在我们来重新插入一条cf:name以覆盖原来的值
hbase(main):012:0> put 'test','row1','cf:name','wangziqiang'
-
好了我们现在用快照恢复一下,在使用快照恢复的时候需要先将表禁用掉,然后才能进行快照恢复,否则会就爆 TableNotDisabledException
admin.disableTable(tableName);
admin.restoreSnapshot("mytest_snapshot");
admin.enableTable(tableName);
- 当执行完毕,数据就已经恢复原样了,快照的操作还有删除快照等方法,用到的时候直接查询就行了
-
可见性标签(Visibility Labels)是一串逻辑表达式字符串,用 于标定数据的访问可见,即对数据的简单权限限制
- developer:只有拥有developer标签的用户可见该数据
- !developer:拥有developer标签的用户看不见该数据
- (manager|developer)&!market:拥有manager标签或者 developer标签,并且同时要没有market标签的用户,才看得见 该数据
-
确认HFile在版本3之上才可以,并且这个功能默认是关闭的,所以需要打开此功能,编辑hbase-site.xml
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.visibility.VisibilityController</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.visibility.VisibilityController</value>
</property>
-
首先我们看一下系统内是否有自带的标签
VisibilityLabelsProtos.ListLabelsResponse response = VisibilityClient.listLabels(connection,".*");
response.getLabelList().forEach(System.out::println);
-
什么都没输出,说明是没有自带的标签的,所以这些标签都需要我们去添加,既然是涉及到了hbase中的信息修改,就必须有权限才可以进行修改labels表,如果不信可以尝试进行添加labels
VisibilityClient.addLabel(connection,"myLabel");
-
上面执行完毕并不会报错,上面代码会返回一个VisibilityLabelsProtos.VisibilityLabelsResponse对象,输出他你将得到一段错误信息
result {
exception {
name: "org.apache.hadoop.hbase.security.AccessDeniedException"
value: "org.apache.hadoop.hbase.security.AccessDeniedException: User \'qidai\' is not authorized to perform this action.\n\tat org.apache.hadoop.hbase.security.visibility.VisibilityController.checkCallingUserAuth(VisibilityControll...
}
}
-
所以就必须要有权限才可以,使用权限你当然要有身份,当你调用api时你会产生一个身份,在hbase shell的时候,可以通过whoami来看自己是谁
hbase(main):006:0> whoami
root (auth:SIMPLE)
groups: root
Took 0.0191 seconds
-
而当java调用的使用,是取的系统的用户名
System.getProperty("user.name");
-
当操作标签库等ACL一系列的安全相关的内容时,需要超级用户才可以,所以现在需要将自己的用户名添加到超级用户组,编辑hbase-site.xml
<property>
<name>hbase.superuser</name>
<value>qidai</value>
</property>
-
设置完毕后重启hbase,然后再执行添加
result {
}
-
上面是原来返回错误的那个对象输出的结果,看到里面已经没有出错了,所以现在来看一下labels是否添加进去了,在hbase shell 中这样查看
hbase(main):002:0> list_labels
myLabel
Took 1.8542
seconds
=> #<Java::JavaUtil::Collections::UnmodifiableRandomAccessList:0x5855b0ed>
- 到这就说明添加成功了
-
好了到这我们规划三个角色,tom,wzq,sam
- tom有developer标签
- wzq有manager标签
- sam没有标签
-
最后我们添加带有标签的单元格,然后分别用三个用户查看数据观察效果
[root@hd1 ~]# useradd tom
[root@hd1 ~]# useradd wzq
[root@hd1 ~]# useradd sam
- 如果你搭建环境的时候使用的是root的话,那么你新建的用户是不能使用hbase的因为有linux权限,简单方式是可以chmod 一下,然后就可以了,就去之后执行whoami,发现我就是tom,角色没问题后,往下继续
-
为用户添加标签,首先要有这个label所以先添加developer和manager标签
VisibilityClient.addLabel(connection,"developer");
VisibilityClient.addLabel(connection,"manager");
-
为用户添加developer和manager标签
VisibilityClient.setAuths(connection,new String[]{"developer"},"tom");
VisibilityClient.setAuths(connection,new String[]{"manager"},"wzq");
-
执行完之后我们可以查看一下用户的标签
for (ByteString bytes : tom) {
System.out.println("tom=>"+bytes.toStringUtf8());
}
System.out.println("*********************");
List<ByteString> wzq = VisibilityClient.getAuths(connection, "wzq").getAuthList();
for (ByteString bytes : wzq) {
System.out.println("wzq=>"+bytes.toStringUtf8());
}
-
执行结果为
tom=>developer
*********************
wzq=>manager
-
到这已经添加成功了,然后我们用不同身份添加cell,目前test表中有列族cf,数据为空
Put tom = new Put(Bytes.toBytes("row1"));
CellVisibility tomCellExpression = new CellVisibility("developer");
tom.setCellVisibility(tomCellExpression);
tom.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("name"),Bytes.toBytes("tom"));
Put wzq = new Put(Bytes.toBytes("row2"));
CellVisibility wzqCellExpression = new CellVisibility("manager");
wzq.setCellVisibility(wzqCellExpression);
wzq.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("name"),Bytes.toBytes("wzq"));
Put sam = new Put(Bytes.toBytes("row3"));
sam.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("name"),Bytes.toBytes("sam"));
- 现在表中数据为