您好,登錄后才能下訂單哦!
在之前的大數據學習系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介紹了集群的環境搭建,但是在使用hive進行數據查詢的時候會非常的慢,因為hive默認使用的引擎是MapReduce。因此就將spark作為hive的引擎來對hbase進行查詢,在成功的整合之后,我將如何整合的過程寫成本篇博文。具體如下!
在進行整合之前,首先確保Hive、HBase、Spark的環境已經搭建成功!如果沒有成功搭建,具體可以看我之前寫的大數據學習系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 這篇文章。
那么開始將hive、hbase、spark整合吧。
目前集群的配置如下:
因為Hive與HBase整合的實現是利用兩者本身對外的API接口互相通信來完成的,其具體工作交由Hive的lib目錄中的hive-hbase-handler-*.jar
工具類來實現。所以只需要將hive的 hive-hbase-handler-*.jar
復制到hbase/lib中就可以了。
切換到hive/lib目錄下
輸入:
cp hive-hbase-handler-*.jar /opt/hbase/hbase1.2/lib
注: 如果在hive整合hbase中,出現版本之類的問題,那么以hbase的版本為主,將hbase中的jar包覆蓋hive的jar包。
至于Hive和HBase之間的相關測試可以查看我之前的大數據學習系列之五 ----- Hive整合HBase圖文詳解 這篇文章,本篇就不再過多描述了。
其實Hive整合Spark其實就是Hive使用Spark成功編譯好的架包,但是Hive整合Spark比較坑的是版本不能隨意,必須使用指定的進行編譯。當初因為這個問題困擾了很久,最后查閱資料找到了已經編譯好的spark和hive的版本,我們只需要將編譯好的jar拿過來進行使用就行了。具體使用如下。
切換到hive/conf 目錄下
編輯 hive-env.sh
文件
添加spark的環境:
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;
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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。