【发布时间】:2015-09-27 08:59:02
【问题描述】:
我需要合并保存在 HDFS 上的 Lucene 索引。编写了Lucene提供的普通合并工具的定制版。代码库如下
HdfsDirectory mergedIndex = new HdfsDirectory(new Path("/mergedindex"), new Configuration());
IndexWriter writer = new IndexWriter(mergedIndex, new IndexWriterConfig(new WhitespaceAnalyzer(Version.LUCENE_CURRENT))
.setOpenMode(OpenMode.CREATE));
Directory[] indexes = new BaseDirectory[args.length - 1];
for (int i = 1; i < args.length; i++) {
indexes[i - 1] = new HdfsDirectory(new Path(args[i]), new Configuration());
}
System.out.println("Merging...");
writer.addIndexes(indexes);
System.out.println("Full merge...");
writer.forceMerge(1);
writer.close();
但它说它无法在目录上获得 HDFS 锁定,因为它是超时!超时值在 Lucene 库中被硬编码为 1000 毫秒。
异常跟踪 线程“主”org.apache.lucene.store.LockObtainFailedException 中的异常:锁定获取超时:org.apache.solr.store.hdfs.HdfsLockFactory$HdfsLock@21539796 在 org.apache.lucene.store.Lock.obtain(Lock.java:89) 在 org.apache.lucene.index.IndexWriter.(IndexWriter.java:776) 在 com.test.hadoop.solr.indexer.IndexMergeTool.main(IndexMergeTool.java:30) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.hadoop.util.RunJar.run(RunJar.java:221) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:136)
是否有任何机制可以克服这个问题,以便我可以合并 HDFS 本身的索引?
提前致谢, 阿伦
【问题讨论】:
标签: hadoop indexing solr lucene hdfs