存储在HDFS中的Solr索引合并失败问题求助
问题描述
我尝试使用org.apache.lucene.misc.IndexMergeTool将两个Solr Core的索引合并到新索引中,所有索引均存储在HDFS的/apps/solr/data/collection_name/data/index路径下。已创建新集合col_new,试图将col_1的core_1和core_2索引合并至其中,执行的命令如下:
java -cp /usr/cloudera-hdp-solr/5.0.0.5-301/cloudera-hdp-solr/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-core-7.4.0.jar:/usr/cloudera-hdp-solr/5.0.0.5-301/cloudera-hdp-solr/solr/server/solr-webapp/webapp/WEB-INF/lib/lucene-misc-7.4.0.jar org/apache/lucene/misc/IndexMergeTool -destDir hdfs://namenode/path_to_new_core/data/index -srcDir hdfs://namenode/path_to_old_core_1/data/index hdfs://namenode/path_to_old_core_2/data/index
执行后出现异常:生成了名为hdfs:、-srcDir和-destDir的文件夹。有没有人有合并共享文件系统中索引的经验?
环境信息
- Solr版本:7.4
- HDP版本:v3
- Lucene版本:5.0.0
解决方案
1. 修正类名格式
你命令里的类名用了斜杠org/apache/lucene/misc/IndexMergeTool,这是错误的——Java类名必须用点.分隔,正确类名是org.apache.lucene.misc.IndexMergeTool。这是生成错误文件夹的核心原因:Java将斜杠开头的类名误解析为路径,进而错误识别了后续参数。
2. 补充Hadoop依赖包
要操作HDFS上的索引,必须把Hadoop相关核心jar包添加到classpath中,否则Lucene无法识别HDFS文件系统。找到HDP环境下的Hadoop lib目录(通常是/usr/hdp/3.x.x.x/hadoop/lib/),将其下所有jar包引入classpath。
修正后的参考命令
java -cp "/usr/cloudera-hdp-solr/5.0.0.5-301/cloudera-hdp-solr/solr/server/solr-webapp/webapp/WEB-INF/lib/*:/usr/hdp/3.x.x.x/hadoop/lib/*" org.apache.lucene.misc.IndexMergeTool -destDir hdfs://namenode/path_to_new_core/data/index -srcDir hdfs://namenode/path_to_old_core_1/data/index hdfs://namenode/path_to_old_core_2/data/index
注意事项:
- 用
*可批量引入目录下所有jar包,避免逐个列举;- 替换
/usr/hdp/3.x.x.x/hadoop/lib/为你实际的Hadoop lib路径;- 确保新索引的HDFS路径为空,否则合并可能失败;
- 执行命令的用户需拥有HDFS目标路径的读写权限。
额外提示
- Solr 7.4对应的Lucene版本应为7.4.0,你标注的Lucene 5.0.0大概率是笔误,需确保classpath里的Lucene jar版本统一,避免版本冲突;
- 合并前务必备份原索引,防止操作失误导致数据丢失;
- 也可尝试使用Solr自带的
IndexMerger工具或Solr API完成索引合并,效果与Lucene工具一致。
内容的提问来源于stack exchange,提问作者l.delgado
相关产品推荐
相关产品推荐

