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 脚本。

  • 您需要使用 HdfsDirectoryFactory 和格式为 hdfs://host:port/path 的数据目录

  • 您需要指定格式为 hdfs://host:port/pathupdateLog 位置

  • 您应该指定 '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

要分配的内存块数。每个块大小为 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

必需

默认值:无

密钥表文件包含 Kerberos 主体和加密密钥对,当 Solr 尝试使用安全 Hadoop 进行身份验证时,允许无密码身份验证。

此文件需要位于所有 Solr 服务器上,且路径与该参数中提供的路径相同。

solr.hdfs.security.kerberos.principal

必需

默认值:无

Solr 应该用来向安全 Hadoop 进行身份验证的 Kerberos 主体;典型 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 示例

以下是用于在 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,则需要将三个与 Kerberos 相关的属性添加到 solrconfig.xml 中的 <directoryFactory> 元素,例如

<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/[email protected]</str>
</directoryFactory>