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' 或 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 根目录下自动创建相应的目录。

  • hdfs://host:port/path 形式设置 solr.hdfs.home

  • 您应该将锁定工厂类型指定为 '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)

上面的示例假设您每次使用 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 块的 Directory。这种缓存机制取代了 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

启用/禁用为所有 SolrCores 使用一个全局缓存。使用的设置将来自创建的第一个 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 应用于安全 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>