田燕軍,王 玥
(山西經(jīng)濟管理干部學院,山西 太原 030024)
hive是基于hadoop的數(shù)倉工具,它用于將結(jié)構(gòu)化的數(shù)據(jù)文件"映射"為一張數(shù)據(jù)庫表,并提供一個被稱為Hive查詢語言(簡稱HiveQL或HQL)的SQL語言[1],來查詢數(shù)據(jù)。Hive中的表是純邏輯表,只有表的定義, 它本身不存儲數(shù)據(jù),數(shù)據(jù)放在hdfs中,也不存儲元數(shù)據(jù),元數(shù)據(jù)都放在MySql中,hive本身也不執(zhí)行具體的查詢工作,會由yarn執(zhí)行??梢詫ive理解為一個客戶端工具,其接收SQL語句,將其轉(zhuǎn)換為相應的MapReduce[2]程序,然后在yarn上面運行。Hive是基于hadoop的,就具有與hadoop一樣的特點,能夠處理高吞吐量的數(shù)據(jù),數(shù)據(jù)越多,hive的優(yōu)勢就越明顯, 但延遲也高。故一般用于ETL清洗數(shù)據(jù)、網(wǎng)絡日志分析、構(gòu)建數(shù)據(jù)倉庫、數(shù)據(jù)挖掘。hive中的表模型如表1。
表1 hive表模型
hbase: Hadoop Database 的簡稱,Hadoop 的數(shù)據(jù)庫,屬于NoSQL[2], 基于hdfs而實現(xiàn)的列式數(shù)據(jù)庫,數(shù)據(jù)最終存儲在hdfs上面,主要用來存儲結(jié)構(gòu)化和半結(jié)構(gòu)化的數(shù)據(jù), 可達到PB級; 在查詢hbase中數(shù)據(jù)的時候, 只能通過rowkey(行鍵)或者rang(范圍)的查詢方案,即簡單的基于key的快速查詢,hbase不支持SQL語句操作,故不能進行復雜的條件查詢,hbase僅支持單行事務,不支持多行事務。hase中的表模型如表2。
表2 hbase表模型
由上述可以看出,hbase不支持SQL語句,在實際的業(yè)務中查詢數(shù)據(jù)很不方便,但hive就不一樣了,hive提供類SQL語句,查詢數(shù)據(jù)很方便; 我們可以整合hive與hbase,通過hive這個客戶端對hbase中的數(shù)據(jù)用SQL進行查詢,讓hbase也支持GROUP BY、CLUSTER BY、ORDER BY等SQL語法,后續(xù)相應的數(shù)據(jù)分析就會很方便。另一方面,hive中因數(shù)據(jù)實際上都存儲在hdfs中,數(shù)據(jù)存儲不是很方便,但hbase中卻可以存儲PB級數(shù)據(jù),通過整合hive與hbase,我們可以把hive中經(jīng)過分析出的大量數(shù)據(jù)映射存儲到hbase中。示意圖如圖1。
圖1 hive與hbase整合示意圖
使用三臺PC機搭建分布式計算平臺,3臺PC機分別都安裝CentOS6.8 64位操作系統(tǒng),并按下邊2.1進行大數(shù)據(jù)集群環(huán)境準備,再按2.2進行大數(shù)據(jù)平臺軟件安裝。
修改/etc/sysconfig/network文件,分別設(shè)置三臺PC機的主機名為:node01、node02、node03;
修改/etc/hosts文件,分別綁定三臺PC機的主機名與IP地址;使用service iptables stop臨時關(guān)閉防火墻,使用chkconfig iptables off永久關(guān)閉防火墻;使用setenforce 0臨時關(guān)閉selinux,修改/etc/selinux/config文件永久關(guān)閉selinux;三臺PC機分別使用yum源安裝ntp(網(wǎng)絡時間服務),并進行配置,使三臺PC機時間同步;使用ssh-keygen-t rsa,ssh-copy-id node01對三臺PC機互相做免密登錄。
在三臺PC機分別新建/export/softwares目錄用于存放軟件安裝包,新建/export/servers目錄用于存放安裝程序; 接下來三臺PC機分別安裝jdk(版本為jdk-8u144-linux-x64.tar.gz),安裝mysql(版本為mysql-connector-java-5.1.38.jar),用于存放hive的元數(shù)據(jù), 用于提供java運行環(huán)境,安裝hadoop(版本為hadoop-2.6.0.tar.gz),用于分布式存儲與分布式計算,安裝zookeeper(版本為zookeeper-3.4.5.tar.gz),用于分布式協(xié)調(diào), 安裝hive(版本為hive-1.1.0.tar.gz),用于數(shù)據(jù)分析, 安裝Hbase(版本為hbase-1.2.0.tar.gz),用于分布式存儲。
hbase與hive的整合主要是利用兩者的API接口互相通信來完成,核心就是把兩者的表綁定,及它們之間的列做映射表,相應語法如下:
createtable hivetable(id string,col1 string,col2 string,col3 string,col4 string)stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = ":key,f1:col1,f1:col2,f2:col3,f2:col4") tblproperties("hbase.table.name"="hbasetable");
注:hbase.table.name 屬性用于綁定hbase與hive二者的表,hivetable是hive中建立的表,對應hbase中建立的表hbasetable; hbase.columns.mapping屬性用于把hbase與hive二者的列進行映射,id是hivetable中的列,對應hbasetable中的行鍵; col1、col2是hivetable中的列,對應hbasetable中f1列族下的col1、col2列; col3、col4是hivetable中的列,對應hbasetable中f2列族下的col3、col4列; hbasetable表中還有其它大量的列,但沒有在此處與hivetable映射,在hive中查看hivetable時就不顯示未映射的列,只顯示已映射了的列。
初始數(shù)據(jù)在habse中,hbase的表中已存儲大量數(shù)據(jù),可在hive中創(chuàng)建一個外部表,用于與hbase當中的表綁定,再在hive中用SQL查詢分析,具體步驟如下:
1) hive中創(chuàng)建外部表: create external table person_hbase2hive(id string, name string, age int)stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = ":key,f1:name,f1:age") tblproperties("hbase.table.name" ="person");
2) hive中做分析查詢: select avg(age) from person_hbase2hive
初始數(shù)據(jù)是在hive中,在hbase中先創(chuàng)建一個用于存儲數(shù)據(jù)的表,再在hive中創(chuàng)建一個內(nèi)部管理表,用于映射剛創(chuàng)建的hbase表; 接下來給hive內(nèi)部管理表當中存數(shù)據(jù)時,都會存儲到hbase上面去,具體步驟如下:
1) hbase中建表:create' hbase_student', {NAME=>' f1',VERSIONS=>3}
2) hive中建內(nèi)部表: create table student_hive2hbase(id int,namestring,age int)stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = "f1:name,f1:age") tblproperties("hbase.table.name" = "hbase_student");
3) hive內(nèi)部表中插入數(shù)據(jù): insert overwrite table student_hive2hbase select id,name,age from student
4) hbase中查看表及數(shù)據(jù): scan' hbase_student'
在實際的工作中,hbase與hive的整合也大量使用,一般通過ETL工具將數(shù)據(jù)源抽取到HDFS進行存儲,再利用Hive清洗、分析數(shù)據(jù),如分析出的結(jié)果數(shù)據(jù)較多,可對hbase與hive進行整合,將分析處理后的結(jié)果存入Hbase中,對于簡單查詢,可直接從HBase中快速查出,如是多條件復雜查詢,可再次利用hive進行查詢。
通過上邊的整合,結(jié)合了hive利于查詢、hbase利于存儲的優(yōu)點,使得hive可以讀取hbase中數(shù)據(jù),hbase可以存儲hive中數(shù)據(jù),讓Hadoop生態(tài)系統(tǒng)中最為常用的兩大框架互相結(jié)合,相得益彰,更加方便了我們大數(shù)據(jù)領(lǐng)域的分析研究。