日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用solr构建hbase二级索引

發(fā)布時(shí)間:2024/1/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用solr构建hbase二级索引 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。