使用solr构建hbase二级索引
使用solr構(gòu)建hbase二級索引
@(HBASE)[hbase, solr]
- 使用solr構(gòu)建hbase二級索引
- 一概述
- 一業(yè)務(wù)場景描述
- 二技術(shù)方案
- 1技術(shù)方案一
- 2技術(shù)方案二
- 3關(guān)于索引的建議
- 二使用hbase-indexer構(gòu)建hbase二級索引
- 一 安裝環(huán)境準(zhǔn)備
- 二 配置solr
- 三 配置hbase-solr
- 四測試
- 1hbase中創(chuàng)建測試表
- 2添加配置文件用于將solr中的field映射為hbase中的qualifier
- 3添加索引
- 4搜索
- 五使用solrJ搜素
- 三使用coprocessor構(gòu)建hbase二級索引
- 見另一篇文章
一、概述
正常情況下,hbase適合用于根據(jù)rowkey取得一個(gè)value的應(yīng)用場景,但如果是反過來的需求,如根據(jù)value值搜索有哪些rowkey滿足這個(gè)條件,類似于RDBMS的操作,則不是hbase擅長的領(lǐng)域,因?yàn)檫@會(huì)導(dǎo)致全表掃描。
(一)業(yè)務(wù)場景描述
有一些數(shù)據(jù)記錄了用戶的一些行為,比如是否玩過某款游戲,是否買過某本書,是否看過某個(gè)視頻等。現(xiàn)在需要查詢以下內(nèi)容:
(1)根據(jù)用戶+標(biāo)簽作為查詢條件,查詢用戶是否存在這個(gè)標(biāo)簽。這個(gè)標(biāo)簽可能是一個(gè)視頻名稱。
(2)根據(jù)用戶查詢該用戶的所有標(biāo)簽。
(3)根據(jù)標(biāo)簽條件,搜索符合某些標(biāo)簽條件的用戶。
前2個(gè)應(yīng)用場景需要實(shí)時(shí)快速查詢,最后一個(gè)場景可以離線查詢。
這是最典型的應(yīng)用。其中前2個(gè)場景一般用于向用戶推薦商品,而第3個(gè)場景是搜索符合某些條件的用戶,然后進(jìn)行廣告投放。
即:
(1)為用戶推薦時(shí)根據(jù)用戶id獲取用戶的信息,然后進(jìn)行推薦,由于已經(jīng)確認(rèn)rowkey,此時(shí)進(jìn)行hbase get操作是非常高效的。
(2)進(jìn)行廣告投放時(shí),先根據(jù)某些條件搜索hbase中的value值,得出符合條件的rowkey,然后進(jìn)行投放。如果不是所有信息索引的話,還需要根據(jù)rowkey回hbase取出完整的用戶信息。
(二)技術(shù)方案
1、技術(shù)方案一
方案描述:由于應(yīng)用場景1是最常用的場景,即判斷用戶的某個(gè)標(biāo)簽是否存在。將用戶信息+標(biāo)簽作為rowkey,這可以最快速的進(jìn)行查詢。對于場景2可以通過Scan#setRowPrefixFilter(用戶id)來獲取某個(gè)用戶的所有標(biāo)簽。對于場景3,將通過把hbase信息索引到solr,然后搜索某些符合標(biāo)簽條件的所有用戶。
問題:為了將hbase中的內(nèi)容添加至索引,需要將標(biāo)簽名稱也作為內(nèi)容保存到qualifier的value中,這會(huì)導(dǎo)致信息的冗余。
2、技術(shù)方案二
方案:另一個(gè)方案是直接以用戶id作為rowkey,每個(gè)標(biāo)簽作為一個(gè)qualifier。對于場景1和2都可以直接get就行了,對于場景3同樣通過solr作索引。
問題:但用戶標(biāo)簽可能很多,過百萬、千萬,有可能一行超過HFILE大小(默認(rèn)10G,雖然可能性很小)。另外就是即使對于應(yīng)用場景1,也需要將整行讀取出來,再選取其中的部分內(nèi)容,這會(huì)將大量無用信息讀取到內(nèi)存,很容易觸發(fā)GC。還有就是這種情形下將以標(biāo)簽作為qualifier,這個(gè)標(biāo)簽的名稱是無法事先確定的,而solr與hbase的結(jié)合只能以cf:qulifier與solr的一個(gè)Field作映射(當(dāng)然這可以通過自己開發(fā)模塊去將整個(gè)cf索引,但這需要較多的人力。不存在這個(gè)問題了,已經(jīng)可以索引整個(gè)cf)
建議:如果標(biāo)簽類別數(shù)量較少,比如1000以內(nèi),則可以使用本方案,此時(shí)上面所述的三個(gè)問題都不存在了。而且這是一個(gè)比較典型的用戶畫像應(yīng)用,建議通過歸類、聚類等算法更好控制標(biāo)簽的數(shù)量。大量的推薦、廣告投放等應(yīng)用均是使用類似的架構(gòu)。缺點(diǎn)是信息經(jīng)過整合后會(huì)丟失細(xì)節(jié),但這部分?jǐn)?shù)據(jù)可以保存在hdfs中,以備隨時(shí)重新提取有效信息。
3、關(guān)于索引的建議
(1)【強(qiáng)烈不建議】如果直接使用hbase來查詢,不管是否加上filter,這必需要進(jìn)行全表Scan,雖然可以使用離線分析,但也會(huì)導(dǎo)致hbase需要將全表數(shù)據(jù)加載到內(nèi)存,從而頻繁GC,導(dǎo)致集群負(fù)載過高。
(2)【可測試,無需引入solr,但性能待定】另一方式是為hbase表建倒排索引,重新索引回hbase中,以標(biāo)簽作rowkey,以用戶id作值。此表可專用于應(yīng)用場景3。
(3)【可測試,自由度高,最靈活,但工作量較大】使用coprocessor將數(shù)據(jù)索引至solr。
(4)【可測試】使用solr-index等開源工具將數(shù)據(jù)索引至solr。
CDH有一個(gè)hbase-solr的模塊,它是基于開源項(xiàng)目hbase-indexer的。問題是hbase-indexer基于0.94與0.98的,不清楚cdh是否有改進(jìn),沒文檔說明。但一般而言,它與CDH5.6同時(shí)發(fā)布,應(yīng)該是不存在兼容性問題的。
二、使用hbase-indexer構(gòu)建hbase二級索引
以下介紹如何使用hbase-indexer將hbase中的數(shù)據(jù)同步索引至solr中。
其基本原理是根據(jù)hbase的log來將操作重寫在solr中執(zhí)行一次。
(一) 安裝環(huán)境準(zhǔn)備
本文在現(xiàn)有的集群環(huán)境上進(jìn)行部署,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模式在每臺(tái)節(jié)點(diǎn)上執(zhí)行:
java -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DzkHost={zk_host}/solr -jar start.jar即可啟動(dòng)solr,上面命令會(huì)將solr中的配置文件上傳到zk中,供集群其他節(jié)點(diǎn)讀取使用。
其中,conf目錄下有collection1的配置文件,主要有兩個(gè)可能需要修改的文件:
① schema.xml文件
② solrconfig.xml文件
其中,在schema.xml文件中,可以定義一些自己的field, fieldType,分詞器,copyField
solrconfig.xml文件中對應(yīng)對索引進(jìn)行一些通用設(shè)置,比如設(shè)置軟、硬提交
啟動(dòng)之后,可以訪問http://{your_host}:8983/solr/,進(jìn)入solr查詢頁面。
(三) 配置hbase-solr
解壓habse-solr之后,需要做一些配置,才能使用,否則啟動(dòng)出錯(cuò)。
(1)修改conf/hbase-indexer-site.xml文件,添加內(nèi)容如下:
<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文件中,修改內(nèi)容如下:
<!-- 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)復(fù)制一些額外的jar到habse中的lib目錄下,
cp lib/hbase-sep-* $HBASE_HOME/lib(4)重啟hbase集群,使得配置生效,執(zhí)行:
cd ${HBASE_HOME} bin/rolling-restart.sh(5)啟動(dòng)habse-index服務(wù)
bin/hbase-indexer server(四)測試
1、hbase中創(chuàng)建測試表
$ hbase shell hbase> create 'indexdemo-user', { NAME => 'info', REPLICATION_SCOPE => '1' }# 在表中添加一些數(shù)據(jù) 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>注意,上面兩個(gè)字段名,還需要在solr的schema.xml文件事先定義,才能使用。
3、添加索引
定義好上面文件后,在solr-hbase中創(chuàng)建indexer,執(zhí)行:
./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、搜索
執(zhí)行完成后,如果沒有出錯(cuò),就可以去solr查詢頁面中,查詢到已經(jīng)對habse定義的字段數(shù)據(jù)進(jìn)行了索引:
{"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構(gòu)建hbase二級索引
見另一篇文章
總結(jié)
以上是生活随笔為你收集整理的使用solr构建hbase二级索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: solr配置文件
- 下一篇: hbase获取region以及读取每个r