(一)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數據
建表:
java
--存在表就刪除 git
drop table if exists solr; github
--建立一個外部表 redis
create external table solr ( sql
--定義字段,這裏面的字段須要與solr的字段一致 mongodb
rowkey string, apache
sname string 編程
) 服務器
--定義存儲的storehandler
stored by "com.easy.hive.store.SolrStorageHandler"
--配置solr屬性
tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/a',
'solr.query' = '*:*',
'solr.cursor.batch.size'='10000',
'solr.primary_key'='rowkey'
);
執行bin/hive 命令,進行hive的命令行終端:
--查詢全部數據
select * from solr limit 5;
--查詢指定字段
select rowkey from solr;
--以mr的方式聚合統計solr數據
select sname ,count(*) as c from solr group by sname order by c desc
(2)使用hive給solr構建索引的例子
首先構建數據源表:
--若是存在就刪除
drop table if exists index_source;
--構建一個數據表
CREATE TABLE index_source(id string, yname string,sname string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
--向數據源裏面導入本地數據
load data local inpath '/ROOT/server/hive/test_solr' into table index_source;
其次,構建solr的關聯表:
--刪除已經存在的表
drop table if exists index_solr;
--建立關聯solr表
create external table index_solr (
id string,
yname string,
sname string
)
--定義存儲引擎
stored by "com.easy.hive.store.SolrStorageHandler"
--設置solr服務屬性
tblproperties('solr.url' = 'http://192.168.1.28:8983/solr/b',
'solr.query' = '*:*',
'solr.cursor.batch.size'='10000',
'solr.primary_key'='id'
);
最後,執行下面的sql命令,便可給數據源中的數據,構建solr索引:
--註冊hive-solr的jar包,不然MR方式運行的時候,將不能正常啓動
add jar /ROOT/server/hive/lib/hive-solr.jar;
--執行插入命令
INSERT OVERWRITE TABLE index_solr SELECT * FROM index_source ;
--執行成功以後,便可在solr的終端界面查看,也能夠再hive裏面執行下面的solr查詢
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