HDFS 上的 Solr

Solr HDFS 模組支援將 Solr 的索引和交易記錄檔寫入和讀取至 HDFS 分散式檔案系統。它不使用 Hadoop MapReduce 來處理 Solr 資料。

若要使用 HDFS 而不是本機檔案系統,您必須使用 Hadoop 2.x,並且需要指示 Solr 使用 HdfsDirectoryFactory。還有一些額外的參數需要定義。這些參數可以透過以下三種方式之一設定

  • 將 JVM 引數傳遞至 bin/solr 腳本。每次使用 bin/solr 啟動 Solr 時,都需要傳遞這些引數。

  • 修改 solr.in.sh (或 Windows 上的 solr.in.cmd),以便在使用 bin/solr 時自動傳遞 JVM 引數,而無需手動設定。

  • solrconfig.xml 中定義屬性。這些設定變更需要為每個集合重複,因此如果您只想將某些集合儲存在 HDFS 中,這是一個很好的選擇。

模組

這是透過 hdfs Solr 模組提供的,該模組需要在使用前啟用。

在 HDFS 上啟動 Solr

使用者管理的叢集和單節點安裝

對於使用者管理的叢集或單節點 Solr 安裝,在啟動 Solr 之前,您應該修改一些參數。這些參數可以在 solrconfig.xml 中設定(更多內容請參閱下方),或在啟動時傳遞至 bin/solr 腳本。

  • 您需要使用 HdfsDirectoryFactoryhdfs://host:port/path 形式的資料目錄

  • 您需要指定 hdfs://host:port/path 形式的 updateLog 位置

  • 您應該指定鎖定工廠類型為 'hdfs' 或無。

如果您不修改 solrconfig.xml,您可以使用以下命令在 HDFS 上啟動 Solr

bin/solr start -Dsolr.directoryFactory=HdfsDirectoryFactory
     -Dsolr.lock.type=hdfs
     -Dsolr.data.dir=hdfs://host:port/path
     -Dsolr.updatelog=hdfs://host:port/path

此範例將使用定義的 JVM 屬性啟動 Solr (詳細說明請參閱下方)。

SolrCloud 執行個體

在 SolrCloud 模式下,最好將資料和更新記錄目錄保留為 Solr 的預設值,只需指定 solr.hdfs.home 即可。所有動態建立的集合都會在 solr.hdfs.home 根目錄下自動建立適當的目錄。

  • hdfs://host:port/path 形式設定 solr.hdfs.home

  • 您應該指定鎖定工廠類型為 'hdfs' 或無。

bin/solr start -c -Dsolr.directoryFactory=HdfsDirectoryFactory
     -Dsolr.lock.type=hdfs
     -Dsolr.hdfs.home=hdfs://host:port/path

此命令會使用定義的 JVM 屬性啟動 Solr。

修改 solr.in.sh (*nix) 或 solr.in.cmd (Windows)

以上範例假設您每次使用 bin/solr 啟動 Solr 時,都會將 JVM 引數作為啟動命令的一部分傳遞。然而,bin/solr 會尋找名為 solr.in.sh (Windows 上為 solr.in.cmd) 的包含檔案來設定環境變數。預設情況下,此檔案位於 bin 目錄中,您可以修改它以永久新增 HdfsDirectoryFactory 設定,並確保每次啟動 Solr 時都會使用這些設定。

例如,若要設定 JVM 引數,以便在以 SolrCloud 模式執行時始終使用 HDFS (如上所示),您可以新增如下所示的區段

# Set HDFS DirectoryFactory & Settings
-Dsolr.directoryFactory=HdfsDirectoryFactory \
-Dsolr.lock.type=hdfs \
-Dsolr.hdfs.home=hdfs://host:port/path \

區塊快取

為了效能,HdfsDirectoryFactory 使用將快取 HDFS 區塊的目錄。此快取機制會取代 Solr 使用的標準檔案系統快取。預設情況下,此快取會在堆外分配。此快取通常需要非常大,您可能需要提高執行 Solr 的特定 JVM 的堆外記憶體限制。對於 Oracle/OpenJDK JVM,以下是一個範例命令列參數,可用於在啟動 Solr 時提高限制

-XX:MaxDirectMemorySize=20g

HdfsDirectoryFactory 參數

HdfsDirectoryFactory 有許多設定定義為 directoryFactory 設定的一部分。

Solr HDFS 設定

solr.hdfs.home

必要

預設值:無

Solr 將集合資料寫入的 HDFS 根目錄位置。您可以使用此參數來指定一個根目錄位置,而不是為資料目錄或更新日誌目錄指定 HDFS 位置,所有內容都會在此 HDFS 位置內自動建立。此參數的結構為 hdfs://host:port/path/solr

區塊快取設定

solr.hdfs.blockcache.enabled

選用

預設值:true

啟用區塊快取。

solr.hdfs.blockcache.read.enabled

選用

預設值:true

啟用讀取快取。

solr.hdfs.blockcache.direct.memory.allocation

選用

預設值:true

啟用直接記憶體配置。如果此值為 false,則會使用堆積記憶體。

solr.hdfs.blockcache.slab.count

選用

預設值:1

要配置的記憶體 Slab 數量。每個 Slab 的大小為 128 MB。

solr.hdfs.blockcache.global

選用

預設值:true

啟用/停用針對所有 SolrCore 使用單一全域快取。使用的設定將來自第一個建立的 HdfsDirectoryFactory。

NRTCachingDirectory 設定

solr.hdfs.nrtcachingdirectory.enable

選用

預設值:true

啟用 NRTCachingDirectory 的使用。

solr.hdfs.nrtcachingdirectory.maxmergesizemb

選用

預設值:16

NRTCachingDirectory 合併的最大區段大小。

solr.hdfs.nrtcachingdirectory.maxcachedmb

選用

預設值:192

NRTCachingDirectory 最大快取大小。

HDFS 用戶端組態設定

solr.hdfs.confdir

選用

預設值:無

傳遞 HDFS 用戶端組態檔案的位置,例如,HDFS HA 需要此設定。

Kerberos 驗證設定

Hadoop 可以設定為使用 Kerberos 通訊協定,在嘗試存取 HDFS 等核心服務時驗證使用者身分。如果您的 HDFS 目錄受到 Kerberos 保護,則您需要設定 Solr 的 HdfsDirectoryFactory 以使用 Kerberos 進行驗證,才能讀取和寫入 HDFS。若要從 Solr 啟用 Kerberos 驗證,您需要設定以下參數

solr.hdfs.security.kerberos.enabled

選用

預設值:false

設定為 true 以啟用 Kerberos 驗證。

solr.hdfs.security.kerberos.keytabfile

必要

預設值:無

keytab 檔案包含 Kerberos 主體和加密金鑰的配對,這允許在 Solr 嘗試使用安全的 Hadoop 進行驗證時進行無密碼驗證。

此檔案需要在所有 Solr 伺服器上,以這個參數中提供的相同路徑存在。

solr.hdfs.security.kerberos.principal

必要

預設值:無

Solr 應使用的 Kerberos 主體,以驗證安全 Hadoop;典型 Kerberos V5 主體的格式為:primary/instance@realm

更新日誌設定

當使用 HDFS 來儲存 Solr 索引時,建議也將交易日誌儲存在 HDFS 上。這可以使用 solr.HdfsUpdateLog 更新日誌處理程式類別來完成。solrconfig.xml 通常用於定義更新日誌處理程式類別名稱,可以使用變數參考或直接指定,例如

<updateLog class="${solr.ulog:solr.UpdateLog}">

當指定像這樣的類別時,需要確保指定了正確的類別名稱。當未指定類別名稱時,Solr 會自動為設定為使用 HdfsDirectory Factory 的集合選擇正確的更新日誌處理程式類別 solr.HdfsUpdateLog

HDFS 的 solrconfig.xml 範例

以下是將 Solr 索引儲存在 HDFS 上的 solrconfig.xml 組態範例

<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
  <str name="solr.hdfs.home">hdfs://host:port/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.nrtcachingdirectory.enable">true</bool>
  <int name="solr.hdfs.nrtcachingdirectory.maxmergesizemb">16</int>
  <int name="solr.hdfs.nrtcachingdirectory.maxcachedmb">192</int>
</directoryFactory>

如果使用 Kerberos,您需要在 solrconfig.xml 中的 <directoryFactory> 元素中新增三個 Kerberos 相關屬性,例如

<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
   ...
  <bool name="solr.hdfs.security.kerberos.enabled">true</bool>
  <str name="solr.hdfs.security.kerberos.keytabfile">/etc/krb5.keytab</str>
  <str name="solr.hdfs.security.kerberos.principal">solr/admin@KERBEROS.COM</str>
</directoryFactory>