HBASE操作
JAVAAPI操作HBASE
添加maven依赖:
hbase连接依赖
-->
org.apache.hadoop
hadoop-common
2.7.4
org.apache.hadoop
hadoop-client
2.7.4
org.apache.hadoop
hadoop-hdfs
2.7.4
org.apache.logging.log4j
log4j-core
2.8.2
org.apache.hive
hive-jdbc
2.3.2
org.apache.hadoop
hadoop-auth
2.6.0
org.apache.hbase
hbase-client
2.0.0
org.apache.hbase
hbase-common
2.0.0
org.apache.hbase
hbase-protocol
2.0.0
通过相应的语法进行操作:
一、连接:
1、通过创建connection,创建configuration进行连接:
Configuration hBaseConfiguration = HBaseConfiguration.create();
hBaseConfiguration.setInt("hbase.client.retries.number", 1);
hBaseConfiguration.set("hbase.zookeeper.property.clientPort","2181");//连接端口
hBaseConfiguration.set("hbase.zookeeper.quorum","集群节点1:2181,集群节点2:2181,集群节点3:2181,集群节点4:2181,集群节点5:2181");
hBaseConfiguration.set("zookeeper.session.timeout", "5000");/ZK连接超时时间
hBaseConfiguration.set("hbase.zookeeper.property.maxclientcnxns", "300");
hBaseConfiguration.set("hbase.ipc.client.socket.timeout.connect", "10000");//HBASE连接超时时间
hBaseConfiguration.set("hbase.regionserver.handler.count", "500");
connection = ConnectionFactory.createConnection(hBaseConfiguration);
2、通过导入配置连接:
hBaseConfiguration.addResource(new Path(ClassLoader.getSystemResource("hbase-site.xml").toURI()));
hBaseConfiguration.addResource(new Path(ClassLoader.getSystemResource("core-site.xml").toURI()));
connection = ConnectionFactory.createConnection(hBaseConfiguration);
PS!!!依赖包的版本一定要配套
二、操作:
1、SCAN:通过上边连接获取到的连接(connection),我们可以获取到操作用户
Admin admin = connection.getAdmin();
通过admin我们可以获取到表属性和列簇属性
TableName[] tableNames = admin.listTableNames();//查看所有表名
HTableDescriptor[] hTableDescriptors = admin.listTables();//查看所有表属性
Scan scan = new Scan();//创建一个SCAN操作对象
Table table = connection.getTable(TableName.valueOf("表名"));//通过获取到的连接和表名获取到表操作对象
System.out.println(table.getName());
ResultScanner scanner = table.getScanner(scan);//执行scan操作
for (Result result : scanner){ //每一个result都是查询出来的一行数据结果
System.out.println(new String(result.getRow()));//获取到表中的所有行键[行键建后文 PS行键]
byte[] value = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("id"));//可以通过result获取到具体的数据
System.out.println(new String(value));//HBASE中的所有事物都是以二进制存放在文件内存区中的,所以取出时需要进行转换
}
2、GET操作:
Get get = new Get(Bytes.toBytes("表名"));//创建GET操作对象
get.addFamily(Bytes.toBytes("info"));//添加列簇筛选条件
Result result = table.get(get);//执行GET操作,获取到结果
Cell[] cells = result.rawCells();//获取属性操作,这个可以获取到result中的列簇,属性,行键等
byte[] row = result.getRow();//获取行键
System.out.println(new String(row));
byte[] value = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("id"));//获取到info列簇下对应id列的值
System.out.println(new String(value));
3、DELETE删除操作:
// 创建一个删除请求
Delete delete = new Delete(Bytes.toBytes("行键"));
// 可以自定义一些筛选条件
delete.addFamily(Bytes.toBytes("列簇名"));
table.delete(delete);
// 停用表
admin.disableTable(tableName);
// 删除列族
admin.deleteColumnFamily(tableName, "列簇名".getBytes());
// 删除表
admin.deleteTable(tableName);
4、PUT新增操作:
TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(TableName.valueOf("表名")).build();
admin.createTable(tableDescriptor);//新增表,这个是1.3之后版本的用法
TableName tableName = TableName.valueOf("表名");
HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
// 新建一个列族名为test的列族
HColumnDescriptor test= new HColumnDescriptor("test");
// 将列族添加到表中
tableDescriptor.addFamily(test);
admin.createTable(tableDescriptor);//老版本API用法
// 创建一个put请求,用于添加数据或者更新数据
Put put = new Put(Bytes.toBytes("行键"));
put.addColumn(Bytes.toBytes("列簇"), Bytes.toBytes("数据列名"), Bytes.toBytes("数据"));
table.put(put);
// 创建一个append请求,用于在数据后面添加内容
Append append = new Append(Bytes.toBytes("行键"));
append.add(Bytes.toBytes("列簇"), Bytes.toBytes("数据列名"), Bytes.toBytes("数据"));
table.append(append);
HBASE shell命令:
hbase shell //进入HBASE的shell命令客户端,exit为退出
create_namespace '表空间名' //创建一个表空间
drop_namespace '表空间名' //删除一个表空间
describe_namespace '表空间名' //查看一个表空间
list_namespace //查看所有表空间
create '表空间名:表名', '列簇名' //在对应表空间下创建表
list_namespace_tables '表名' //查看一个表空间下的某个表
create '表名','列簇名','列簇名' //创建表
list //列出所有表
disable '表名' //禁用表
alter '表名', '列族名' //修改列簇
alter '表名', {NAME=> '列族名', METHOD=> 'delete'} //删除列簇
# 修改f1列族的版本为5
alter 't1', NAME => 'f1', VERSIONS => 5
# 修改多个列族,修改f2为内存,版本号为5
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}
describe '表名' //获取表的描述
exists '表名' //判断表是否存在
enable '表名' //启用表,和禁用表对应
drop '表名' 表的删除需要先禁用,启用的表是不允许删除的
put '表名', '行键', '列族名', '列值'
put '表名', '行键', '列族名:列名', '列值' //插入数据语法
scan '表名' //全表扫描
scan '表名', {COLUMN=>'列族名:列名'} //扫描某个列簇对应的列
get '表名', '行键', '列族名'
get '表名', '行键' //查询数据
delete '表名', '行键', '列族名:列名' //删除某个列簇下的列
deleteall '表名', '行键' //删除某行数据
truncate '表名' //清空表数据,底层为先禁用再删除再重新创建
count '表名' //查询有多少行数据
scan '表名', { LIMIT => 行数} //指定行数扫描
简单错误排查。
有问题建议先检查节点和端口是否都正常,然后查看ZK运转是否正常
RIT问题:一般可以先使用 hbase hbck进行错误扫描,一般出现这个问题,都是由于数据读写异常或者是内存异常或大量短连接造成的,一般来说重启节点就能解决问题。还是没有解决,建议手动排查一下引用文件是否出了问题,如果是的话,删除异常的引用文件
hbase2.0以下的hbase可以使用hbase hbck -fix进行自我修复。
hbase2.03以上版本可以使用hbck2工具进行修复,如果是hbase2.0的话,目前我还没有找到可以使用的。