有關HBase的安裝能夠參考hbase安裝java
咱們能夠經過hbase shell和hbase數據庫進行交互,也能夠經過Java-api和hbase數據庫交互,這裏咱們使用的是hbase-client。shell
主要是介紹2.0重大重構以後的api的基本使用。數據庫
#列出全部命名空間 list_namespace #新建命名空間 create_namespace 'namespaceName' #刪除命名空間 drop_namespace 'namespaceName' #修改命名空間
create:建立表apache
exists:檢查表是否存在api
list:查看全部表dom
alter:修改表oop
delete:刪除列ui
disable:禁用表spa
is_enabled:查看錶是否禁用.net
desc\describe:查看錶結構
drop:刪除表
put:插入數據
count:統計表有多少行
get:獲取數據
scan:掃描表或者列
#列出全部表 list #列出指定命名空間下的全部表 list_namespace_tables 'namespaceName' #新建一個以命名空間namespaceName的表tableName,列族爲cf1。 create 'namespaceName:tableName', 'cf1' create 'tablename','columnFamily1','columnFamily2' create 'tablename',{NAME => 'columnFamily1',VERSIONS => 1, TTL => 214783647, BLOCKCACHE => false,IN_MEMORY=>false},{NAME=>'columnFamily2',VERSIONS=>1,TTL=>259200,BLOCKCACHE=>false,IN_MEMORY=>false} disable 'tableName' #刪除表 drop 'tableName' #查看錶內容,查看前5行數據 scan 'namespaceName:tableName', {LIMIT=>5} #插入 put tableName rowkey,"columnFamily:column","value" put 'tableName', 'rowkey', 'columnFamilyName:columnName', 'value' #查看 get rowKey get 'tableName', 'rowkey'
刪除表中的列簇,先disable表,修改後enable表,嚴格區分大小寫
查詢user表中的全部信息 scan 'user' 查詢user表中列族爲info的信息 scan 'user', {COLUMNS => 'info'} scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5} 查詢user表中列族爲info和data的信息 scan 'user', {COLUMNS => ['info', 'data']} scan 'user', {COLUMNS => ['info:name', 'data:pic']} 查詢user表中列族爲info、列標示符爲name的信息 scan 'user', {COLUMNS => 'info:name'} 查詢user表中列族爲info、列標示符爲name的信息,而且版本最新的5個 scan 'user', {COLUMNS => 'info:name', VERSIONS => 5} 查詢user表中列族爲info和data且列標示符中含有a字符的信息 scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"} 查詢user表中row key爲rk0001,cell的值爲中國 scan 'user', 'rk0001', {FILTER => "ValueFilter(=,'binary:中國')"} 查詢user表中row key爲rk0001,列標示符中含有a的信息 scan 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} 查詢user表中row key以rk字符開頭的 scan 'user',{FILTER=>"PrefixFilter('rk')"} 查詢user表中列族爲info,rk範圍是[rk0001, rk0003)的數據 scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'} 查詢user表中指定範圍的數據 scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
get命令也能夠使用如上所示的scan命令方式
help:查看命令幫助
status:查看hbase狀態
version:查看hbase版本
修改表名HBase沒有rename命令,能夠經過快照功能修改表名
//爲表建立快照,這時尚未複製數據 clone_snapshot 'tableSnapshot', 'newTableName' //根據某個快照而建立新表,此時複製數據 snapshot 'tableName', 'tableSnapshot' //刪除快照 delete_snapshot 'tableSnapshot'
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.2.0</version> </dependency>
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.Random; public class HBaseTest { private static final String ZOOKEEPER_QUORUM = "127.0.0.1:2181"; public static final String TABLE_NAME = "test_tb"; private Connection connection; private Configuration configuration; @Before public void setUp() throws IOException { configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum", ZOOKEEPER_QUORUM); connection = ConnectionFactory.createConnection(configuration); } @Test public void createTable() throws Exception { Admin admin = connection.getAdmin(); TableName tableName = TableName.valueOf(TABLE_NAME); TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName); ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info"); ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info"); tableDescriptorBuilder.setColumnFamily(baseInfo); tableDescriptorBuilder.setColumnFamily(extInfo); TableDescriptor tableDescriptor = tableDescriptorBuilder.build(); admin.createTable(tableDescriptor); } @Test public void dealTable() throws IOException { Admin admin = connection.getAdmin(); String tableNameString = "test_user"; TableName tableName = TableName.valueOf(tableNameString); if(admin.tableExists(tableName)){ admin.disableTable(tableName); admin.deleteTable(tableName); } } @Test public void descTable() throws IOException { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); TableDescriptor tableDescriptor = table.getDescriptor(); ColumnFamilyDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies(); for(ColumnFamilyDescriptor cfd : columnFamilies){ System.out.println(Bytes.toString(cfd.getName())); } } @Test public void put() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Put put=new Put(Bytes.toBytes("user_info_1")); // put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value)); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes("tim")); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes("123")); table.put(put); } @Test public void puts() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); LinkedList<Put> puts = new LinkedList<>(); puts.add(getPut("user_info_2")); puts.add(getPut("user_info_3")); puts.add(getPut("user_info_4")); table.put(puts); } private static Put getPut(String rowKey){ Put put=new Put(Bytes.toBytes(rowKey)); Random random = new Random(); String name = String.valueOf(random.nextInt(1000000)); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes(name)); put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes(name)); return put; } @Test public void get() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Get get =new Get(Bytes.toBytes("user_info_1")); get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name")); Result result=table.get(get); List<Cell> cells = result.listCells(); for(Cell cell: cells){ System.out.println(Bytes.toString(cell.getFamilyArray())); System.out.println(Bytes.toString(cell.getQualifierArray())); System.out.println(Bytes.toString(cell.getValueArray())); System.out.println(cell.getTimestamp()); } } @Test public void gets() throws IOException { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); LinkedList<Get> gets = new LinkedList<>(); gets.add(getGet("user_info_1")); gets.add(getGet("user_info_2")); gets.add(getGet("user_info_3")); gets.add(getGet("user_info_4")); Result[] results = table.get(gets); for(Result result : results){ System.out.println(new String(result.getRow())); System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name")))); System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("tel")))); } } private static Get getGet(String rowKey){ Get get =new Get(Bytes.toBytes(rowKey)); get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name")); get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel")); return get; } @Test public void scan() throws IOException { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Scan s = new Scan(); ResultScanner resultScanner = table.getScanner(s); for(Result result : resultScanner){ byte[] row = result.getRow(); System.out.println(new String(row)); System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name")))); } } @Test public void deleteRowKey() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Delete de =new Delete(Bytes.toBytes("rowKey")); table.delete(de); } @Test public void deleteColumn() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Table table = connection.getTable(tableName); Delete de =new Delete(Bytes.toBytes("rowKey")); de.addColumn(Bytes.toBytes(""), Bytes.toBytes("")); table.delete(de); } @Test public void disableTable() throws Exception { TableName tableName = TableName.valueOf(TABLE_NAME); Admin admin = connection.getAdmin(); admin.disableTable(tableName); } @Test public void listNamespace() throws Exception { Admin admin = connection.getAdmin(); NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors(); for(NamespaceDescriptor namespaceDescriptor : namespaceDescriptors){ System.out.println(namespaceDescriptor.getName()); } } @Test public void listTables() throws IOException { Admin admin = connection.getAdmin(); List<TableDescriptor> tableDescriptors = admin.listTableDescriptors(); for(TableDescriptor tableDescriptor : tableDescriptors){ System.out.println(tableDescriptor.getTableName().getNameAsString()); } } }
重點就是構建鏈接:
Configuration configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum", "127.0.0.1:2181"); Connection connection = ConnectionFactory.createConnection(configuration);
相關的操做基本和Admin有關,經過Connection獲取Admin:
Admin admin = connection.getAdmin();
再也不使用字符串代表,而是使用TableName抽象:
TableName tableName = TableName.valueOf("tableName");
表描述構建:
TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
列簇構建:
ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");
下面的createTable基本把表相關的抽象都使用到了:
@Test public void createTable() throws Exception { Admin admin = connection.getAdmin(); TableName tableName = TableName.valueOf(TABLE_NAME); TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName); ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info"); ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info"); tableDescriptorBuilder.setColumnFamily(baseInfo); tableDescriptorBuilder.setColumnFamily(extInfo); TableDescriptor tableDescriptor = tableDescriptorBuilder.build(); admin.createTable(tableDescriptor); }