簡體   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

我有一個 web 應用程序在 Tomcat 中運行,帶有 SQL 數據庫和 Z48B3DBABE8D6CACAD2223B7BEZ 后端。

該任務正在實現 webapp 觸發功能的獨立增強版本。 現有的 Webapp 版本涉及從 SQL 數據庫(也存在於 SOLR 中)查詢特定產品並在 SOLR 引擎中重新索引/更新它。

我正在通過 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

我的 CLI 版本與 web 略有不同,它從 SQL 數據庫中查詢所有產品並嘗試重新索引所有產品。

我的程序在嘗試將文檔添加到 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

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

經過一番調查。 我看到一些帖子建議以下內容:

  1. 在 solrConfig.xml 中將 lockType 更改為 simple,該潛在修復沒有任何區別。
  2. 刪除 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 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) 在 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 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

我們的 SOLR 設置是一個 SOLR 核心,每個實例每個機器。 我認為根本原因是 SOLR 實例是通過 webapp 初始化的,我正在嘗試通過 CLI 訪問它。 理想情況下,我想使用 webapp 創建的相同實例。

下面是我通過 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);

任何想法將不勝感激。 謝謝

我的解決方案是使用現有的 web 應用程序入口點與 SOLR 索引進行交互。 我已經實現了一個通過 CLI 觸發的獨立應用程序,它通過 rest 客戶端調用一個 servlet。 servlet 反過來使用服務 class 與 servlet 上下文中的 SOLR 索引進行交互。 因此避免了並發問題。

有關更多詳細信息,請參閱我的帖子。

如何改進我的 Java 應用程序,該應用程序將數百萬條記錄從 MariaDB 數據庫遷移到 SOLR 服務器

@MatsLindh - 是我的設計伙伴。 謝謝帕爾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM