1. 程式人生 > >CDH HBASE使用solr建立二級索引,更新刪除索引

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

關於為什麼要建立hbase二級索引,這裡不再贅述,直接開始安裝配置 1.環境準備           ①安裝HBASE,solr,Key-Value Store Indexer,這些在CDH的服務裡面都有             ②進入CM HBASE配置頁面,打開復制和編制索引: 2. 建表              首先,在HBASE SHELL建立一張表如下:      hbase(main):024:0> create 'test3',{NAME=>'c1',REPLICATION_SCOPE => '1'}                           如果表已經存在,則使用如下來更改表:
disable '表名' alter '表名',{NAME =>'列族名', REPLICATION_SCOPE =>1} enable '表名' 3.建立相應的SolrCloud集合              注意要在安裝有solr的節點執行,可在CM中檢視solr例項,確定solr節點              ①生成實體配置檔案:     [[email protected] ~]# solrctl instancedir --generate $HOME/hbase-indexer/test3                     注: I. 要知道命令如何使用,比如solrctl命令,可以直接鍵入solrctl,回車,可以看到幫助。然後再鍵入solrctl instancedir,
                            回車,即可知道子命令如何使用。下面將要使用的命令也依此類推,即可知道用法。                            II. --generate 後的路徑由自己指定。               ②命令完成後會在指定的路徑下生成目錄,目錄下有個子目錄conf,修改conf中的schema.xml,在最後新增一個節點如下: <field name="test3name" type="string" indexed="true" stored="true" />             屬性解析:name:這裡的name是自定義,但是後面要使用到,要和後面的
Morphline.conf檔案中的outputField屬性
                                              對應。                                 type:欄位型別                                 indexed:是否建立索引                                 stored:是否儲存 ③修改 solrconfig.xml,找到下面的配置片段,將false改為true,這個是硬提交,會影響效能 <autoCommit>        <maxTime>${solr.autoCommit.maxTime:60000}</maxTime>        <openSearcher>true</openSearcher>      </autoCommit>                 ④上傳配置檔案到zookeeper。 solrctl instancedir --create test3 $HOME/hbase-indexer/test3                         注:命令如何使用參照上面說的方法。                               --create 後接name,此name自定義,它決定在zookeeper上儲存的目錄名,接下來要建立的collection名,在索引建立完成後在solr web頁面上看到的core selector名。如果已經存在,會有提示,或更新,或改名                               name後是配置的路徑,即剛才solrctl instancedir --generate所自定義的路徑                 ⑤上傳後,zk會自己同步配置,然後建立collection,分單節點儲存檢索和多節點儲存檢索兩種情況,如下:             I.單節點情況下: solrctl collection --create test3         注:--create 後接name,此name必須和上一步的name一致,不然找不到配置檔案;                        II. 多節點情況下:如果希望將資料分散到各個節點進行儲存和檢索,則需要建立多個shard,需要使用如下命令,solr叢集共4個solrserver: solrctl collection --create test6 -s 7 -m 6 -r 3 -c test6 -a                     注:其中-s7個分片(shard),我的solrserver叢集共4個節點-r3個副本(replication),-c是指定zk上solr/configs節點下使用的配置檔名稱,-a是允許新增副本(必須寫,否則建立不了副本),-m 預設值是1,此處設為6,注意三個數值:numShards、replicationFactor、liveSolrNode,一個正常的solrCloud叢集不容許同一個liveSolrNode上部署同一個shard的多個replic,因此當maxShardsPerNode=1時,numShards*replicationFactor>liveSolrNode時,報錯。因此正確時因滿足以下條件: numShards*replicationFactor<=liveSolrNode*maxShardsPerNode,放在命令中,公式即: -m * 存活的solrserver節點數 >= -s * -r,含義:每個節點最大分片數*存活的solr節點 >= 分片數*副本數                         這樣分佈後,在soloweb頁面上可以直觀看到它們的分佈情況,以及這些引數產生的影響,如下:            當建立collection命令完成後,可以在solr 的web頁面上看到test3開頭的選擇器,只不過沒有資料。               ⑥建立 Lily HBase Indexer 配置                             在$HOME/hbase-indexer/test3目錄下,建立morphline-hbase-mapper.xml檔案,內容如下。 <?xml version="1.0"?>         <indexer table="test3" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">                 <param name="morphlineFile" value="morphlines.conf"/>                 <param name="morphlineId" value="test3Map"/>         </indexer>                         注:table屬性表示hbase中要建立索引的表  value="morphlines.conf",value用來指定morphlines.conf檔案的路徑,絕對或者相對路徑用來指定本地路徑,如果是使用Cloudera Manager來管理morphlines.conf就直接寫入值morphlines.conf value="test3Map",這裡test3Map是自定義,接下來要使用。其他的mapper,param name等屬性預設即可 4.配置Morphline 檔案         通過CM頁面進入到Key-Value Store Indexer的配置頁面,裡面有一個Morphlines檔案。修改它: SOLR_LOCATOR :{ # Name of solr collection #collection : bqjr # ZooKeeper ensemble zkHost :"$ZK_HOST" } morphlines :[ { id : test3Map importCommands :["org.kitesdk.**","com.ngdata.**"] commands :[ { extractHBaseCells { mappings :[ { inputColumn :"c1:name" outputField :"test3name" type :string source : value } ] } } { logDebug { format :"output record: {}", args :["@{}"]}} ] } ] 修改後,儲存,重啟Key-Value Store Indexer。             注: id:表示當前morphlines的名稱,與上一步的value="test3Map"要一致                     importCommands:需要引入的命令包地址                     extractHBaseCells:該命令用來讀取HBase列資料並寫入到SolrInputDocument物件中,該命令必須包含零個或者多個mappings命令物件。                 mappings:用來指定HBase列限定符的欄位對映。                 inputColumn:需要寫入到solr中的HBase列欄位。值包含列族和列限定符,並用‘ : ’分開。其中列限定符也可以使用萬用字元*來表示,譬如可以使用c1:*表示讀取只要列族為data的所有hbase列資料,也可以通過c1:na*來表示讀取列族為c1列限定符已na開頭的欄位值.                 outputField:用來表示morphline讀取的記錄需要輸出的資料欄位名稱,該名稱必須和solr中的schema.xml檔案的field節點自定義的name名稱保持一致,否則寫入不正確                 type:用來定義讀取HBase資料的資料型別,HBase中的資料都是以byte[]的形式儲存,但是所有的內容在Solr中索引為text形式,所以需要一個方法來把byte[]型別轉換為實際的資料型別。type引數的值就是用來做這件事情的。現在支援的資料型別有:byte,int,long,string,boolean,float,double,short和bigdecimal。當然你也可以指定自定的資料型別,只需要實現com.ngdata.hbaseindexer.parse.ByteArrayValueMapper介面即可                 source:用來指定HBase的KeyValue那一部分作為索引輸入資料,可選的有‘value’和'qualifier',當為value的時候表示使用HBase的列值作為索引輸入,當為qualifier的時候表示使用HBase的列限定符作為索引輸入 5.註冊 Lily HBase Indexer Configuration 和 Lily HBase Indexer Service [[email protected] conf]# hbase-indexer add-indexer \ > --name test3indexer \ > --indexer-conf $HOME/hbase-indexer/test3/morphline-hbase-mapper.xml \     > --connection-param solr.zk=192.168.60.44:2181/solr \ > --connection-param solr.collection=test3 \ > --zookeeper 192.168.60.44:2181,192.168.60.45:2181,192.168.60.46:2181                 注:鍵入hbase-indexer回車,獲取命令幫助                       --name:為indexer取名,自定義                       --indexer-conf  上面建立的morphline-hbase-mapper.xml檔案地址                       --connection-param solr.zk : solr安裝所在節點的zk地址,如有zk節點上沒有安裝solr,這裡不寫節點   --connection-param solr.collection:   上面建立的solr.collection名稱,要與上面一致                       --zookeeper :zk節點地址 6.在hbase中插入資料 hbase(main):031:0> put 'test3','001','c1:name','xxi' hbase(main):040:0> put 'test3','002','c1:name','li' 7.在solr中檢視索引,開啟地址為:solr節點ip:8983/solr,檢視結果如下 全部查詢:
輸入查詢條件查詢,查詢條件的格式為——》在schema.xml檔案中自定義的field節點name屬性:預查詢的值
8.解除安裝索引         如果想刪除索引,倒著來就可以了                 ①鍵入hbase-indexer命令,有delete-indexer和 list-indexers可使用,若忘記了剛剛自己定義的indexer名稱,可使用hbase-indexer  list-indexers檢視,然後刪除 hbase-indexer delete-indexer --name test3                 ②到Key-Value Store Indexer的配置頁面,把Morphlines檔案中相關配置刪除,也可不刪,等建立其他索引的時候在該基礎上改,或者刪除也可                 ③刪除collection,如果忘記名稱,使用solrctl collection --list檢視 solrctl collection --delete test3                 ④刪除zk上的配置檔案,忘記名稱,如上檢視 solrctl instancedir --delete test3                 ⑤刪除本地配置   rm -rf $HOME/hbase-indexer/test3 9.批量同步索引     ①如果對一個已經存在資料的hbase表做了索引,會發現只記錄了後面插入的資料,已經存在的資料沒有索引。那麼就要將之前的資料的索引同步上。     ②運行同步命令需要在有morphlines.conf檔案的目錄進行。在hbase的master節點上,執行命令: find / |grep morphlines.conf$
    ③進入最新的那個process目錄/run/cloudera-scm-agent/process/271-ks_indexer-HBASE_INDEXER,執行命令 (如果想不進入目錄執行,則在命令中加上 --morphline-file /run/cloudera-scm-agent/process/271-ks_indexer-HBASE_INDEXER/morphlines.conf,來指定目錄所在位置) hadoop --config /etc/hadoop/conf \ jar /opt/cloudera/parcels/CDH/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.11.0-job.jar \ --conf /etc/hbase/conf/hbase-site.xml \ --hbase-indexer-file $HOME/hbase-indexer/test/morphline-hbase-mapper.xml \ --zk-host 192.168.60.44:2181/solr \ --collection test \ --reducers0 \ --go-live         注:jar:後面的jar路徑需要檢視所使用的cloudera安裝目錄下的jar包具體名字               --hbase-indexer-file :morphline-hbase-mapper.xml檔案路徑,如果執行命令的節點該檔案不存在,則從存在的機器上覆制過來即可 10.為多個列族多個列做索引     操作順序與上面一致。需要修改的地方是:     ①建表時建立多個列族     ②需要做多少個索引,schema.xml中即多寫幾個field欄位 <field name="test4name" type="string" indexed="true" stored="true" />         <field name="test4add" type="string" indexed="true" stored="true" />     ③Morphline 檔案如下配置: SOLR_LOCATOR :{ # Name of solr collection #collection : test3 # ZooKeeper ensemble zkHost :"$ZK_HOST" } morphlines :[ {     id : test1Map     importCommands :["org.kitesdk.**","com.ngdata.**"]     commands :[         {             extractHBaseCells {                 mappings :[                     {                         inputColumn :"c1:name"                         outputField :"testname"                         type :string                         source : value                     },                     {                         inputColumn :"c1:add"                         outputField :"testadd"                         type :string                         source : value                     }                 ]             }         }         { logDebug { format :"output record: {}", args :["@{}"]}}     ] }, {     id : test2Map     importCommands :["org.kitesdk.**","com.ngdata.**"]     commands :[         {             extractHBaseCells {                 mappings :[                     {                         inputColumn :"c1:name"                         outputField :"testname"                         type :string                         source : value                     },                     {                         inputColumn :"c2:add"                         outputField :"testadd"                         type :string                         source : value                     }                 ]             }         }         { logDebug { format :"output record: {}", args :["@{}"]}}     ] }, {     id : test3Map     importCommands :["org.kitesdk.**","com.ngdata.**"]     commands :[         {             extractHBaseCells {                 mappings :[                     {                         inputColumn :"c1:name"                         outputField :"test3name"                         type :string                         source : value                     }                 ]             }         }         { logDebug { format :"output record: {}", args :["@{}"]}}     ] }, {     id : test4Map     importCommands :["org.kitesdk.**","com.ngdata.**"]     commands :[         {             extractHBaseCells {                 mappings :[                     {                         inputColumn :"c1:*"                         outputField :"test4name"                         type :string                         source : value                     },                     {                         inputColumn :"c2:*"                         outputField :"test4add"                         type :string                         source : value                     }                 ]             }         }         { logDebug { format :"output record: {}", args :["@{}"]}}     ] } ]         注:i.上面的配置中有test1Map,test2Map,test3Map,test4Map共4個Morphline 片段,以id區分,分別對應了4張表。即因為CDH中Morphline.conf檔案只有一個,所以如果對多張表做索引,為了各自區分互不干擾,就這樣配置即可,id就是區分的根據。               ii.上面的某一個配置片段中,有mappings節點,其中可以有若干個{}包含的子節點,每一個子節點就可以配置一列。如上test4Map,對c1,c2的所有欄位做了索引,但是輸出只有2個,並且列名未知,很少這用。如果寫成inputColumn :"c1:a*"則是對以a開頭列做索引;如果寫成inputColumn :"c1:name",則是精確對c1列族的name列做索引。 11.修改,更新索引     這裡分為兩種情況。                 ①索引還未建立完成想修改配置,或者索引建立完成,還未插入資料,想修改配置。比如想修改schema.xml,增加一個field欄位,如下操作                         修改schema.xml                         更新配置檔案; solrctl instancedir --update test4 $HOME/test4                         更新collection; solrctl collection --reload test4 如果還想更改Morphline.conf檔案中指定的列族,列名等,修改後重啟Key-Value Store Indexer,然後插入hbase資料即可。                 ②如果索引已經建立,已經有了索引資料,想要修改索引,則要先刪除索引資料集,清空資料集可以通過solr API來完成,也可以在命令列中完成,鍵入如下命令:             首先清空該collection; solrctl collection --deletedocs test4             按照上面的操作,修改配置;             但是現在只有新插入的資料才有索引,需要使用上面9.批量同步索引的方法,將以前的資料的索引重新建立好。

相關推薦

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

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

elasticsearch 5.x 系列之六 文檔索引更新查詢刪除流程

取數 獲取 info ast 負載均衡 blog img 選擇 將在 一、elasticsearch index 索引流程 步驟: 客戶端向Node1 發送索引文檔請求 Node1 根據文檔ID(_id字段)計算出該文檔應該屬於shard0,然後請求路由到Node3的P0分

MongoDB索引管理——創建索引查看索引刪除索引重建索引

大小 exsi ngs 索引 mongodb reat 新建 mon 集合 先給users集合插入兩條記錄,然後用users集合來進行索引管理的演示: > user1={"name":"liming","age":20,"gender":"F"} { "name" :

elasticsearch 索引更新增量更新不停機修改升級 ,簡單使用

elasticsearch 使用 對es瞭解的並不是太多,記錄簡單使用場景。若哪裡不對,還請大人指出 舉例: 根據商品名稱搜尋商品 建立索引 product_v1 為什麼要帶v1呢,後面方便升級 #新增索引 put product_v1?pretty #檢視一下 get _cat

建立單列索引多列索引

單列索引: CREATE TABLE t_user ( id INT, username VARCHAR(20), PASSWORD VARCHAR(20), INDEX (username) ) 多列索引: CREATE TABLE t_user1 ( id INT

MySQL利用自定義函式和儲存過程建立海量表並使用索引優化

昨天學習韓順平老師的視訊時明白了上一章explain的意義,為了自己的聯絡,我學著建立了一個海量表,供自己練習使用。 程式碼如下: #建立表DEPT CREATE TABLE dept( /*部門表*/ deptno MEDIUMINT UN

SQL有三個類型的索引唯一索引 不能有重復但聚集索引非聚集索引可以有重復

返回 自動添加 post 設置 span 唯一索引 tca lock 所有 重要: (1) SQL如果創建時候,不指定類型那麽默認是非聚集索引 (2) 聚集索引和非聚集索引都可以有重復記錄,唯一索引不能有重復記錄。 (3) 主鍵 默認是加了唯一約束的聚集索引,但是也可

談聚集索引非聚集索引及在sqlite使用。

dci 時間 strong ger androi 不等式 cluster ble 類型 聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個。 聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲並不連續。 create clustered index

不建議使用 force index()索引使用聯合索引就可以解決問題!!!

  最近解決mysql慢查詢問題,先把sql大概說明下      select id from table where type = 1 and XX= xx and XX1= xx1 and XX2 = xx2  order by time desc   再說一下背景,

MySQL—2、B-Tree,B+Tree,聚集索引非聚集索引

今天研究下,mysql中的B-tree索引,通過這篇文章你可以瞭解到,mysql中的btree索引的原理,檢索資料的過程,innodb和myisam引擎中btree索引的不同,以及btree索引的好處和限制。B-Tree 索引是 MySQL 資料庫中使用最為頻繁的索引型別,除

插入更新刪除資料索引檢視建立使用者修改當前使用者密碼

單表建立檢視:CREATE VIEW 檢視名稱(檢視中的欄位名1,欄位2..) AS SELECT 欄位1,欄位2...FROM 表名 WHERE 條件;多表建立檢視:CREATE VIEW 檢視名稱(檢視中的欄位名1,欄位2..) AS SELECT 欄位1,欄位2...FROM 表1,表2 WHERE 條

12W學習筆記——獨立子查詢更新刪除建立視圖

記錄 date 筆記 獨立 https 清空 名單 sel 方式 查詢的學習進入了最後階段了,接下來我就來介紹一下查詢最後的獨立子查詢。 獨立子查詢基本上都是用SELECT FROM WHERE 三個語句。 例:在學院表、專業表中,查詢人文與管理學院下設各專業的簡稱

pymongo建立索引更新刪除

pymongo建立索引、更新、刪除     索引建立

如何修改帶索引的欄位的長度檢視、刪除索引修改欄位屬性、建立索引

需要重新建立索引,因為長度不同會認為是兩個不同的所索引。 建立和刪除索引 索引的建立可以在CREATE TABLE語句中進行,也可以單獨用CREATE INDEX或ALTER TABLE來給表增加索引。刪除索引可以利用ALTER TABLE或DROP INDEX語句來實現。 (1)使用ALTER T

MongoDB建立表步驟Mongo常用的資料庫操作命令查詢新增更新刪除_MongoDB 效能監測

->use Admin         (切換到建立使用者) ->db.TestDb          (建立資料庫) ->db.addUser(“userName”,”Pwd”)    建立使用者 ->db.auth(“userName”,

MongoDB效能篇 -建立索引組合索引唯一索引刪除索引和explain執行計劃

一、索引 MongoDB 提供了多樣性的索引支援,索引資訊被儲存在system.indexes 中,且預設總是為_id建立索引,它的索引使用基本和MySQL 等關係型資料庫一樣。其實可以這樣說說,索引是凌駕於資料儲存系統之上的另一層系統,所以各種結構迥異的儲存都有相同或

oracle資料庫中sql語言建立更新刪除資料

一sql語言的分類 sql語言分為4類:DQL(資料查詢語言),DML(資料操縱語言),資料定義語言(DDL),資料控制語言(DCL)。 二資料定義語言 資料定義語言用於建立,刪除,修改資料庫中的各種物件,物件比如-表,索引,檢視,同義詞、聚簇等 CREATETABLE/

ORACLE索引索引建立、修改、刪除

一、簡介       索引是關係資料庫中用於存放每一條記錄的一種物件,主要目的是加快資料的讀取速度和完整性檢查。建立索引是一項技術性要求高的工作。一般在資料庫設計階段的與資料庫結構一道考慮。應用系統的效能直接與索引的合理直接有關 二、 語法 2.1 建立索

sqlserver——建立更新刪除表。

--建立表 for Eric create table test ( ID int not null identity(1,1) primary key,--identity(初始值,增長值) primary key 設定主鍵 name varchar(50) not n

Mongodb在查詢某個欄位是否存在執行刪除欄位python中排序和建立索引

查詢欄位是否存在 查詢course表中,存在lectures_count欄位的記錄資訊 db.course.find( { “lectures.lectures_count”: { $exists: true } } ) 引數:ture或者false 使