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'
或无类型的锁定工厂。
如果您不修改 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 最大缓存大小。
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>