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/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 最大缓存大小。
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>