Solr與HBase架構設計
摘要:本篇是本人在做一個大數據項目時,對于系統架構的一點總結,如何在保證存儲量的情況下,又能保證數據的檢索速度。
前提: Solr、SolrCloud提供了一整套的數據檢索方案,HBase提供了完善的大數據存儲機制。
需求: 1、對于添加到HBase中的結構化數據,能夠檢索出來。
</div>
1.1 一次性創建索引
l、 刪除全索引
效率很高,可以關閉Solr后,直接刪除Data文件。
2、 重新創建全索引
拉取HBase中全數據,分批次創建索引。
1.2 增量創建索引
1、觸發器發送數據到Solr建索引。
配置并使用HBase觸發器功能,配置實現如下:
alter 'angelHbase', METHOD => 'table_att', 'coprocessor' => '/home/hbase/hbase-0.94.18-security/lib/solrHbase.jar|solrHbase.test.SorlIndexCoprocessorObserver|1073741823|'
alter 'angelHbase', METHOD =>'table_att_unset', NAME => 'coprocessor$1'
然后編寫SorlIndexCoprocessorObserver extendsBaseRegionObserver,重寫postPut方法。在postPut方法中,需要正確地讀出寫入HBase的數據結構及數據,然后轉化為相應的SolrInputDocument,再使用ConcurrentUpdateSolrServer方式向Solr服務器發送SolrInputDocument數據,具體使用方法如之前博文介紹Solr的使用方法、性能對比所示。
注意:需要把Solr相關的jar包放入lib下,并且刪除版本不一致的jar(有很多)。更新jar后要重啟HBase才能生效。
具體性能如之前博文介紹Solr的使用方法、性能對比所示。http://www.cnblogs.com/wgp13x/p/3742653.html http://www.cnblogs.com/wgp13x/p/3748764.html
2、觸發器發送數據到RabbitMQ,Solr端從RabbitMQ獲取數據建索引。
embedded方式官方不推薦使用。而使用ConcurrentUpdateSolrServer性能與上種方式并無區別。
3、 建議:
在HBase中只存儲1列,存儲值為PB或Json串。(存在由bean到SolrInputDocument轉化的類及annotation,以及各自的壓縮算法)
或者:插入HBase的數據均以Bytes.toBytes(String)類型存儲,如long型數值2存儲為Bytes.toBytes(""+2)。否則在postPut()中需要知道每列的具體類型才能生成正確的SolrInputDocument,因為SolrInputDocument中需要的是String類型的數據。
具體的postPut方法代碼,如有需要可以留言或直接跟本人聯系。http://www.cnblogs.com/wgp13x/
1.3 HBase與Solr系統架構設計
使用HBase搭建結構數據存儲云,用來存儲海量數據;使用SolrCloud集群用來搭建搜索引擎,將要查找的結構化數據的ID查找出來,只配置它存儲ID。
1、具體流程:
wd代表用戶write data寫數據,從用戶提交寫數據請求wd1開始,經歷wd2,寫入MySQL數據庫,或寫入結構數據存儲云中,wd3,提交到Solr集群中,從而依據業務需求創建索引。
rd代表用戶read data讀數據,從用戶提交讀數據請求rd1開始,經歷rd2,直接讀取MySQL中數據,或向Solr集群請求搜索服務,rd3,向Solr集群請求得到的搜索結果為ID,再向結構數據存儲云中通過ID取出數據,最后返回給用戶結果。