日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Hbase Java API详解

發布時間:2023/12/9 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hbase Java API详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

HBase是Hadoop的數據庫,能夠對大數據提供隨機、實時讀寫訪問。他是開源的,分布式的,多版本的,面向列的,存儲模型。

在講解的時候我首先給大家講解一下HBase的整體結構,如下圖:

HBase Master是服務器負責管理所有的HRegion服務器,HBase Master并不存儲HBase服務器的任何數據,HBase邏輯上的表可能會劃分為多個HRegion,然后存儲在HRegion Server群中,HBase Master Server中存儲的是從數據到HRegion Server的映射。

一臺機器只能運行一個HRegion服務器,數據的操作會記錄在Hlog中,在讀取數據時候,HRegion會先訪問Hmemcache緩存,如果 緩存中沒有數據才回到Hstore中上找,沒一個列都會有一個Hstore集合,每個Hstore集合包含了很多具體的HstoreFile文件,這些文 件是B樹結構的,方便快速讀取。

?

再看下HBase數據物理視圖如下:

Row KeyTimestampColumn Family
URIParser
r1t3url=http://www.taobao.comtitle=天天特價
t2host=taobao.com
t1

r2t5url=http://www.alibaba.comcontent=每天…
t4host=alibaba.com

???Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序

???Timestamp: 時間戳,每次數據操作對應的時間戳,可以看作是數據的version number

???Column Family:列簇,Table在水平方向有一個或者多個Column Family組成,一個Column Family中可以由任意多個Column組成,即Column Family支持動態擴展,無需預先定義Column的數量以及類型,所有Column均以二進制格式存儲,用戶需要自行進行類型轉換。


了解了HBase的體系結構和HBase數據視圖夠,現在讓我們一起看看怎樣通過Java來操作HBase數據吧!

先說說具體的API先,如下

?

HBaseConfiguration是每一個hbase client都會使用到的對象,它代表的是HBase配置信息。它有兩種構造方式:

public HBaseConfiguration()

public HBaseConfiguration(final Configuration c)

默認的構造方式會嘗試從hbase-default.xml和hbase-site.xml中讀取配置。如果classpath沒有這兩個文件,就需要你自己設置配置。

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(“hbase.zookeeper.quorum”, “zkServer”);

HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”, “2181″);

HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

?

創建表

創建表是通過HBaseAdmin對象來操作的。HBaseAdmin負責表的META信息處理。HBaseAdmin提供了createTable這個方法:

public void createTable(HTableDescriptor desc)

HTableDescriptor 代表的是表的schema, 提供的方法中比較有用的有

setMaxFileSize,指定最大的region size

setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小

?

增加family通過 addFamily方法

public void addFamily(final HColumnDescriptor family)

HColumnDescriptor 代表的是column的schema,提供的方法比較常用的有

setTimeToLive:指定最大的TTL,單位是ms,過期數據會被自動刪除

setInMemory:指定是否放在內存中,對小表有用,可用于提高效率。默認關閉

setBloomFilter:指定是否使用BloomFilter,可提高隨機查詢效率。默認關閉

setCompressionType:設定數據壓縮類型。默認無壓縮。

setMaxVersions:指定數據最大保存的版本個數。默認為3。

?

一個簡單的例子,創建了4個family的表:

?

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

HTableDescriptor t = new HTableDescriptor(tableName);

t.addFamily(new HColumnDescriptor(“f1″));

t.addFamily(new HColumnDescriptor(“f2″));

t.addFamily(new HColumnDescriptor(“f3″));

t.addFamily(new HColumnDescriptor(“f4″));

hAdmin.createTable(t);

?

刪除表

刪除表也是通過HBaseAdmin來操作,刪除表之前首先要disable表。這是一個非常耗時的操作,所以不建議頻繁刪除表。

disableTable和deleteTable分別用來disable和delete表。

Example:

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

if (hAdmin.tableExists(tableName)) {

? ? ? ?hAdmin.disableTable(tableName);

? ? ? ?hAdmin.deleteTable(tableName);

}

?

查詢數據

查詢分為單條隨機查詢和批量查詢。

單條查詢是通過rowkey在table中查詢某一行的數據。HTable提供了get方法來完成單條查詢。

批量查詢是通過制定一段rowkey的范圍來查詢。HTable提供了個getScanner方法來完成批量查詢。

public Result get(final Get get)

public ResultScanner getScanner(final Scan scan)

Get對象包含了一個Get查詢需要的信息。它的構造方法有兩種:

? public Get(byte [] row)

? public Get(byte [] row, RowLock rowLock)

Rowlock是為了保證讀寫的原子性,你可以傳遞一個已經存在Rowlock,否則HBase會自動生成一個新的rowlock。

Scan對象提供了默認構造函數,一般使用默認構造函數。

?

Get/Scan的常用方法有:

addFamily/addColumn:指定需要的family或者column,如果沒有調用任何addFamily或者Column,會返回所有的columns.

setMaxVersions:指定最大的版本個數。如果不帶任何參數調用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只會取到最新的版本。

setTimeRange:指定最大的時間戳和最小的時間戳,只有在此范圍內的cell才能被獲取。

setTimeStamp:指定時間戳。

setFilter:指定Filter來過濾掉不需要的信息

?

Scan特有的方法:

setStartRow:指定開始的行。如果不調用,則從表頭開始。

setStopRow:指定結束的行(不含此行)。

setBatch:指定最多返回的Cell數目。用于防止一行中有過多的數據,導致OutofMemory錯誤。

ResultScanner是Result的一個容器,每次調用ResultScanner的next方法,會返回Result.

public Result next() throws IOException;

public Result [] next(int nbRows) throws IOException;

?

Result代表是一行的數據。常用方法有:

getRow:返回rowkey

raw:返回所有的key value數組。

getValue:按照column來獲取cell的值

?

Example:

Scan s = new Scan();

s.setMaxVersions();

ResultScanner ss = table.getScanner(s);

for(Result r:ss){

? ? System.out.println(new String(r.getRow()));

? ? for(KeyValue kv:r.raw()){

? ? ? ?System.out.println(new String(kv.getColumn()));

? ? }

}

?

插入數據

HTable通過put方法來插入數據。?

public void put(final Put put) throws IOException

public void put(final List puts) throws IOException

可以傳遞單個批Put對象或者List put對象來分別實現單條插入和批量插入。

Put提供了3種構造方式:

public Put(byte [] row)

public Put(byte [] row, RowLock rowLock)

public Put(Put putToCopy)?

?

Put常用的方法有:

add:增加一個Cell

setTimeStamp:指定所有cell默認的timestamp,如果一個Cell沒有指定timestamp,就會用到這個值。如果沒有調用,HBase會將當前時間作為未指定timestamp的cell的timestamp.

setWriteToWAL: WAL是Write Ahead Log的縮寫,指的是HBase在插入操作前是否寫Log。默認是打開,關掉會提高性能,但是如果系統出現故障(負責插入的Region Server掛掉),數據可能會丟失。

另外HTable也有兩個方法也會影響插入的性能

setAutoFlash: AutoFlush指的是在每次調用HBase的Put操作,是否提交到HBase Server。默認是true,每次會提交。如果此時是單條插入,就會有更多的IO,從而降低性能.

setWriteBufferSize: Write Buffer Size在AutoFlush為false的時候起作用,默認是2MB,也就是當插入數據超過2MB,就會自動提交到Server

?

Example:

HTable table = new HTable(hbaseConfig, tableName);

table.setAutoFlush(autoFlush);

List lp = new ArrayList();

int count = 10000;

byte[] buffer = new byte[1024];

Random r = new Random();

for (int i = 1; i <= count; ++i) {

? ? ? ?Put p = new Put(String.format(“row%09d”,i).getBytes());

? ? ? ?r.nextBytes(buffer);

? ? ? ?p.add(“f1″.getBytes(), null, buffer);

? ? ? ?p.add(“f2″.getBytes(), null, buffer);

? ? ? ?p.add(“f3″.getBytes(), null, buffer);

? ? ? ?p.add(“f4″.getBytes(), null, buffer);

? ? ? ?p.setWriteToWAL(wal);

? ? ? ?lp.add(p);

? ? ? ?if(i%1000==0){

? ? ? ? ? ?table.put(lp);

? ? ? ? ? ?lp.clear();

? ? ? ?}

? ? }

?

刪除數據

HTable 通過delete方法來刪除數據。

? public void delete(final Delete delete)?

?

Delete構造方法有:

public Delete(byte [] row)

public Delete(byte [] row, long timestamp, RowLock rowLock)

public Delete(final Delete d)

Delete常用方法有

deleteFamily/deleteColumns:指定要刪除的family或者column的數據。如果不調用任何這樣的方法,將會刪除整行。

注意:如果某個Cell的timestamp高于當前時間,這個Cell將不會被刪除,仍然可以查出來。

?

Example:

HTable table = new HTable(hbaseConfig, “mytest”);

Delete d = new Delete(“row1″.getBytes());

table.delete(d)?

?

切分表

HBaseAdmin提供split方法來將table 進行split.

public void split(final String tableNameOrRegionName)

?

如果提供的tableName,那么會將table所有region進行split ;如果提供的region Name,那么只會split這個region.

由于split是一個異步操作,我們并不能確切的控制region的個數。

?

Example:

public void split(String tableName,int number,int timeout) throws Exception {

? ? Configuration HBASE_CONFIG = new Configuration();

? ? HBASE_CONFIG.set(“hbase.zookeeper.quorum”, GlobalConf.ZOOKEEPER_QUORUM);

? ? HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”, GlobalConf.ZOOKEEPER_PORT);

? ? HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

? ? HBaseAdmin hAdmin = new HBaseAdmin(cfg);

? ? HTable hTable = new HTable(cfg,tableName);

? ? int oldsize = 0;

? ? t = ?System.currentTimeMillis();

? ? while(true){

? ? ? ?int size = hTable.getRegionsInfo().size();

? ? ? ?logger.info(“the region number=”+size);

? ? ? ?if(size>=number ) break;

? ? ? ?if(size!=oldsize){

? ? ? ? ? ?hAdmin.split(hTable.getTableName());

? ? ? ? ? ?oldsize = size;

? ? ? ?}? ? ? ?else if(System.currentTimeMillis()-t>timeout){

? ? ? ? ? ?break;

? ? ? ?}

? ? ? ?Thread.sleep(1000*10);

? ? }

}


轉載于:https://my.oschina.net/u/569297/blog/188031

總結

以上是生活随笔為你收集整理的Hbase Java API详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。