如何使用Hive集成Solr?

(一)Hive+Solr簡介 

Hive作爲Hadoop生態系統裏面離線的數據倉庫,可以非常方便的使用SQL的方式來離線分析海量的歷史數據,並根據分析的結果,來幹一些其他的事情,如報表統計查詢等。 
Solr作爲高性能的搜索服務器,能夠提供快速,強大的全文檢索功能。 

(二)爲什麼需要hive集成solr? 

有時候,我們需要將hive的分析完的結果,存儲到solr裏面進行全文檢索服務,比如以前我們有個業務,對我們電商網站的搜索日誌使用hive分析完後 存儲到solr裏面做報表查詢,因爲裏面涉及到搜索關鍵詞,這個字段是需要能分詞查詢和不分詞查詢的,通過分詞查詢可以查看改詞的相關的產品在某一段時間內的一個走勢圖。 有時候,我們又需要將solr裏面的數據加載到hive裏面,使用sql完成一些join分析功能, 兩者之間優劣互補,以更好的適應我們的業務需求。當然網上已經有一些hive集成solr的開源項目,但由於 版本比較舊,所以無法在新的版本里面運行,經過散仙改造修補後的可以運行在最新的版本。 

(三)如何才能使hive集成solr? 

所謂的集成,其實就是重寫hadoop的MR編程接口的一些組件而已。我們都知道MR的編程接口非常靈活,而且高度抽象,MR不僅僅可以從HDFS上加載 數據源,也可以從任何非HDFS的系統中加載數據,當然前提是我們需要自定義: 
InputFormat 
OutputFormat 
RecordReader 
RecordWriter 
InputSplit 
組件,雖然稍微麻煩了點,但從任何地方加載數據這件事確實可以做到,包括mysql,sqlserver,oracle,mongodb, solr,es,redis等等。 

上面說的是定製Hadoop的MR編程接口,在Hive裏面除了上面的一些組件外,還需要額外定義SerDe組件和組裝StorageHandler,在hive裏面 SerDe指的是 Serializer and Deserializer,也就是我們所說的序列化和反序列化,hive需要使用serde和fileinput來讀寫hive 表裏面的一行行數據。 
讀的流程: 
HDFS files / every source -> InputFileFormat --> --> Deserializer --> Row object 
寫的流程: 
Row object --> Serializer --> --> OutputFileFormat --> HDFS files / every source 

(四)hive集成solr後能幹什麼? 

(1)讀取solr數據,以hive的支持的SQL語法,能進行各種聚合,統計,分析,join等 
(2)生成solr索引,一句SQL,就能通過MR的方式給大規模數據構建索引 

(五)如何安裝部署以及使用? 
源碼在這裏,不在粘貼了,已經上傳github了,有需要的朋友可以使用 git clonehttps://github.com/qindongliang/hive-solr 後,修改少許pom文件後,執行 
mvn clean package 
命令構建生成jar包,並將此jar包拷貝至hive的lib目錄即可 

例子如下: 
(1)hive讀取solr數據 

建表: 

Sql代碼  收藏代碼

  1. --存在表就刪除  

  2. drop table  if exists solr;  

  3.   

  4. --創建一個外部表  

  5. create external table solr (  

  6.   --定義字段,這裏面的字段需要與solr的字段一致  

  7.   rowkey string,  

  8.   sname string  

  9.   

  10. )  

  11. --定義存儲的storehandler  

  12. stored by "com.easy.hive.store.SolrStorageHandler"  

  13. --配置solr屬性  

  14. tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/a',  

  15.                     'solr.query' = '*:*',  

  16.                     'solr.cursor.batch.size'='10000',  

  17.                     'solr.primary_key'='rowkey'  

  18.                        );  

  19. 執行bin/hive 命令,進行hive的命令行終端:  

  20.   

  21. --查詢所有數據  

  22. select * from solr limit 5;  

  23. --查詢指定字段  

  24. select rowkey from solr;  

  25. --以mr的方式聚合統計solr數據  

  26. select sname ,count(*) as c from solr group by sname  order by c desc  



(2)使用hive給solr構建索引的例子 

首先構建數據源表: 

Sql代碼  收藏代碼

  1. --如果存在就刪除  

  2. drop table if exists index_source;  

  3.   

  4. --構建一個數據表  

  5. CREATE TABLE index_source(id string, yname string,sname string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;  

  6.   

  7. --向數據源裏面導入本地數據  

  8. load  data local inpath '/ROOT/server/hive/test_solr' into table index_source;  

  9. 其次,構建solr的關聯表:  

  10.   

  11. --刪除已經存在的表  

  12. drop table  if exists index_solr;  

  13.   

  14. --創建關聯solr表  

  15. create external table index_solr (  

  16.   id string,  

  17.   yname string,  

  18.   sname string  

  19. )   

  20. --定義存儲引擎  

  21.  stored by "com.easy.hive.store.SolrStorageHandler"  

  22. --設置solr服務屬性  

  23. tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/b',  

  24.                     'solr.query' = '*:*',  

  25.                     'solr.cursor.batch.size'='10000',  

  26.                     'solr.primary_key'='id'  

  27.                        );  



最後,執行下面的sql命令,即可給數據源中的數據,構建solr索引: 

Sql代碼  收藏代碼

  1. --註冊hive-solr的jar包,否則MR方式運行的時候,將不能正常啓動  

  2. add jar /ROOT/server/hive/lib/hive-solr.jar;  

  3. --執行插入命令  

  4. INSERT OVERWRITE TABLE index_solr SELECT * FROM  index_source ;   

  5. --執行成功之後,即可在solr的終端界面查看,也可以再hive裏面執行下面的solr查詢  

  6. select * from index_solr limit 10 ;  



(六)他們還能其他的框架集成麼? 

當然,作爲開源獨立的框架,我們可以進行各種組合, hive也可以和elasticsearch進行集成,也可以跟mongodb集成, solr也可以跟spark集成,也可以跟pig集成,但都需要我們自定義相關的組件才行,思路大致與這個項目的思路一致。 

(七)本次測試通過的基礎環境 

Apache Hadoop2.7.1 
Apache Hive1.2.1 
Apache Solr5.1.0 

(八)感謝並參考的資料: 

https://github.com/mongodb/mongo-hadoop/tree/master/hive/src/main/java/com/mongodb/hadoop/hive 
https://github.com/lucidworks/hive-solr 
https://github.com/chimpler/hive-solr 
https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HowtoWriteYourOwnSerDe 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章