SolrCloud存儲數據於HDFS的方法


1. 概述

  solrCloud數據存儲在hdfs上的方法有兩種,一是配置solr.in.sh腳本文件,比較簡單的一種方式;二是配置solrconfig.xml配置文件, 比較繁瑣點,需要更新到zookeeper上。

  說明:solrcloud部署是按照https://www.cnblogs.com/swordfall/p/11967385.html “Ranger安裝部署 - solr安裝”進行安裝的,故本博文也是在此基礎上進行hdfs相關配置的

2. 配置solr.in.sh文件

2.1. 索引數據存儲在非HA的hdfs上

配置solr.in.sh文件,該文件位於/opt/app/ranger-solr-8.3.0-cloud/ranger_audit_server/scripts,修改內容為:

$ vim solr.in.sh
SOLR_OPTS="$SOLR_OPTS \
-Dsolr.directoryFactory=HdfsDirectoryFactory \
-Dsolr.lock.type=hdfs \
-Dsolr.hdfs.home=hdfs://bridge1:9000/solr"

 

解析:

  • solr.directoryFactory=HdfsDirectoryFactory 為固定配置;
  • solr.lock.type=hdfs 為固定配置;
  • solr.hdfs.home=hdfs://bridge1:9000/solr 為指定solr的索引數據在hdfs上的路徑。

2.2. 索引數據存儲在HA的hdfs上

配置solr.in.sh文件,該文件位於/opt/app/ranger-solr-8.3.0-cloud/ranger_audit_server/scripts,修改內容為:

$ vim solr.in.sh
SOLR_OPTS="$SOLR_OPTS \
-Dsolr.directoryFactory=HdfsDirectoryFactory \
-Dsolr.lock.type=hdfs \
-Dsolr.hdfs.confdir=/opt/app/hadoop-2.7.5-ha-multi/etc/hadoop \
-Dsolr.hdfs.home=hdfs://bridge/solr"

 

解析:

  • solr.hdfs.confdir=/opt/app/hadoop-2.7.5-ha-multi/etc/hadoop 為hdfs的ha配置路徑;
  • solr.hdfs.home=hdfs://bridge/solr 為指定solr的索引數據在hdfs上的路徑, bridge為hdfs的ha名。

3. 配置solrconfig.xml文件

3.1. solrconfig.xml配置在非HA與HA的hdfs上

3.1.1. 索引數據存儲在非HA的hdfs上

配置solrconfig.xml文件,修改配置文件內容如下:

<dataDir>${solr.data.dir:}</dataDir>

<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
    <str name="solr.hdfs.home">hdfs://bridge1:8020/solr</str>
    <bool name="solr.hdfs.blockcache.enabled">true</bool>
    <int name="solr.hdfs.blockcache.slab.count">1</int>
    <bool name="solr.hdfs.blockcache.direct.memory.allocation">true</bool>
    <int name="solr.hdfs.blockcache.blocksperbank">16384</int>
    <bool name="solr.hdfs.blockcache.read.enabled">true</bool>
    <bool name="solr.hdfs.blockcache.write.enabled">true</bool>
    <bool name="solr.hdfs.nrtcachingdirectory.enable">true</bool>
    <int name="solr.hdfs.nrtcachingdirectory.maxmergesizemb">16</int>
    <int name="solr.hdfs.nrtcachingdirectory.maxcachedmb">192</int>
</directoryFactory>

<lockType>${solr.lock.type:hdfs}</lockType>

 

解析:

  • ${solr.data.dir:} 為solr的索引數據存儲的路徑,一般為solr.hdfs.home的路徑下面,如hdfs://bridge1:8020/solr/data,這種只適合集合的分片數量為1,即SHARDS,當分片為大於1的時候,將會報錯,錯誤如下:
"192.168.1.11:6083_solr":"org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException:
Error from server at http://192.168.1.11:6083/solr: 
Error CREATEing SolrCore 'ranger_audits_shard1_replica_n1': Unable to create core [ranger_audits_shard1_replica_n1] 
Caused by: /solr/data/index/write.lock for client 192.168.1.11 already exists\n\tat 
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:2584)\n\tat 
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2471)\n\tat 
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2355)\n\tat 
org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:624)\n\tat 
org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.create(ClientNamenodeProtocolServerSideTranslatorPB.java:398)\n\tat 
org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)\n\tat
org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)\n\tat org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)\n\tat org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)\n\tat org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)\n\tat java.security.AccessController.doPrivileged(Native Method)\n\tat javax.security.auth.Subject.doAs(Subject.java:422)\n\tat org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1754)\n\tat org.apache.hadoop.ipc.Server$Handler.run(Server.java:2213)\n"

   為了解決上述錯誤,建議${solr.data.dir:}默認為空,不填。

  • solr.hdfs.home為solr的存儲目錄
  • solr.lock.type為solr的類型,指定為hdfs

3.1.2.  索引數據存儲在HA的hdfs上

配置solrconfig.xml文件,修改配置文件內容如下:

<dataDir>${solr.data.dir:}</dataDir>

<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
<str name="solr.hdfs.home">hdfs://bridge1:8020/solr</str>
<str name="solr.hdfs.confdir">/opt/app/hadoop-2.7.5-ha-multi/etc/hadoop</str>
    <bool name="solr.hdfs.blockcache.enabled">true</bool>
    <int name="solr.hdfs.blockcache.slab.count">1</int>
    <bool name="solr.hdfs.blockcache.direct.memory.allocation">true</bool>
    <int name="solr.hdfs.blockcache.blocksperbank">16384</int>
    <bool name="solr.hdfs.blockcache.read.enabled">true</bool>
    <bool name="solr.hdfs.blockcache.write.enabled">true</bool>
    <bool name="solr.hdfs.nrtcachingdirectory.enable">true</bool>
    <int name="solr.hdfs.nrtcachingdirectory.maxmergesizemb">16</int>
    <int name="solr.hdfs.nrtcachingdirectory.maxcachedmb">192</int>
</directoryFactory>

<lockType>${solr.lock.type:hdfs}</lockType>

 

解析:與非HA模式的配置的差別在於solr.hdfs.confdir

  • solr.hdfs.confdir為指定hdfs的配置路徑

3.2. solrconfig.xml文件更新到zookeeper上

solrconfig.xml在本地機器修改,對solr不生效,只有更新到zookeeper上面才生效。這里有個更新腳本add_ranger_audits_conf_to_zk.sh,腳本路徑位於/opt/app/ranger-solr-8.3.0-cloud/ranger_audit_server/scripts,如下:

function usage {
    echo "Error: The following properties need to be set in the script SOLR_ZK, SOLR_INSTALL_DIR and SOLR_RANGER_HOME"
    exit 1
}

JAVA_HOME=/usr/lib/java/jdk1.8.0_151
SOLR_USER=solr
SOLR_ZK=bridge1:2181,bridge2:2181,bridge3:2181/ranger_audits
SOLR_INSTALL_DIR=/opt/app/ranger-solr-8.3.0-cloud
SOLR_RANGER_HOME=/opt/app/ranger-solr-8.3.0-cloud/ranger_audit_server

if [ "`whoami`" != "$SOLR_USER" ]; then
    if [ -w /etc/passwd ]; then
        echo "Running this script as $SOLR_USER..."
        su $SOLR_USER $0
    else
        echo "ERROR: You need to run this script $0 as user $SOLR_USER. You are currently running it as `whoami`"
    fi

    exit 1
fi

if [ "$SOLR_ZK" = "" ]; then
    usage
fi

if [ "$SOLR_INSTALL_DIR" = "" ]; then
    usage
fi

if [ "$SOLR_RANGER_HOME" = "" ]; then
    usage
fi

SOLR_RANGER_CONFIG_NAME=ranger_audits
SOLR_RANGER_CONFIG_LOCAL_PATH=${SOLR_RANGER_HOME}/conf
ZK_CLI=$SOLR_INSTALL_DIR/server/scripts/cloud-scripts/zkcli.sh


if [ ! -x $ZK_CLI ]; then
    echo "Error: $ZK_CLI is not found or you don't have permission to execute it."
    exit 1
fi
set -x
$ZK_CLI -cmd upconfig -zkhost $SOLR_ZK -confname $SOLR_RANGER_CONFIG_NAME -confdir $SOLR_RANGER_CONFIG_LOCAL_PATH

 

解析:

  • JAVA_HOME設置JAVA_HOME路徑
  • SOLR_USER solr用戶
  • SOLR_ZK solr關聯的zookeeper
  • SOLR_INSTALL_DIR solr安裝目錄
  • SOLR_RANGER_HOME solr關於ranger的安裝目錄
  • SOLR_RANGER_CONFIG_NAME solr的ranger集合名
  • SOLR_RANGER_CONFIG_LOCAL_PATH solrconfig.xml配置文件的路徑
  • ZK_CLI zk_cli的路徑

 

執行腳本:

$ pwd
/opt/app/ranger-solr-8.3.0-cloud/ranger_audit_server/scripts
$ ./add_ranger_audits_conf_to_zk.sh

3.3. solrconfig.xml文件是否更新成功檢測

登錄solr admin的網址,查看solrconfig.xml文件,如下,則成功更新solrconfig.xml文件。

4. solr集合創建腳本

當配置好solr.in.sh腳本文件或者配置好solrconfig.xml文件,兩者之一后,我們創建名為“ranger_audits”的集合。

create_ranger_audits_collection.sh,文件位於/opt/app/ranger-solr-8.3.0-cloud/ranger_audit_server/scripts,如下:

SOLR_HOST_URL=http://`hostname -f`:6083
SOLR_ZK=bridge1:2181,bridge2:2181,bridge3:2181/ranger_audits
SOLR_INSTALL_DIR=/opt/app/ranger-solr-8.3.0-cloud
SHARDS=2
REPLICATION=1

CONF_NAME=ranger_audits
COLLECTION_NAME=ranger_audits

which curl 2>&1 > /dev/null
if [ $? -ne 0 ]; then
    echo "curl is not found. Please install it for creating the collection"
    exit 1
fi

set -x
curl --negotiate -u : "${SOLR_HOST_URL}/solr/admin/collections?action=CREATE&name=${COLLECTION_NAME}&numShards=${SHARDS}&replicationFactor=${REPLICATION}&collection.configName=$CONF_NAME&maxShardsPerNode=100"

 

這里建議:由於數據存儲在hdfs上,hdfs已有副本機制。故solr的副本REPLICATION設置為1,避免冗余。

解析:

  • SHARDS 分片根據部署的機器數量配置

5. solr集合索引數據是否存儲在hdfs上

如下圖展示,則表明集合的索引數據已存儲在hdfs上。

總結

【參考資料】

https://www.jianshu.com/p/026b5641786c Solr7.3 Cloud On HDFS搭建

https://lucene.apache.org/solr/guide/7_3/running-solr-on-hdfs.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM