HDFS 上の Solr

Solr HDFS モジュールは、Solr のインデックスファイルとトランザクションログファイルを HDFS 分散ファイルシステムに書き込み、読み取る機能をサポートしています。Solr データの処理に Hadoop MapReduce は使用しません。

ローカルファイルシステムではなく HDFS を使用する場合は、Hadoop 2.x を使用している必要があり、HdfsDirectoryFactory を使用するように Solr に指示する必要があります。また、定義する必要がある追加パラメータがいくつかあります。これらは 3 つの方法のいずれかで設定できます。

  • bin/solr スクリプトに JVM 引数を渡します。これは、bin/solr で Solr を起動するたびに渡す必要があります。

  • bin/solr を使用した際に手動で設定する必要なく、JVM 引数を自動的に渡すように、solr.in.sh(または Windows の場合は solr.in.cmd)を変更します。

  • solrconfig.xml でプロパティを定義します。これらの構成変更は、コレクションごとに繰り返す必要があるため、一部のコレクションのみを HDFS に保存する場合に適しています。

モジュール

これは、使用前に有効にする必要がある hdfs Solr モジュール を介して提供されます。

HDFS 上の Solr の起動

ユーザー管理クラスタと単一ノードインストール

ユーザー管理クラスタまたは単一ノードの Solr インストールでは、Solr を起動する前にいくつかのパラメータを変更する必要があります。これらは solrconfig.xml で設定できます(詳細は 下記)、または起動時に bin/solr スクリプトに渡すことができます。

  • HdfsDirectoryFactoryhdfs://host:port/path 形式のデータディレクトリを使用する必要があります。

  • hdfs://host:port/path 形式の updateLog の場所を指定する必要があります。

  • ロックファクトリタイプを 'hdfs' または none に指定する必要があります。

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 ルートディレクトリの下に適切なディレクトリを自動的に作成します。

  • solr.hdfs.homehdfs://ホスト名:ポート番号/パスの形式で設定します。

  • ロックファクトリタイプを 'hdfs' または none に指定する必要があります。

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)の修正

上記の例では、Solrを起動するためにbin/solrを使用するたびに、JVM引数を開始コマンドの一部として渡すことを前提としています。しかし、bin/solrは環境変数を設定するためのsolr.in.sh(Windowsではsolr.in.cmd)という名前のインクルードファイルを探します。デフォルトでは、このファイルはbinディレクトリにあります。このファイルを修正してHdfsDirectoryFactoryの設定を永続的に追加し、Solrが起動されるたびにそれらが使用されるようにすることができます。

例えば、SolrCloudモードで実行する場合に常にHDFSを使用するようにJVM引数を設定するには(上記参照)、次のようなセクションを追加します。

# 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ロケーションを指定する代わりに、このパラメータを使用して1つのルートロケーションを指定し、すべてが自動的にこのHDFSロケーション内に作成されるようにします。このパラメータの構造はhdfs://ホスト名:ポート番号/パス/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

割り当てるメモリのスラブ数。各スラブは128MBです。

solr.hdfs.blockcache.global

オプション

デフォルト:true

すべてのSolrCoreに対して1つのグローバルキャッシュを使用するかどうかを有効/無効にします。使用される設定は、最初に作成された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は、HDFSなどのコアサービスへのアクセスを試行する際に、ユーザーIDを確認するためにKerberosプロトコルを使用するように設定できます。HDFSディレクトリがKerberosを使用して保護されている場合、HDFSへの読み書きを行うために、Kerberosを使用して認証するようにSolrのHdfsDirectoryFactoryを設定する必要があります。SolrからKerberos認証を有効にするには、次のパラメータを設定する必要があります。

solr.hdfs.security.kerberos.enabled

オプション

デフォルト:false

Kerberos認証を有効にするにはtrueに設定します。

solr.hdfs.security.kerberos.keytabfile

必須

デフォルト:なし

キータブファイルには、Kerberosプリンシパルと暗号化されたキーのペアが含まれており、SolrがセキュアなHadoopと認証しようとする際にパスワード不要の認証を可能にします。

このファイルは、このパラメータで指定された同じパスですべてのSolrサーバーに存在する必要があります。

solr.hdfs.security.kerberos.principal

必須

デフォルト:なし

セキュアなHadoopに対して認証するためにSolrが使用するKerberosプリンシパル。一般的なKerberos V5プリンシパルの形式は、プライマリ/インスタンス@レルムです。

更新ログ設定

HDFSを使用してSolrインデックスを保存する場合、トランザクションログもHDFSに保存することをお勧めします。これは、solr.HdfsUpdateLog更新ログハンドラークラスを使用することで実現できます。solrconfig.xmlは、変数参照または直接指定を使用して更新ログハンドラーのクラス名を定義するために使用されることがよくあります。

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

このようなクラスを指定する場合は、正しいクラス名が指定されていることを確認する必要があります。クラス名が指定されていない場合、SolrはHdfsDirectory Factoryを使用するように構成されているコレクションに対して、適切な更新ログハンドラークラスsolr.HdfsUpdateLogを自動的に選択します。

HDFSのsolrconfig.xml例

HDFSにSolrインデックスを保存するための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>要素に3つの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>