在以前的大數據學習系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集羣搭建 中介紹了集羣的環境搭建,可是在使用hive進行數據查詢的時候會很是的慢,由於hive默認使用的引擎是MapReduce。所以就將spark做爲hive的引擎來對hbase進行查詢,在成功的整合以後,我將如何整合的過程寫成本篇博文。具體以下!html
在進行整合以前,首先確保Hive、HBase、Spark的環境已經搭建成功!若是沒有成功搭建,具體能夠看我以前寫的大數據學習系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集羣搭建 這篇文章。
那麼開始將hive、hbase、spark整合吧。
目前集羣的配置以下:
java
由於Hive與HBase整合的實現是利用二者自己對外的API接口互相通訊來完成的,其具體工做交由Hive的lib目錄中的hive-hbase-handler-*.jar
工具類來實現。因此只須要將hive的 hive-hbase-handler-*.jar
複製到hbase/lib中就能夠了。
切換到hive/lib目錄下
輸入:git
cp hive-hbase-handler-*.jar /opt/hbase/hbase1.2/lib
注: 若是在hive整合hbase中,出現版本之類的問題,那麼以hbase的版本爲主,將hbase中的jar包覆蓋hive的jar包。github
至於Hive和HBase之間的相關測試能夠查看我以前的大數據學習系列之五 ----- Hive整合HBase圖文詳解 這篇文章,本篇就再也不過多描述了。shell
其實Hive整合Spark其實就是Hive使用Spark成功編譯好的架包,可是Hive整合Spark比較坑的是版本不能隨意,必須使用指定的進行編譯。當初由於這個問題困擾了好久,最後查閱資料找到了已經編譯好的spark和hive的版本,咱們只須要將編譯好的jar拿過來進行使用就好了。具體使用以下。apache
切換到hive/conf 目錄下
編輯 hive-env.sh
文件
添加spark的環境:app
export SPARK_HOME=/opt/spark/spark1.6-hadoop2.4-hive
而後編輯 hive-site.xml
文件
在hive-site.xml 添加 這些配置
這些配置的說明:工具
hive.execution.engine: 表示 hive 執行的默認引擎是,這裏咱們填的是spark。若是不想 加這個配置,但願手動使用spark,那麼進入hive shell以後,輸入:
set hive.execution.engine=spark;
oop
spark.master: spark的主機地址,這裏咱們填spark的默認地址。
spark.home: spark 的安裝路徑,寫spark的安裝路徑。
spark.submit.deployMode:spark的提交方式,默認就寫client。
spark.serializer: spark 的序列化方式。
spark.eventLog.enabled:是否使用spark的日誌,默認true。
spark.eventLog.dir : spark的日誌存放路徑,注意這個路徑要用hadoop建立!
spark.executor.memory:分配給spark的執行內存,根據我的機器來配置。
spark.driver.memory: spark總內存,根據我的機器來配置。學習
完整配置:
<!-- Hive On Spark 配置 --> <property> <name>hive.execution.engine</name> <value>spark</value> </property> <property> <name>spark.master</name> <value>spark://master:7077</value> </property> <property> <name>spark.home</name> <value>/opt/spark/spark1.6-hadoop2.4-hive</value> </property> <property> <name>spark.submit.deployMode</name> <value>client</value> </property> <property> <name>spark.serializer</name> <value>org.apache.spark.serializer.KryoSerializer</value> </property> <property> <name>spark.eventLog.enabled</name> <value>true</value> </property> <property> <name>spark.eventLog.dir</name> <value>hdfs://master:9000/directory</value> </property> <property> <name>spark.executor.memory</name> <value>10G</value> </property> <property> <name>spark.driver.memory</name> <value>10G</value> </property>
成功配置這些以後,進入hive shell中。
簡單進行兩個表的關聯查詢
能夠看到hive已經成功使用spark做爲引擎了。
在成功整合環境以後,而且創建了兩張hive 外聯hbase的表以後。進行數據查詢測試。
兩張表的建立腳本:
create table t_student(id int,name string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,st1:name") tblproperties("hbase.table.name"="t_student","hbase.mapred.output.outputtable" = "t_student"); create table t_student_info(id int,age int,sex string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,st1:age,st1:sex") tblproperties("hbase.table.name"="t_student_info","hbase.mapred.output.outputtable" = "t_student_info");
而後在兩張表中個插入插入100萬數據測試
注:我這裏是在HBase中直接插入100w數據的,使用HBase的Api完成的,具體能夠大數據學習系列之三 ----- HBase Java Api 圖文詳解這篇博文。
成功插入以後,咱們在hive shell中來測試查詢速度。
條數測試:
主鍵管理查詢測試:
非主鍵查詢測試:
注:其實也是可使用hive的Api ,就是普通的JDBC鏈接,只不過鏈接驅動要換成
Class.forName("org.apache.hive.jdbc.HiveDriver");
具體實現能夠看個人github中的代碼:https://github.com/xuwujing/pancm_project/blob/master/src/main/java/com/pancm/test/hiveTest/hiveUtil.java
結論: 使用 hive on spark 查詢能夠看出,若是查詢條件是主鍵,也就是hbase中的rowkey的話,查詢100w數據能夠在2.3s左右就查出來了(我的感受打開spark估計就要用2s左右,若是量大的話,速度估計也不會很慢), 可是若是使用非主鍵的條件去查詢,就能夠看到速度明顯變慢了。
因此在使用 hive on hbase 的時候,儘可能使用rowkey進行查詢。
其實集羣的環境搭建以及整合在我寫第一篇大數據學習系列博客的時候就已經搭建好了。至於博客爲何寫得這麼遲,第一點是當初搭建環境的時候,並無真正的理解那些配置的做用;第二點是環境搭建有些莫名其妙,常常出現問題,不過大部分問題和解決反感我都記錄並寫成博客了,因此慢慢寫博客其實也是我的知識的從新整理;第三是我的的精力有限,沒法一口氣將這些都寫成博客,畢竟寫博客也須要必定時間和精力的。
完成本篇博文以後,暫時先不寫大數據這方面的博客了。感受目前的本身能力還不夠,若是就這樣勉強的去自學,估計也很難學到知識點,更況且將其寫成博客來說解了。因此目前就先放放,有能力以後再來續寫!
大數據學習系列的文章:http://blog.csdn.net/column/details/18120.html