# 背景html
最近看到公司一個項目用到hbase, 以前也一直想看下hbase。我的理解Hbase做爲一個nosql數據庫,邏輯模型感受跟關係型數據庫有點相似。一個table,有row即行,列。不過列是一個列族,能夠放多個字段,相似下面這種格式java
table usersnode
行 | 列族 | value | 列族 | valuesql
rows1 | info:name | zhangsan | .... | ...shell
rows1 | info:address | wudaokou | .... | ... 數據庫
# 安裝apache
說下安裝吧,有三種模式:單機、僞分佈式、集羣。這裏我用的單機,官網:https://hbase.apache.org/downloads.htmlapi
下載,解壓nosql
安裝步驟必定要安裝官網說明來,博客這些都太老了分佈式
1. hbase-env.sh設置JAVA_HOME
2. hbase-site.xml
<configuration> <property> <name>hbase.rootdir</name> <value>file:///Users/gxf/hbase</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/Users/gxf/zookeeper</value> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> <description> Controls whether HBase will check for stream capabilities (hflush/hsync). Disable this if you intend to run on LocalFileSystem, denoted by a rootdir with the 'file://' scheme, but be mindful of the NOTE below. WARNING: Setting this to false blinds you to potential data loss and inconsistent system state in the event of process and/or node failures. If HBase is complaining of an inability to use hsync or hflush it's most likely not a false positive. </description> </property> </configuration>
這裏,安裝和單機部署基本完成
$HBASE_HOME/bin/start-hbase.sh啓動hbase
http://localhost:16010/master-status這個能正確顯示即啓動成功
# 使用
hbaset提供了一個命令行客戶端,咱們能夠使用命令行客戶端,建立、刪除、修改、查詢表,插入記錄,插敘記錄,刪除記錄,修改記錄
$HBASE_HOME/bin/hbase shell
啓動客戶端,基本命令在官網也能夠看,建議在官網看。我也是搬運工,順便熟悉一下,作個備忘錄
1. list命令,列出全部的表
list
2. 新建user表,列族爲info,存放用戶的基本信息
create 'user', 'info'
3. 刪除表,要先disable,再drop
disable 'user'
drop 'user'
4. 插入數據, put 'tablename', 'row', 'cf:col', 'value'
put 'user', 'row1', 'info:name', 'guanxianseng'
5. 查詢數據 scan tablenanme
scan 'user'
# java客戶端
pom.xml
<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.4.8</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase</artifactId> <version>1.4.8</version> </dependency> <!-- log --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.8.0-beta2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency> </dependencies>
這裏我用了log,全部加了log4j等log依賴
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HBaseTest { private static Configuration conf = null; private static Connection connection = null; private static Admin admin = null; private static Logger logger = LoggerFactory.getLogger(HBaseTest.class); static { //設置鏈接信息 conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "localhost"); conf.set("hbase.zookeeper.property.clientPort", "2181"); conf.setInt("hbase.rpc.timeout", 2000); conf.setInt("hbase.client.operation.timeout", 3000); conf.setInt("hbase.client.scanner.timeout.period", 6000); try { connection = ConnectionFactory.createConnection(conf); admin = connection.getAdmin(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { String tableName = "test3"; String[] colFam = new String[]{"colFam"}; // createTable(tableName, colFam); // deleteTable(tableName); // listTables(); // addData("users", "row3", "info", "name", "guanxianseng"); // deleteData("users", "row1", "info", "name"); // query("users", "row2", "info", "name"); scan("users", "row1", "row2"); } /** * scan數據 * */ public static void scan(String tableNameStr, String startRowKey, String stopRowKey) throws IOException { Table table = connection.getTable(TableName.valueOf(tableNameStr)); Scan scan = new Scan(); ResultScanner resultScanner = table.getScanner(scan); for(Result result : resultScanner){ showCell(result); } } /** * 查詢數據 * */ public static void query(String tableNameStr, String rowkey, String colFam, String col) throws IOException { Table table = connection.getTable(TableName.valueOf(tableNameStr)); Get get = new Get(rowkey.getBytes()); Result result = table.get(get); showCell(result); } /** * 打印一個cell全部數據 * */ private static void showCell(Result result){ for(Cell cell : result.rawCells()){ logger.info("rawname:{}, timestamp:{}, colFam:{}, colName:{}, value:{}", new String(CellUtil.cloneRow(cell)), cell.getTimestamp(), new String(CellUtil.cloneFamily(cell)), new String(CellUtil.cloneQualifier(cell)), new String(CellUtil.cloneValue(cell))); } } /** * 刪除數據 * */ public static void deleteData(String tableNameStr, String row, String colFam, String col) throws IOException { Table table = connection.getTable(TableName.valueOf(tableNameStr)); Delete delete = new Delete(row.getBytes()); table.delete(delete); logger.info("delete tablename: {}, row:{}, colFam:{}, col:{}", tableNameStr, row, colFam, col); } /** * 向表中插入數據 * */ public static void addData(String tableNameStr, String rowkey, String colFam, String col, String value) throws IOException { TableName tableName = TableName.valueOf(tableNameStr); Table table = connection.getTable(tableName); Put put = new Put(rowkey.getBytes()); put.addColumn(colFam.getBytes(), col.getBytes(), value.getBytes()); table.put(put); table.close(); logger.info("put table:{}, rowkey:{}, colFam:{}, col:{}, value:{}", tableNameStr, rowkey, colFam, col, value); } /** * 列出全部的表 * */ public static void listTables() throws IOException { HTableDescriptor[] hTableDescriptors = admin.listTables(); for(HTableDescriptor hTableDescriptor : hTableDescriptors){ logger.info("table :{}", hTableDescriptor.getTableName()); } } /** * 建立表 */ public static void createTable(String tableNameStr, String[] colFam) { try { TableName tableName = TableName.valueOf(tableNameStr); Table table = connection.getTable(tableName); if (admin.tableExists(tableName)) { //表已經存在 logger.info("table {} already exist", tableNameStr); } else { //表不存在 HTableDescriptor hTableDescriptor = new HTableDescriptor(tableNameStr); for (String colStr : colFam) { HColumnDescriptor columnDescriptor = new HColumnDescriptor(colStr); hTableDescriptor.addFamily(columnDescriptor); } admin.createTable(hTableDescriptor); logger.info("creat table success"); admin.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * 刪除表 1. disable 2. delete */ public static void deleteTable(String tableNameStr) throws Exception { TableName tableName = TableName.valueOf(tableNameStr); if (!admin.tableExists(tableName)) { logger.error("table :{} not exist", tableNameStr); } else { admin.disableTable(tableName); admin.deleteTable(tableName); logger.info("delete table:{}", tableNameStr); } } }
這個java demo也參考了網上的demo