1、簡介
可以把Phoenix了解為Hbase的查詢引擎,phoenix,由saleforce.com開源的一個項目,後又捐給了Apache。它相當于一個Java中間件,幫助開發者,像使用jdbc通路關系型資料庫一些,通路NoSql資料庫HBase。
phoenix,操作的表及資料,存儲在hbase上。phoenix隻是需要和Hbase進行表關聯起來。然後再用工具進行一些讀或寫操作。
其實,可以把Phoenix隻看成一種代替HBase的文法的一個工具。雖然可以用java可以用jdbc來連接配接phoenix,然後操作HBase,但是在生産環境中,不可以用在OLTP中。線上事務處理的環境中,需要低延遲,而Phoenix在查詢HBase時,雖然做了一些優化,但延遲還是不小。是以依然是用在OLAT中,再将結果傳回存儲下來。
基礎環境:
hadoop
hbase
zookeeper
這個基礎環境就是前面hbase的部署之後的環境,請自行按照前面的進行部署,這裡不重複部署
下面我們通過Phoenix作為中間件,操作hbase叢集資料。根據hbase的版本下載下傳對應版本的Phoenix,這裡用的是 apache-phoenix-4.14.2-HBase-1.3-bin.tar.gz。并且是部署在bigdata121這台主機上
解壓程式包:
配置環境變量:
複制hbase的 conf/hbase-site.xml 到/opt/modules/phoenix-4.14.2-HBase-1.3-bin/bin下。
接着将Phoenix通路hbase 的一些依賴包拷貝到hbase 的lib目錄下,注意:需要複制到所有hbase節點上
啟動Phoenix指令行,測試是否能連接配接hbase
要注意的是:Phoenix其實就是一個hbase的插件庫,并不是獨立的一個元件,hbase有了這個插件之後,重新開機hbase,然後就可使用Phoenix來連接配接hbase,并操作hbase了。
展示表有哪些
建立表
删除表
插入資料
查詢資料
删除資料
修改表結構
建立映射表
maven項目的pom.xml
代碼:
用jdbc連接配接Phoenix,出現的問題
首先我們看到這一行:
顯示的是com.lmax.disruptor.dsl.Disruptor這個方法不存在,于是在ideal裡面找了找,是有這個方法的,然後我百度了下,這個包是hbase和Phoenix依賴的一個包。既然方法是存在的,但是卻顯示不存在的報錯,按照經驗來說,很可能是這個依賴包的版本不對,導緻某些方法不相容。是以我嘗試換了下比較新的disruptor這個包的版本,去maven上找了找,挑了個3.3.7的版本(預設的是3.3.0),添加到pom.xml中
然後重新運作程式,奇迹出現了,正常運作了。那很明顯是因為包的版本問題了。
首先hbase的列簇中的字段沒有類型的概念,全都直接用二進制的方式存儲,且hbase本身隻能解析string類型的。而我們使用Phoenix來用正常sql建立表時,字段是有類型的。會出現以下情況的bug
1、hbase顯示亂碼
這種情況是在Phoenix建立表的時候,字段有非string類型,比如int,double之類的。然後當從Phoenix使用insert之類的語句插入資料時,然後從Phoenix使用select語句檢視資料,是正常的,沒問題的。但是在hbase中使用scan檢視表資料時,會發現,其他非string類型的字段,顯示全是亂碼。這種情況是正常的,因為前面說了hbase無法解析非string類型,顯示出來是直接二進制的方式顯示。這個bug我暫時無解。
這種情況最好的方法就是,不從hbase查詢資料,而是從Phoenix查詢資料。而且在這種情況下,在hbase中,連列簇,rowkey,column都是顯示奇奇怪怪的字元的。完全看不懂
2、Phoenix顯示不正常(不是亂碼)
在hbase中實作已存在一張表(有資料),然後在Phoenix中建立一張映射表。在hbase端檢視資料是正常的,但是通過Phoenix檢視,發現非string類型的顯示不正常,比如int,double之類的,變成一些非正常的數字。比如這樣:
原因其實很簡單,因為hbase本身的表并沒有存儲任何資料類型的資訊,但是Phoenix卻強行強行解析成其他資料類型,自然不會比對,是以顯示不正常。
price和sells明明是數字類型的,但是顯示出來的東西不正常。這種情況解決方案是:在Phoenix建立映射表時,字段類型全部定義為 varchar 這種string類型的。