Hive默認使用Derby數據庫,因其允許同時有一個用戶進行操作。為了便于使用,需要將其替換為MySQL等關系型數據庫。這里使用 的 是 MySQL,在 Linux下執 行“sudo rpm -qa|grep mysql”命令,來檢測是否安裝了MySQL。如果沒有安裝,可以執行“sudo yum install mysql-server”命令安裝。注意,這里只安裝其服務端程序。為讓安裝順利進行,可以執行“vim /etc/resolv.conf”命令,輸入“nameserver x.x.x.x”,設置合適的DNS服務器地址。之后執行“service mysqld start”命令來啟動MySQL。
執 行“mysqladmin -u root password 'adminpass'”命令,設置MySQL中的root賬戶密碼。為在Linux命令行中順利連接MySQl客戶端,必須將MySQL數據庫“user”表中“root”之外的用戶刪除。方法是執行“mysql-uroot -padminpass”命令,在MySQL控制臺執行“use mysql;”,選擇目標數據庫,執行“update user set= '%'where user= 'root' and host= 'localhost';”、“flush privileges;”命令,對權限進行修改,讓外界的主機可以進行連接。在外部主機上運行Navicat for MySQL工具,點擊工具欄上的“連接”按鈕,在打開窗口中的“常規”面板中輸入其名稱、MySQL主機名、賬戶名和密碼,之后執行連接操作。
在左側打開該連接項目,選擇“MYSQL”、“表”項,在右側雙擊“user”表,在編輯窗口中刪除除了“root”之外的所有賬戶。在上述“mysql>”提示符下點擊“Ctrl+C”鍵,退出MySQL控制臺,執行“chkconfig mysqld on” 命令,可以讓MySQL組件跟隨系統自動運行。執行“wget http://archive.cloundera.com/cdh/5/hive-x.x.x.tar.gz”之類的命令,從指定的網址下載合適的Hive版本安裝包,之后執行“tar -zxf ./hive-x.x.x.tar.gz -C ../hivesoft”命令,將Hive安裝包解壓到指定路徑。在解壓路徑中進入“conf”目錄,執行“cp hive-default.xml.template hive-site.xml”命令,復制得到Hive的配置文件。執行“vim hivesite.xml”命令,將其中的所有內容全部清除,只保存“<configuration>” 和“</configuration>”結構。
依次輸入“<property>”、“<name>javax.jdo.option.ConnectionURL</name>”、“<value>jdbc:mysql://hbasesrv.xxx.com:3306/hive?reateDatabaseIfNot Exist=true</value>”、“</property>”、“<property>”、“<name>javax.jdo.option.ConnectionDriverName</name>”、“<value>com.mysql.jdbc.Driver</value>”、“</property>”、“<property>”、“<name>javax.jdo.option.ConnectionUserName</name>”、“<value>root</value>”、“</property>”、“ <property>”、“<name>javax.jdo.option.ConnectionPassword</name>”、“ <value>adminpass</value>”、“</property>”。
以“jdbc:mysql”開 頭的內容為指定目標MySQL數
據庫連接位置,“com.mysql.jdbc.Driver”指明驅動信息,并執行賬戶名和密碼,這里為“root”和“adminpass”。因為Hive中沒有MySQL的驅動,所以需手工導入,在Linux命令行下進入Hive解壓路徑中的“lib”目錄,執行“cp /home/jars/mysqlconnector-java-x.x.xbin .”命令將驅動文件復制進來。因為Hive文件是存儲在HDFS中的,所以需要進入Hadoop安裝路徑中的“sbin”目錄,執行“startall.sh”文件啟動 Hadoop。執 行“jps”命 令,發 現“Namenode”、“DataNode”、“ResourceManager”、“SecondaryNameNode”、“Jps”等進程都存在,說明啟動成功。進入Hive解壓路徑中的“bin”目錄,執行“Hive”命令來啟動Hive。
如果啟動失敗,極有可能是連接問題,一般是由于主機名沒有配置正確。執行“hostname”命令,將主機名和上述連接參數中的主機名比對,如有問題,需要將其設置為正確值。如果依然報錯,執 行“service mysqld restart”命令重啟 MySQL。啟動Hive成功后,在“hive>”提示符下執行“create table yongh(id string,name string,age string) row format delimited fields terminated by ' '” 命令創建名為“user”的表。執 行“load data local inpath '/home/data/yongh'overwrite into table yongh”命令,將指定路徑中的文件內容插入到上述“yongh”表中。執行“select* from yongh;”命令,查看“user”表中內容。如果以上操作順利完成,說明Hive運行沒有問題。
對于用戶來說,如果想訪問Hive,可以通過命令行來訪問,這是最常用的方式。也可以編寫相應代碼,通過JDBC或ODBC的方式進行訪問。當然,還可使用Hive提供的Web圖形界面進行訪問,但其界面簡單,功能也不強大。為此可以使用HUE系統來增強其功能。Metastore元數據存儲主要用來維護HDFS中的文件和Hive表的關系,包括Hive表的名稱、所屬的數據庫、表的擁有者、列、分區的字段等。
其通常存儲在MySQL等關系型數據庫中,但MySQL依然存在單點故障問題,為此可以配置兩臺MySQL服務器來組成HA高可用結構,防止因為MySQL出現故障引發Hive運行異常。
Driver(Compiler、Optimizer、Executor)驅 動器是Hive的核心,例如想執行一條SQL語句,會通過解析處理,包括解釋器、編譯器、優化器、執行器等。解釋器會將SQL語句解釋為抽象語法樹,一般使用第三方工具完成。例如使用Antlr對抽象語法樹進行解析,判斷表和字段是否存在以及語法是否正確等。如果語法格式存在問題,就會拋出異常信息。接下來編譯器會將抽象語法樹進行編譯,并生成邏輯執行計劃,可以將邏輯執行計劃理解為MapReduce任務。
之后通過優化器對邏輯執行計劃進行優化處理,最后才會進入執行器中執行相應的SQL語句。Hive的數據存儲在HDFS中,查詢的語法主要是通過MapReduce語法進行計算,Hive最主要的作用就是將SQL轉化為MapReduce任務,并通過MapReduce任務返回用戶所需的數據。
對于Hbase的架構來說,同樣是通過客戶端來操作Hbase數據庫的,其數據存儲在HDFS中,通過Zookeeper來管理Hbase集群。當實現了Hive和Hbase的整合后,會先通過命令行進行訪問,之后通過Hive驅動器組件調用Hbase的Client組件,通過Hive提供的Jar包完成兩者間的轉換。
Hive中存在一種存儲Handler,來維護兩者之間的關系。在很多場景中可以發揮兩者整合的功能,例如通過Hive將數據加載到Hbae中,其數據源可以是文件或表,Hive先通過Select語句來查詢數據,之后通過Insert語句將數據插入到Hive表中,因為Hbase和Hive的表已經集成在一起,所以在Hive表增加數據的同時,Hbase表中的數據會同步增加。因為Hbase查詢不支持Join和Group等操作語句,利用Hive和Hbase的集成,可以讓Hbase支持這些操作。
首先將Hbase數據庫或其他的數據源加載到Hive中,通過Hive的語法進行查詢,因為Hive支持Group和Join等操作,可以將查詢的數據返回到結果集中,通過這種方式可以讓Hbase完美支持SQL語法。
當Hbase中實時的操作數據,或周期性的加載其他數據(例如源文件或表中的數據等),因為Hbase加載數據的速度極快,這樣可以通過Hive直接查詢數據,省去了Hive加載數據的環節。
在實現集成之前,需要注意兩者的版本問題。對于Hive 0.9來說,整合的Hbase版本必須是0.92以上的。對于Hive 1.x版本來說,可以和Hbase 0.98x的版本保持兼容。對于Hive 2.x版本來說,只支持Hbase 1.x之后的版本。
如果想讓Hive 1.x和Hbase 1.x集成,必須重新編譯Hive的源代碼,讓兩者保持兼容。Hive中的字段和Hbase中列都是通過Storage handler來維護的,所以在創建Hive表要將其存儲格式指定為該存儲Handler。
這個存儲處理的Handler程序程序被編譯 成 名 為“hive-hbasehandler-x.x.x.jar”的獨立模塊,在Java中其實就是一個Jar包。
注意,Hive的客戶端必須對其進行識別,否則就會出錯。利用Hive和Hbase的集成,可以有效利用HBase數據庫的存儲特性,例如行更新和列索引等。實現集成必須在Hive表和Hbase表之間建立映射關系,對于Hive表中每個域都必須存儲在HBase中,但是Hive表中不需要包含Hbase表中的列,因為Hbase是NoSQL類型的數據庫,其列都是動態指定的。
首先進入Hive的安裝目錄,執行“ls lib”命令,顯示Hive的所有庫文件。
然后執行“cp /home/dbsoft/hbase-x.x/lib/*lib/”命令,其中的’ /home/dbsoft/hbase-x.x將 為Hbase的安裝路徑,將Hbase安裝路徑下的的“lib”的所有內容復制到Hive的“lib”目錄中,如果提示覆蓋的話確認即可。這樣做的好處在于不用繁瑣的設置環境變量。
執行“bin/hive”命令啟動Hive,這里使用簡單的例子來說明如何在Hive中映射Hbase的表。
在“Hive>”提示符下輸入“CREATE TABLE hbtk1(key int,value string)”、“STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'”、“WITH SERDEPROPERTIES("hbase.columns.mapping"= ":key,cf1:val")”、“TBLPROPERTIES ("hbase.table.name" = "htb");”行來創建名為“hbtk1”的表,并指定Hbase的Handler模塊路徑,之后指定其映射關系,最后指定映射的Hbase的表名稱。
進入Hbase的安裝路徑中的“bin”目錄,執行“hbase shell”命令進入Hbase控制臺,執行“list”命令,可以看到名為“htb”表已經加載,執 行“describe 'htb'”命令,查看其詳細信息。因為該表已經和上述Hive中的表建立了映射關系,所以不能在Hive中直接導入數據,但是可以查詢其他的表來加載數據。
在Hive控制臺中執行“CREATE TABLE table1(fno int,chanpin string)row format delimited fields terminated by ' ';”命令,創建名為“table1”的表,其各字段需要和上述表對應,并使用制表符分隔。
然后執行“load data local inpath '/home/data/product.txt' overwrite into table table1;”命令,從指定的名為“product.txt”文件中加載數據。
當然,該文件必須事先創建好,其中輸入對應的字段內容,并使用制表符分隔。 執 行“select * from table1;”命令,顯示已經加載的數據。執行“insert overwrite table hbtk1 select * from table1;”命令,將該表中的數據加載到“hbtk1”表中。
然后,在上述的Hbase控制臺中執行“scan 'htb'”命令,顯示在名為“htb”的表中已經加載了上述的數據,這就說明已經在Hive和Hbase中成功的映射了表的關系。
在Hive控制臺中如果執行“drop table hbtk1;”命令,將該表刪除的話,那么在Hbase中也會自動刪除與之映射的表,因為該Hbase表是通過Hive表管理的。
如果在Hive中創建的表創建了分區的話,使用“select * from 表名”語句可能無法查詢到數據,可以執行“select 字段1,字段2,字段3 from 表名”之類的命令,通過指定具體的字段來實現查詢。
值得說明的是,對于整合之后的表是無法進行修改的。對于Hbase中已經存在的表,也可以通過外部表的方式進行映射。
例如在Hbase控制臺中執 行“create ' yongh1',' 'info” 命 令,創 建 名為“yongh1” 的 表,其 列族 為“info”。 在 Hive控制 臺 中 執 行“CREATE EXTERNAL TABLE hbtk2(key int,value string)”、“STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'”、“WITH SERDEPROPERTIES("hbase.columns.mapping"= "info:value")”、“TBLPROPERTIES("hbase.table.name" = "yongh1");”命令,創建名為“hbtk2”的外部表,使其和Hbase中的“user”表建立映射關系。
在Hbase控制臺中執行“put 'yonghu1', ' 1',' info:value', 'xiaoli '”之類的命令,在該表中插入數據。之后在Hive控制臺中執行“select * from hbtk2;”命令,顯示上述插入的數據,說明Hbase中該表的數據已經加載到Hive對應表中了。
注意,如果在Hive中刪除 了“hbtk2”表,在Hbase中的對應表的內容是不會變化的,因為這是一張外部表,刪除操作不會影響到Hbase中的數據。
順便說一下,如果在Hive應用中使用了Thrift Server組件,則允許允許通過指定端口訪問Hive。其默認啟動命令為“hive --service hiveserver”,當實現了 Hive和Hnase的集成后,必須使用“hive --service hiveserver-hiveconf”命令啟動。
注意,還需要指定Zookeeper的 地 址,例 如“hbase.zookeeper.quorum=node0,node1,node2”。如果啟動出錯,可以先 執 行“hive --service hiveserver -hiveconf””命令啟動,之后在Hive控制臺中 執 行“set hbase.zookeeper.quorum=node0,node1, node2”之類的命令可解決問題。