简体   繁体   English

SOLR 4.6.0 索引并发问题通过 CLI - org.apache.solr.common.SolrException:索引锁定写入核心 XXX

[英]SOLR 4.6.0 Indexing Concurrency Problem via CLI - org.apache.solr.common.SolrException: Index locked for write for core XXX

I have a web application running in Tomcat with a SQL database and SOLR backend.我有一个 web 应用程序在 Tomcat 中运行,带有 SQL 数据库和 Z48B3DBABE8D6CACAD2223B7BEZ 后端。

The task is implementing a standalone enhanced version of a webapp triggered functionality.该任务正在实现 webapp 触发功能的独立增强版本。 Existing Webapp version involves querying a specific product from a SQL database (which also exist in SOLR) and re-indexing/updating it in a SOLR engine.现有的 Webapp 版本涉及从 SQL 数据库(也存在于 SOLR 中)查询特定产品并在 SOLR 引擎中重新索引/更新它。

I am running a main class in a JAR file deployed via CLI as follows:我正在通过 CLI 部署的 JAR 文件中运行主要 class 文件,如下所示:

java -Dxxx.base=/usr/local/xxx -cp "xxxutils-4.12-SNAPSHOT.jar:/usr/local/tomcat/lib/servlet-api.jar:/usr/local/tomcat/conf:/usr/local/xxx/conf:*" org.sam.xxx.utils.SolrReIndexExec

My CLI version is slightly different to the web, it queries all products from the SQL database and tries to re-Index all the products.我的 CLI 版本与 web 略有不同,它从 SQL 数据库中查询所有产品并尝试重新索引所有产品。

My program is failing when it tries to add the documents to SOLR with the following error:我的程序在尝试将文档添加到 SOLR 时失败,并出现以下错误:

//About to add document to EmbeddedSolrServer  

Exception in thread "main" org.apache.solr.common.SolrException: SolrCore 'XXXX' is not available due to init failure: Index locked for write for core XXXX
        at org.apache.solr.core.CoreContainer.getCore(CoreContainer.java:818)
        at org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.request(EmbeddedSolrServer.java:110)
        at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:117)
        at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:116)
        at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:102)
        at org.test.sam.service.SolrService.addRecordToSolrCli(SolrService.java:270)
        at org.test.sam.service.SolrService.addProductToSolrCli(SolrService.java:517)
        at org.test.sam.function.ReIndexProductService.reIndexAllProducts(ReIndexProductService.java:106)
        at org.test.sam.utils.SolrReIndexExec.<init>(SolrReIndexExec.java:39)
        at org.test.sam.utils.SolrReIndexExec.main(SolrReIndexExec.java:52)
Caused by: org.apache.solr.common.SolrException: Index locked for write for core XXXX
        at org.apache.solr.core.SolrCore.<init>(SolrCore.java:834)
        at org.apache.solr.core.SolrCore.<init>(SolrCore.java:625)
        at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:557)
        at org.apache.solr.core.CoreContainer.create(CoreContainer.java:592)
        at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:271)
        at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:263)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.lucene.store.LockObtainFailedException: Index locked for write for core XXXX
        at org.apache.solr.core.SolrCore.initIndex(SolrCore.java:491)
        at org.apache.solr.core.SolrCore.<init>(SolrCore.java:755)
        ... 11 more

    -----------------------------------------------------------------------
    

After some investigation.经过一番调查。 I saw some post suggesting the following:我看到一些帖子建议以下内容:

  1. Changing the lockType to simple in the solrConfig.xml, that potential fix made no difference.在 solrConfig.xml 中将 lockType 更改为 simple,该潜在修复没有任何区别。
  2. Deleting the write.lock file /usr/local/xxx/Data/solr/XXXX/data/index/write.lock and re-runing the JAR resulted in the error below:删除 write.lock 文件 /usr/local/xxx/Data/solr/XXXX/data/index/write.lock 并重新运行 JAR 导致以下错误:

Exception in thread "main" org.apache.solr.common.SolrException: SolrCore 'XXXX' is not available due to init failure: Error opening new searcher at org.apache.solr.core.CoreContainer.getCore(CoreContainer.java:818) at org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.request(EmbeddedSolrServer.java:110) at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:117) at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:116) at org.apache.solr.client.solrj.SolrServer.add(So Exception in thread "main" org.apache.solr.common.SolrException: SolrCore 'XXXX' is not available due to init failure: Error opening new searcher at org.apache.solr.core.CoreContainer.getCore(CoreContainer.java:818 ) at org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.request(EmbeddedSolrServer.java:110) at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:117) at org. apache.solr.client.solrj.SolrServer.add(SolrServer.java:116) at org.apache.solr.client.solrj.SolrServer.add(So lrServer.java:102) at org.test.sam.service.SolrService.addRecordToSolrCli(SolrService.java:270) at org.test.sam.service.SolrService.addProductToSolrCli(SolrService.java:517) at org.test.sam.function.ReIndexProductService.reIndexAllProducts(ReIndexProductService.java:106) at org.test.sam.utils.SolrReIndexExec.(SolrReIndexExec.java:39) at org.test.sam.utils.SolrReIndexExec.main(SolrReIndexExec.java:52) Caused by: org.apache.solr.common.SolrException: Error opening new searcher at org.apache.solr.core.SolrCore.(SolrCore.java:834) at org.apache.solr.core.SolrCore.(SolrCore.Z93F725A07423F lrServer.java:102) at org.test.sam.service.SolrService.addRecordToSolrCli(SolrService.java:270) at org.test.sam.service.SolrService.addProductToSolrCli(SolrService.java:517) at org.test.sam .function.ReIndexProductService.reIndexAllProducts(ReIndexProductService.java:106) at org.test.sam.utils.SolrReIndexExec.(SolrReIndexExec.java:39) at org.test.sam.utils.SolrReIndexExec.main(SolrReIndexExec.java:52) Caused by: org.apache.solr.common.SolrException: Error opening new searcher at org.apache.solr.core.SolrCore.(SolrCore.java:834) at org.apache.solr.core.SolrCore.(SolrCore.Z93F725A07423F E1C889F448B33D21F46Z:625) at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:557) at org.apache.solr.core.CoreContainer.create(CoreContainer.java:592) at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:271) at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:263) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.Z9 E1C889F448B33D21F46Z:625) at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:557) at org.apache.solr.core.CoreContainer.create(CoreContainer.java:592) at org.apache.solr.core .CoreContainer$1.call(CoreContainer.java:271) at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:263) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 Z93F725A07423FE1C889F448B33Duture.ZF.Z6. 3F725A07423FE1C889F448B33D21F46Z:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.solr.common.SolrException: Error opening new searcher at org.apache.solr.core.SolrCore.openNewSearcher(SolrCore.java:1477) at org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1589) at org.apache.solr.core.SolrCore.(SolrCore.Z93F725A07423FE1C889F448B33D21 3F725A07423FE1C889F448B33D21F46Z:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread .java:748) Caused by: org.apache.solr.common.SolrException: Error opening new searcher at org.apache.solr.core.SolrCore.openNewSearcher(SolrCore.java:1477) at org.apache.solr.core. SolrCore.getSearcher(SolrCore.java:1589) at org.apache.solr.core.SolrCore.(SolrCore.Z93F725A07423FE1C889F448B33D21 F46Z:821)... 11 more Caused by: org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/usr/local/pm6/Data/solr/XXXX/data/index/write.lock at org.apache.lucene.store.Lock.obtain(Lock.java:84) at org.apache.lucene.index.IndexWriter.(IndexWriter.java:702) at org.apache.solr.update.SolrIndexWriter.(SolrIndexWriter.java:77) at org.apache.solr.update.SolrIndexWriter.create(SolrIndexWriter.java:64) at org.apache.solr.update.DefaultSolrCoreState.createMainIndexWriter(DefaultSolrCoreState.Z93F725A07423FE1C889 F46Z:821)... 11 更多原因:org.apache.lucene.store.LockObtainFailedException:锁定获取超时:NativeFSLock@/usr/local/pm6/Data/solr/XXXX/data/index/write。 org.apache.lucene.store.Lock.obtain(Lock.java:84) at org.apache.lucene.index.IndexWriter.(IndexWriter.java:702) at org.apache.solr.update.SolrIndexWriter.(SolrIndexWriter. java:77) at org.apache.solr.update.SolrIndexWriter.create(SolrIndexWriter.java:64) at org.apache.solr.update.DefaultSolrCoreState.createMainIndexWriter(DefaultSolrCoreState.Z93F725A07423FE1C889 F448B33D21F46Z:267) at org.apache.solr.update.DefaultSolrCoreState.getIndexWriter(DefaultSolrCoreState.java:110) at org.apache.solr.core.SolrCore.openNewSearcher(SolrCore.java:1440)... 13 more F448B33D21F46Z:267) at org.apache.solr.update.DefaultSolrCoreState.getIndexWriter(DefaultSolrCoreState.java:110) at org.apache.solr.core.SolrCore.openNewSearcher(SolrCore.java:1440)... 13 more

Our SOLR setup is a single SOLR Core per instance per machine.我们的 SOLR 设置是一个 SOLR 核心,每个实例每个机器。 I think the root cause is that the SOLR instance is initialized via the webapp and I am trying to access it via CLI.我认为根本原因是 SOLR 实例是通过 webapp 初始化的,我正在尝试通过 CLI 访问它。 Ideally, I would like to use the same instance created by the webapp.理想情况下,我想使用 webapp 创建的相同实例。

Below is my code that create the solr server via CLI:下面是我通过 CLI 创建 solr 服务器的代码:

//Gets the solr server. 
public synchronized static EmbeddedSolrServer getSolrServerCli() {
    String basePath = "/usr/local/xxx/Data/solr";
    CoreContainer container = new CoreContainer(basePath);
    container.load();
    return new EmbeddedSolrServer(container, "XXXX");
}



//Then add document

 EmbeddedSolrServer server = SolrService.getSolrServerCli();

 UpdateResponse x = server.add(doc);

Any ideas will be appreciated.任何想法将不胜感激。 Thanks谢谢

My solution was using an existing web application entry point to interact with SOLR Index.我的解决方案是使用现有的 web 应用程序入口点与 SOLR 索引进行交互。 I've implemented a standalone application triggered via CLI, which calls a servlet via a rest client.我已经实现了一个通过 CLI 触发的独立应用程序,它通过 rest 客户端调用一个 servlet。 The servlet in turn uses a service class to interact with SOLR Index in a servlet context. servlet 反过来使用服务 class 与 servlet 上下文中的 SOLR 索引进行交互。 Hence concurrency issue was avoided.因此避免了并发问题。

See my post here for more details.有关更多详细信息,请参阅我的帖子。

How to Improve my Java App that migrates millions of records from MariaDB database to a SOLR Server 如何改进我的 Java 应用程序,该应用程序将数百万条记录从 MariaDB 数据库迁移到 SOLR 服务器

@MatsLindh - was my design buddy. @MatsLindh - 是我的设计伙伴。 Thanks Pal.谢谢帕尔。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM