1. 程式人生 > >solr-hbase二級索引及查詢解決方案(一)

solr-hbase二級索引及查詢解決方案(一)

最近要搞一個查詢功能,是把hbase中的資料方便的查詢出來.之前根據rowkey的查詢方式,儘管有針對性設計過rowkey,有字首查詢,字尾查詢,以及正則查詢,但是實際上不夠用.
參考了網路上的設計,建立二級索引是比較好的思路.於是就以solr儲存hbase裡面的列索引,實現了這個功能.

需要的元件有:
1.hbase
2.solr
3.key-value store indexer
4.CDH
5.zookeeper
6.hadoop
key-value store indexer 是一個基於hbase的replication特性而實現的能夠動態的將hbase的二級索引同步給solr的元件,並且可以批量匯入索引,增量同步索引,同步時延比較小,幾乎近實時.

需要的元件看起來有些多,由於我們本來是用CDH管理元件,所以這裡也是在CDH中搭建環境的.當然,單獨安裝元件也可以,不過容易出錯,本人之前單獨安裝配置了solr,卻感覺接下來無從下手,喜歡動手的可以一試.

在CDH中安裝好以上環境.具體安裝配置,方式,CDH有介紹.

7.cdh安裝solr叢集

8.安裝key-value store indexer 叢集

這裡的叢集,hadoop,hbase用了4臺機器,其它的都用了3臺機器,機器數量不一致,但是zookeeper,solr機器數量最好一致,因為zookeeper叢集數量在2n+1時最為穩定.

SOLR-HBASE-INDEXER安裝

1.cdh安裝solr叢集
solr的java heap記憶體配置改成1G.

2.安裝key-value store indexer 叢集

3.Hbase表需要開啟REPLICATION複製功能

    create 'table',{NAME => 'info', REPLICATION_SCOPE => 1}

其中1表示開啟replication功能,0表示不開啟,預設為0

4.對於已經建立的表可以使用如下命令

    disable 'table' alter 'table',{NAME => 'info', REPLICATION_SCOPE => 1
} enable 'table'

5.生成實體配置檔案, /testhbase/cdhsolr/testIndex是自定義路徑,可以自己設定

    solrctl instancedir --generate /testhbase/cdhsolr/testIndex

6.編輯生成好的scheme.xml檔案

把hbase表中需要索引的列新增到scheme.xml filed節點,其中的name屬性值要與Morphline.conf檔案中的outputField屬性值對應

<field name="COL1" type="string" indexed="true" stored="true" multiValued="false" required="true"/>

   <field name="COL2" type="string" indexed="true" stored="true" multiValued="false" required="true"/>

修改solrconfig.xml 檔案中autoCommit. 這裡還可以調整同步間隔,比如把60000改成120000.

    <autoCommit> 
       <maxTime>${solr.autoCommit.maxTime:60000}</maxTime> 
       <openSearcher>true</openSearcher> 
     </autoCommit>

7.建立collection例項並配置檔案上傳到zookeeper,命令

    solrctl instancedir --create testIndex /testhbase/cdhsolr/testIndex

8.上傳到zookeeper之後,其他節點就可以從zookeeper下載配置檔案。接下來建立collection,命令:可指定分片數和副本數量

    solrctl collection --create testIndex -s 3 -r 3 -m 50

9.在Hbase-solr的安裝目錄(cdh目錄下面)下,建立Lily HBase Indexer配置檔案morphline-hbase-mapper.xml

vi /testhbase/cdhsolr/testIndex/conf/hbase-indexer/morphline-hbase-mapper.xml

morphline-hbase-mapper.xml檔案內容:

<?xml version="1.0" encoding="UTF-8"?>
<indexer table="solr_test_table" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">
 <param name="morphlineFile" value="morphlines.conf"></param>
 <param name="morphlineId" value="testIndexMap"></param>
</indexer>

其中morphlineId 的value是對應Key-Value Store Indexer 中配置檔案Morphlines.conf 中morphlines 屬性id值
Morphlines.conf 檔案配置,下文有說明.

mkdir /testhbase/cdhsolr/testIndex/conf/hbase-indexer
    cp /testhbase/cdhsolr/hbase-indexer/morphline-hbase-mapper.xml /testhbase/cdhsolr/testIndex/conf/hbase-indexer/morphline-hbase-mapper.xml

10.修改Morphlines 檔案, 具體操作:進入Key-Value Store Indexer面板->配置->檢視和編輯->屬性-Morphline檔案,
這裡寫圖片描述

inputColumn:Hbase的CLOUMN

outputField:Solr的Schema.XML配置的fields

morphlines : [
{
id :testIndexMap
importCommands : ["org.kitesdk.**", "com.ngdata.**"]

commands : [                    
  {
    extractHBaseCells {
    mappings : [
    {
      inputColumn : "info:COL1"
      outputField : "COL1" 
      type : string 
      source : value
    },
   {
      inputColumn : "info:COL2"
      outputField : "COL2" 
      type : string 
      source : value
    }
  ]
}
  }
  { logDebug { format : "output record: {}", args : ["@{}"] } }
]
}
]

11.註冊Lily HBase Indexer configuration 和 Lily Hbase Indexer Service

    hbase-indexer add-indexer \
    --name testIndex \
    --indexer-conf /testhbase/cdhsolr/testIndex/conf/hbase-indexer/morphline-hbase-mapper.xml \
    --connection-param solr.zk=c2:2181,c3:2181,c4:2181/solr \
    --connection-param solr.collection=testIndex \
    --zookeeper c2:2181,c3:2181,c4:2181

12.驗證索引器是否成功建立

    hbase-indexer list-indexers

如果出現下圖所示,則表示索引建立成功.
這裡寫圖片描述

13.測試put資料檢視結果

當寫入資料後,稍過幾秒我們可以在相對於的solr中查詢到該插入的資料,表明配置已經成功

    put 'solr_test_table','r1','info:COL1','123456'

14.使用IK分詞器(這裡我下了一個solr5以上版本適用的IK jar包)

在/home/parcels/CDH/lib/solr/webapps/solr/WEB-INF建立classes目錄

把IKAnalyzer.cfg.xml 和 stopword.dic新增到classes目錄

把IKAnalyzer2012FF_u1.jar新增到/opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib目錄

在Schema.xml中新增

<!--配置IK分詞器-->

 <fieldType name="text_ik" class="solr.TextField">

        <!--索引時候的分詞器-->

        <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>

        <!--查詢時候的分詞器-->
        <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

配置好後,更新ZK配置檔案,重啟solr服務

15.擴充套件命令

Scheme.xml新增索引欄位

執行以下命令更新配置:

solrctl instancedir --update testIndex /testhbase/cdhsolr/testIndex

solrctl collection --reload testIndex
hbase-indexer update-indexer -n testIndex

新增多個索引器

當你需要建立多個索引時,可以按下面說明操作。

一個solr 索引對應一個collection,一個collection對一個morphline-hbase-mapper.xml和Morphlines.conf。當需要配置多個索引時,在Morphlines.conf的morphlines節點新增對應索引模組,以id區分,如下面程式碼模組:

morphlines : [
{
id :testIndexMap
importCommands : [“org.kitesdk.“, “com.ngdata.“]

commands : [
{

extractHBaseCells {
mappings : [
{
inputColumn : “info:COL1”
outputField : “COL1”
type : string
source : value
},
{
inputColumn : “info:COL2”
outputField : “COL2”
type : string
source : value
}

]
}
}
{ logDebug { format : “output record: {}”, args : [“@{}”] } }
]
},
{
id :testIndexMap2
importCommands : [“org.kitesdk.“, “com.ngdata.“]

commands : [
{

extractHBaseCells {
mappings : [
{
inputColumn : “info2:COL1”
outputField : “COL1”
type : string
source : value
},
{
inputColumn : “info2:COL2”
outputField : “COL2”
type : string
source : value
}

]
}
}
{ logDebug { format : “output record: {}”, args : [“@{}”] } }
]
}
]

16.Hbase表資料到SOLR叢集遷移

在CDH5.3.2中Hbase-indexer提供了MapReduce來批量構建索引的方式,該MapReduce封裝在如下jar包中,只需用命令列執行:

/home/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.3.2-job.jar

如果對一個已經存在資料的hbase表做了索引,會發現只記錄了後面插入的資料,已經存在的資料沒有索引。那麼就要將之前的資料的索引同步上。

運行同步命令需要在有morphlines.conf檔案的目錄進行。在hbase的master節點上,執行命令:

find / | grep morphlines.conf$

進入最新的那個process目錄/run/cloudera-scm-agent/process/345-ks_indexer-HBASE_INDEXER,本人是在solrcloud 的leader core所在節點上操作,當然最好找最新的process. ks_indexer-HBASE_INDEXER 前面的數字最大,表示最新.

(如果想不進入目錄執行,則在命令中加上 –morphline-file /run/cloudera-scm-agent/process/345-ks_indexer-HBASE_INDEXER/morphlines.conf,來指定目錄所在位置 )

在進入的目錄中,將morphlines.conf檔案拷到該目錄.

執行命令:

hadoop --config /etc/hadoop/conf \
jar /home/parcels/CDH-5.12.0-1.cdh5.12.0.p0.29/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.12.0-job.jar \
--conf /etc/hbase/conf/hbase-site.xml \
--hbase-indexer-file /testhbase/cdhsolr/testIndex/conf/hbase-indexer/morphline-hbase-mapper.xml \
--zk-host c2:2181,c3:2181,c4:2181/solr \
--collection testIndex \
--reducers 0 \
--go-live

等待完成,這樣,hbase中的資料的二級索引就批量導進solr中.

17.解除安裝索引

solr刪除索引,一般只能一條一條的刪,當然可以寫程式批量刪除.
如果是刪除建立的testIndex索引,刪除步驟:

hbase-indexer delete-indexer -n testIndex

solrctl collection --delete testIndex

solrctl collection --list

solrctl instancedir --delete testIndex

solrctl instancedir --list

刪除hadoop上core目錄:

export HADOOP_USER_NAME=solr

hdfs dfs -rm -r /solr/*

清空回收站:

hdfs dfs -expunge

刪除索引物理目錄:

rm -rf /testhbase/cdhsolr/testIndex

以上操作是必須項.
有必要的時候,還要清理zookeeper上和solr有關(/solr),和indexer有關(/ngdata),和hbase有關(/hbase)

清理/var/lib/solr中建立的core目錄下面的與indexer配置相關的檔案

重啟solr-server服務,重啟Lily hbase indexer服務.

18.報錯解決思路.
執行17步驟的流程,能解決大部分錯誤.除此之外,可以刪除/tmp中跟solr有關檔案,/home/yarn/userCache中跟solr有關檔案, solr分片所在目錄中的檔案,總之,儘量先清除solr的殘餘快取,core檔案,再重啟solr,Lily hbase indexer等服務.

相關推薦

solr-hbase二級索引查詢解決方案()

最近要搞一個查詢功能,是把hbase中的資料方便的查詢出來.之前根據rowkey的查詢方式,儘管有針對性設計過rowkey,有字首查詢,字尾查詢,以及正則查詢,但是實際上不夠用. 參考了網路上的設計,建立二級索引是比較好的思路.於是就以solr儲存hbase

Hbase二級索引方案Solr key value index

概述 在Hbase中,表的RowKey 按照字典排序, Region按照RowKey設定split point進行shard,通過這種方式實現的全域性、分散式索引. 成為了其成功的最大的砝碼。 然而單一的通過RowKey檢索資料的方式,不再滿足更多的需求,查詢成為Hb

HBase建立二級索引的一些解決方式

ack sca for done pseudo 100% hide shm range HBase的一級索引就是rowkey,我們僅僅能通過rowkey進行檢索。假設我們相對hbase裏面列族的列列進行一些組合查詢。就須要採用HBase的二級索引方案來進

mysql慢查詢原因分析與解決(三)——索引查詢優化

索引的型別 Ø 普通索引:這是最基本的索引型別,沒唯一性之類的限制。 Ø 唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性。 Ø 主鍵:主鍵是一種唯一索引,但必須指定為”PRIMARY KEY”。 Ø 全文索引:MYSQL從3.23.23開始支援全

基於SolrHbase二級索引

關於Hbase二級索引 HBase 是一個列存資料庫,每行資料只有一個主鍵RowKey,無法依據指定列的資料進行檢索。查詢時需要通過RowKey進行檢索,然後檢視指定列的資料是什麼,效率低下。在實際應用中,我們經常需要根據指定列進行檢索,或者幾個列進行組合檢索,這就提出

Hbase二級索引索引海量資料實現方案

方案1:使用開源的hbase-indexer,是藉助於hbase的WAL實現,不會影響hbase效能            https://blog.csdn.net/xiahoujie_90/article/details/53400044方案2:基於ES自己實現,利用ha

CDH HBASE使用solr建立二級索引,更新刪除索引

關於為什麼要建立hbase二級索引,這裡不再贅述,直接開始安裝配置 1.環境準備           ①安裝HBASE,solr,Key-Value Store Indexer,這些在CDH

AppBoxFuture: 二級索引索引掃描查詢資料

  資料庫索引對於資料查詢的重要性不可言喻,因此作者在儲存層實現了二級索引,以及利用索引進行掃描的功能。目前僅實現了分割槽表與非分割槽表的本地索引(資料與索引共用一個Raft組管理),全域性索引及反向索引待以後再實現。 一、儲存結構:   在介紹索引前先了解一下資料與索引是以何種結構儲存於RocksDB內的,

MySQL索引查詢優化總結

存儲 一行 -1 type 一定的 關鍵技術 表示 智能 string類型 一個簡單的對比測試 前面的案例中,c2c_zwdb.t_file_count表只有一個自增id,FFileName字段未加索引的sql執行情況如下: 在上圖中,type=all,key=nul

hbase二級索引構建

tables required family create tab ice converts length strong 參考學習hbase源代碼中的二級索引構建代碼 IndexBuilder.java /** * * Licensed to the Apache

移動端二三事【二】:移動端觸摸事件點透多種解決方案

優化 提前 sta 屬性 lis 剛才 觸摸事件 功能 觸發 大家都知道的少說,多分享一些幹貨。 一、首先說移動端的三大主要事件: 1.手指按下: ontouchstart2.手指移動:ontouchmove3.手指擡起 ontouchend *使用移動端事件時,為盡

keepalived 高可用問題企業解決方案實戰

gin 實現 gre keepalive then shel 接管 問題 方案 keepalived 實現服務器級別的接管,比如nginx 宕機了 不會接管,可以寫shell 腳本實現,當nginx 掛了,把keepalived 停掉while truedo if [ ‘p

linux rz上傳文件出錯解決方案

不同 都沒有 fff sca 控制字符 secure 大小 ctrl+ asc 在把Windows上的文件傳至Linux端時用到SecureCRT,一般小文件都沒有問題,文件太大時則出現了上傳後的文件只有幾K大小,當然大於2個G的是不可能傳的上去的了。對於幾百M到1G多的大

Redis 中哨兵sentinel 機制、從宕機恢復、主庫宕機恢復解決方案

目錄 什麼是哨兵 原理 環境 設定哨兵 從宕機及恢復 主宕機及恢復 配置多個哨兵 1、什麼是哨兵 哨兵是對Redis的系統的執行情況的監控,它是一個獨立程序,功能有二個: 監控主資料庫和從資料庫是否執行正常; 主資料出現故障後

解析微服務架構(二):微服務重構應用IBM解決方案

解析微服務架構系列文章將分幾篇描述微服務的定義、特點、應用場景、企業整合架構的演進以及微服務轉型思路和技術決策考慮等內容,並以IBM技術為例介紹如何實現微服務架構轉型。 上一篇文章介紹了融入微服務的企業整合架構的演進,並介紹互動式系統的微服務模式及技術決策例子。 本篇文章將介紹已有IT應用如

Hbase二級索引+CDH+Lily

1.更改表結構,允許複製 已存在的表 disable 'tableName' alter 'tableName',{NAME =>'fn', REPLICATION_SCOPE =>1} enable 'tableName' 不存在的表 create ‘table‘,{N

Redis熱點Key發現常見解決方案

熱點Key問題產生的原因大致有以下兩種: 1、使用者消費的資料遠大於生產的資料(熱賣商品、熱點新聞、熱點評論、明星直播)。 在日常工作生活中一些突發的的事件,例如:雙十一期間某些熱門商品的降價促銷,當這其中的某一件商品被數萬次點選瀏覽或者購買時,會形成一個較大的需求量,這種情況下就會造成熱點

Redis熱點Key發現常見解決方案

一、熱點Key問題產生的原因 1、使用者消費的資料遠大於生產的資料(熱賣商品、熱點新聞、熱點評論、明星直播)。 在日常工作生活中一些突發的的事件,例如:雙十一期間某些熱門商品的降價促銷,當這其中的某一件商品被數萬次點選瀏覽或者購買時,會形成一個較大的需求量,這種情況下就會造成熱點問題。

android螢幕適配問題分析各種解決方案優缺點分析

序 從事android開發已有5年之久,專案中遇到的螢幕適配的問題也有n次了,可是有一個很奇怪也很讓人頭疼的現象讓從事多年開發的我很不爽。什麼問題呢,就是“適配虐我千萬遍,我見適配如初見”,真是想說一句fuck,這次我終於堅決的征服掉了她,下面就來具體講解征服她的全過程,一定要

理解跨域常用解決方案

跨域,相信大家無論是在工作中還是在面試中經常遇到這個問題,常常在網上看到別人所整理的一些方法,看似知道是怎麼回事,但如果沒有動手實踐過,總覺得自己沒有真正的掌握,在這裡,通過自己認真思考整理一些常用的方法。 跨域的產生 不用多講,作為一名前端開發人員,相信大家都知道跨域是因為瀏覽器的同源策略所導致的