§歷史回顧 2018年歲末,李大胖朦朧中上了開往Hbase王國的車,伴著一聲長鳴,列出緩緩駛出站臺,奔向無垠的廣袤。 (圖片來自於網路) 如不熟悉劇情的,可觀看文章: 五分鐘輕鬆瞭解Hbase列式存儲 Hbase給初學者的“下馬威” §生逢其時 隨著改革開放的持續推進,移動互聯網的長足發展,以及物聯 ...
§歷史回顧
2018年歲末,李大胖朦朧中上了開往Hbase王國的車,伴著一聲長鳴,列出緩緩駛出站臺,奔向無垠的廣袤。
(圖片來自於網路)
如不熟悉劇情的,可觀看文章:
§生逢其時
隨著改革開放的持續推進,移動互聯網的長足發展,以及物聯網出現,舊有體制下的一些東西已經不能很好的適應發展的需要,無論是壁壘森嚴且高冷的Oracle,亦或是左右逢源並可愛的MySQL,都表現出了心有餘而力不足。
俗話說,一代天子一朝臣,代代都有追夢人。Hbase無疑是當下最璀璨的星光之一,照耀著九州大地。
Hbase秉持的原則就是,以時間為朋友,打不過別人,卻可以熬死對手,剩下來的就是歷史的王者,這就是所謂的“剩者為王”。依靠著這個戰略方針,Hbase漸漸地建立了自己的王國。
§建國之初
Hbase王國雖然稚嫩,卻受上帝青睞。背靠高山,面朝大海,風光秀麗,易守難攻。兵家必爭之寶地,旅游度假的好去處。無奈國土初建,人煙稀少,急需大量補充子民,大量開墾良田。
這可使國王Hbase有點犯愁,於是大臣們紛紛獻計獻策。其中Zookeeper大臣道:雖然已經下發了鼓勵多生孩子的條文,但畢竟遠水不解近渴。依微臣之愚見,當下行之有效的方法就是游說其它國家的子民,把他們睡服,讓他們入伙。國王點了點頭道:那就依了愛卿吧。
§改革開放
Zookeeper大臣拿到國王的授權後,開始制定一系列方案方針,並親自督導實施落地。
國內方面,掀起一場學習熱潮,人人參與,集中講解,分組討論,逐個答疑,共同提高。
國際方面,24小時開門迎客,落地免簽,食宿優惠,門票免費。對於願意加入我們的,只要簡單審核即可發放綠卡。
此消息一齣,各國游人蜂擁而至,當然也包括誤打誤撞的李大胖。
§墨守陳規
街上有很多來自各個國家的游客,邊走邊看。轉過一個路口,前面聚集了一些人,於是大家都跟著湊上去,一探究竟。
原來是一個Hbase王國老者準備給這些游客講解Hbase相關知識。老者穿著運動鞋/牛仔褲/圓領T恤,頭髮幾乎快沒了,還戴著一副眼鏡。一看就是大神級別的大牛,就叫他道哥吧。道哥環顧四周,發現人已經很多了,於是開始了講解。
Hbase是使用Java寫的,所以自然提供了一套Java API來操作Hbase,今天就學習如何使用它。
以下是非常老套的流程(可跳過)
引入Maven依賴:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-shaded-client</artifactId>
<version>${hbase.version}</version>
</dependency>
獲取鏈接(Connection)。此時需要配置一些參數,如IP/埠/超時時間等,一般都會有一個配置對象(HBaseConfiguration)來完成這個工作。由於鏈接的創建較為複雜,所以一般由鏈接工廠(ConnectionFactory)負責創建。由於鏈接的創建涉及網路操作較為耗時,頻繁創建並不經濟划算,所以一般都會緩存起來以便復用,此時就要求這個鏈接對象是線程安全的。這些都已經是套路了,大家儘管放心吧。
@Bean
public Connection connection() throws IOException {
org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", hbaseProperties.getZookeeper().getQuorum());
conf.set("hbase.rpc.timeout", hbaseProperties.getRpc().getTimeout().toString());
conf.set("hbase.rpc.read.timeout", hbaseProperties.getRpc().getReadTimeout().toString());
conf.set("hbase.rpc.write.timeout", hbaseProperties.getRpc().getWriteTimeout().toString());
conf.set("hbase.client.operation.timeout", hbaseProperties.getClient().getOperationTimeout().toString());
conf.set("hbase.client.scanner.timeout.period", hbaseProperties.getClient().getScannerTimeoutPeriod().toString());
return ConnectionFactory.createConnection(conf);
}
DDL相關操作。此時需要從Connection里獲取一個Admin對象,來執行一些和表相關的操作。這個Admin自然是非線程安全的,不能緩存,且使用完要記得關閉(close)。
DML相關操作。此時需要從Connection里獲取一個Table對象,來執行一些和數據相關的操作,很顯然,Table的特點和Admin是一樣的。
眾人看完後,不由得感慨,這果然已經是一個非常標準的分散式軟體客戶端的套路模板了。
§命名空間
道哥繼續道,Hbase引入了命名空間的概念,與我們在其它地方見到的命名空間其實大概意思差不多。
它表示若幹個相似表的一個邏輯分組。基於它可以實現一些面向多租戶的特性,如:
1、配額管理,限制一個命名空間可以使用的資源量
2、安全管理,為租戶提供另一個級別的安全管理
3、物理伺服器分組,可以把一個命名空間需要的資源固定在若幹個指定伺服器上,保證一個粗粒度級別的隔離
道哥補充道,其實命名空間就相當於一個群組,便於從不同的方面進行管理。
每個系統都會預留一些東西供自己使用,或在特殊情況下使用。當然,這也是套路了,最明顯的如編程語言中的關鍵字。Hbase也不例外,它有兩個預定義的特殊命名空間:
hbase,系統命名空間,用來包含Hbase內部使用的表
default,預設命名空間,用來在沒有顯式指定命名空間時使用
最後,瀏覽一下關於命名空間的API:
//列出所有
admin.listNamespaceDescriptors();
//查詢
admin.getNamespaceDescriptor(name);
//創建
admin.createNamespace(namespaceDescriptor);
//修改
admin.modifyNamespace(namespaceDescriptor);
//刪除
admin.deleteNamespace(name);
命名空間