使用solr构建hbase二级索引
使用solr構建hbase二級索引
@(HBASE)[hbase, solr]
- 使用solr構建hbase二級索引
- 一概述
- 一業務場景描述
- 二技術方案
- 1技術方案一
- 2技術方案二
- 3關于索引的建議
- 二使用hbase-indexer構建hbase二級索引
- 一 安裝環境準備
- 二 配置solr
- 三 配置hbase-solr
- 四測試
- 1hbase中創建測試表
- 2添加配置文件用于將solr中的field映射為hbase中的qualifier
- 3添加索引
- 4搜索
- 五使用solrJ搜素
- 三使用coprocessor構建hbase二級索引
- 見另一篇文章
一、概述
正常情況下,hbase適合用于根據rowkey取得一個value的應用場景,但如果是反過來的需求,如根據value值搜索有哪些rowkey滿足這個條件,類似于RDBMS的操作,則不是hbase擅長的領域,因為這會導致全表掃描。
(一)業務場景描述
有一些數據記錄了用戶的一些行為,比如是否玩過某款游戲,是否買過某本書,是否看過某個視頻等。現在需要查詢以下內容:
(1)根據用戶+標簽作為查詢條件,查詢用戶是否存在這個標簽。這個標簽可能是一個視頻名稱。
(2)根據用戶查詢該用戶的所有標簽。
(3)根據標簽條件,搜索符合某些標簽條件的用戶。
前2個應用場景需要實時快速查詢,最后一個場景可以離線查詢。
這是最典型的應用。其中前2個場景一般用于向用戶推薦商品,而第3個場景是搜索符合某些條件的用戶,然后進行廣告投放。
即:
(1)為用戶推薦時根據用戶id獲取用戶的信息,然后進行推薦,由于已經確認rowkey,此時進行hbase get操作是非常高效的。
(2)進行廣告投放時,先根據某些條件搜索hbase中的value值,得出符合條件的rowkey,然后進行投放。如果不是所有信息索引的話,還需要根據rowkey回hbase取出完整的用戶信息。
(二)技術方案
1、技術方案一
方案描述:由于應用場景1是最常用的場景,即判斷用戶的某個標簽是否存在。將用戶信息+標簽作為rowkey,這可以最快速的進行查詢。對于場景2可以通過Scan#setRowPrefixFilter(用戶id)來獲取某個用戶的所有標簽。對于場景3,將通過把hbase信息索引到solr,然后搜索某些符合標簽條件的所有用戶。
問題:為了將hbase中的內容添加至索引,需要將標簽名稱也作為內容保存到qualifier的value中,這會導致信息的冗余。
2、技術方案二
方案:另一個方案是直接以用戶id作為rowkey,每個標簽作為一個qualifier。對于場景1和2都可以直接get就行了,對于場景3同樣通過solr作索引。
問題:但用戶標簽可能很多,過百萬、千萬,有可能一行超過HFILE大小(默認10G,雖然可能性很小)。另外就是即使對于應用場景1,也需要將整行讀取出來,再選取其中的部分內容,這會將大量無用信息讀取到內存,很容易觸發GC。還有就是這種情形下將以標簽作為qualifier,這個標簽的名稱是無法事先確定的,而solr與hbase的結合只能以cf:qulifier與solr的一個Field作映射(當然這可以通過自己開發模塊去將整個cf索引,但這需要較多的人力。不存在這個問題了,已經可以索引整個cf)
建議:如果標簽類別數量較少,比如1000以內,則可以使用本方案,此時上面所述的三個問題都不存在了。而且這是一個比較典型的用戶畫像應用,建議通過歸類、聚類等算法更好控制標簽的數量。大量的推薦、廣告投放等應用均是使用類似的架構。缺點是信息經過整合后會丟失細節,但這部分數據可以保存在hdfs中,以備隨時重新提取有效信息。
3、關于索引的建議
(1)【強烈不建議】如果直接使用hbase來查詢,不管是否加上filter,這必需要進行全表Scan,雖然可以使用離線分析,但也會導致hbase需要將全表數據加載到內存,從而頻繁GC,導致集群負載過高。
(2)【可測試,無需引入solr,但性能待定】另一方式是為hbase表建倒排索引,重新索引回hbase中,以標簽作rowkey,以用戶id作值。此表可專用于應用場景3。
(3)【可測試,自由度高,最靈活,但工作量較大】使用coprocessor將數據索引至solr。
(4)【可測試】使用solr-index等開源工具將數據索引至solr。
CDH有一個hbase-solr的模塊,它是基于開源項目hbase-indexer的。問題是hbase-indexer基于0.94與0.98的,不清楚cdh是否有改進,沒文檔說明。但一般而言,它與CDH5.6同時發布,應該是不存在兼容性問題的。
二、使用hbase-indexer構建hbase二級索引
以下介紹如何使用hbase-indexer將hbase中的數據同步索引至solr中。
其基本原理是根據hbase的log來將操作重寫在solr中執行一次。
(一) 安裝環境準備
本文在現有的集群環境上進行部署,jdk版本選用1.7,其中hbase集群使用的版本為hbase-1.0.0-cdh5.6.0
solr與hbase整合需要的軟件如下:
- 1、solr-4.10.3-cdh5.6.0
- 2、hbase-solr-1.5-cdh5.6.0
(二) 配置solr
將solr解壓,cd到exampe目錄下,使用solrCloud模式在每臺節點上執行:
java -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DzkHost={zk_host}/solr -jar start.jar即可啟動solr,上面命令會將solr中的配置文件上傳到zk中,供集群其他節點讀取使用。
其中,conf目錄下有collection1的配置文件,主要有兩個可能需要修改的文件:
① schema.xml文件
② solrconfig.xml文件
其中,在schema.xml文件中,可以定義一些自己的field, fieldType,分詞器,copyField
solrconfig.xml文件中對應對索引進行一些通用設置,比如設置軟、硬提交
啟動之后,可以訪問http://{your_host}:8983/solr/,進入solr查詢頁面。
(三) 配置hbase-solr
解壓habse-solr之后,需要做一些配置,才能使用,否則啟動出錯。
(1)修改conf/hbase-indexer-site.xml文件,添加內容如下:
<property><name>hbaseindexer.zookeeper.connectstring</name><value>zookeeperhost</value> </property> <property><name>hbase.zookeeper.quorum</name><value>zookeeperhost</value> </property>(2)配置hbase,開啟habse的replication功能,在hbase的hbase-site.xml文件中,修改內容如下:
<!-- added by hwyn3816 on 2016/07/04 --><property><name>hbase.replication</name><value>true</value><description>SEP is basically replication, so enable it</description></property><property><name>replication.source.ratio</name><value>1.0</value><description>Source ratio of 100% makes sure that each SEP consumer is actually used (otherwise, some can sit idle, especially with small clusters)</description></property><property><name>replication.source.nb.capacity</name><value>1000</value><description>Maximum number of hlog entries to replicate in one go. If this is large, and a consumer takes a while to process the events, the HBase rpc call will time out.</description></property><property><name>replication.replicationsource.implementation</name><value>com.ngdata.sep.impl.SepReplicationSource</value><description>A custom replication source that fixes a few things and adds some functionality (doesn't interfere with normal replication usage).</description></property>(3)復制一些額外的jar到habse中的lib目錄下,
cp lib/hbase-sep-* $HBASE_HOME/lib(4)重啟hbase集群,使得配置生效,執行:
cd ${HBASE_HOME} bin/rolling-restart.sh(5)啟動habse-index服務
bin/hbase-indexer server(四)測試
1、hbase中創建測試表
$ hbase shell hbase> create 'indexdemo-user', { NAME => 'info', REPLICATION_SCOPE => '1' }# 在表中添加一些數據 hbase> put 'indexdemo-user', 'row1', 'info:firstname', 'John' hbase> put 'indexdemo-user', 'row1', 'info:lastname', 'Smith'2、添加配置文件,用于將solr中的field映射為hbase中的qualifier
<?xml version="1.0"?> <indexer table="indexdemo-user"><field name="firstname_s" value="info:firstname"/><field name="lastname_s" value="info:lastname"/><field name="age_i" value="info:age" type="int"/> </indexer>注意,上面兩個字段名,還需要在solr的schema.xml文件事先定義,才能使用。
3、添加索引
定義好上面文件后,在solr-hbase中創建indexer,執行:
./bin/hbase-indexer add-indexer -n myindexer -c indexdemo-indexer.xml \-cp solr.zk={zk_host}/solr -cp solr.collection=collection1 -z {zk_host}4、搜索
執行完成后,如果沒有出錯,就可以去solr查詢頁面中,查詢到已經對habse定義的字段數據進行了索引:
{"responseHeader": {"status": 0,"QTime": 1,"params": {"indent": "true","q": "*:*","_": "1467685845733","wt": "json"}},"response": {"numFound": 3,"start": 0,"docs": [{"firstname_s": "hwyn3816","lastname_s": "huanghe","id": "row1","_version_": 1538978729496150000},{"firstname_s": "John","lastname_s": "Smith","id": "row2","_version_": 1538978814854430700},{"firstname_s": "John","lastname_s": "Smith","id": "row3","_version_": 1538979512969068500}]} }(五)使用solrJ搜素
三、使用coprocessor構建hbase二級索引
見另一篇文章
總結
以上是生活随笔為你收集整理的使用solr构建hbase二级索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: solr配置文件
- 下一篇: hbase获取region以及读取每个r