SolrCloud Configset API上传返回500“ KeeperErrorCode = NoNode”

问题描述

情况

首先,我必须提到我正在使用Solr 8.1.1,并且正在运行默认的“ solr -e cloud”来进行一些测试。它在Windows Azure VM上运行。我正在尝试创建一个PowerShell脚本,该脚本将在SolrCloud上进行一些设置。第一步是上传自定义Configset。如果您删除所有参数,而我将https://lucene.apache.org/solr/guide/8_1/configsets-api.html用作指南和PowerShell命令,则可以归结为以下内容:

Invoke-WebRequest -Uri "http://localhost:8983/solr/admin/configs?action=UPLOAD&name=MyConfig" -Method Post -ContentType "application/octet-stream" -InFile "config.zip"

编辑:为清楚起见,ZIP的内容如下:https://imgur.com/a/OHR1bf1

问题

当我运行上述命令时,却遇到以下错误:

Invoke-WebRequest : { "responseHeader":{ "status":500,"QTime":11},"error":{ "msg":"KeeperErrorCode = NoNode for /configs/MyConfig/lang/contractions_ca.txt","trace":"org.apache.zookeeper.KeeperException$NoNodeException: 
KeeperErrorCode = NoNode for /configs/MyConfig/lang/contractions_ca.txt\r\n\tat org.apache.zookeeper.KeeperException.create(KeeperException.java:114)\r\n\tat 
org.apache.zookeeper.KeeperException.create(KeeperException.java:54)\r\n\tat org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:792)\r\n\tat 
org.apache.solr.common.cloud.SolrZkClient.lambda$create$7(SolrZkClient.java:415)\r\n\tat org.apache.solr.common.cloud.ZkCmdExecutor.retryOperation(ZkCmdExecutor.java:71)\r\n\tat 
org.apache.solr.common.cloud.SolrZkClient.create(SolrZkClient.java:415)\r\n\tat org.apache.solr.handler.admin.ConfigSetsHandler.createZkNodeIfNotExistsAndSetData(ConfigSetsHandler.java:201)\r\n\tat 
org.apache.solr.handler.admin.ConfigSetsHandler.handleConfigUploadRequest(ConfigSetsHandler.java:181)\r\n\tat org.apache.solr.handler.admin.ConfigSetsHandler.handleRequestBody(ConfigSetsHandler.java:111)\r\n\tat 
org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:199)\r\n\tat org.apache.solr.servlet.HttpSolrCall.handleAdmin(HttpSolrCall.java:796)\r\n\tat 
org.apache.solr.servlet.HttpSolrCall.handleAdminRequest(HttpSolrCall.java:762)\r\n\tat org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:522)\r\n\tat 
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:397)\r\n\tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:343)\r\n\tat 
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)\r\n\tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)\r\n\tat 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)\r\n\tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)\r\n\tat 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\r\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)\r\n\tat 
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1588)\r\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)\r\n\tat 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)\r\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)\r\n\tat 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)\r\n\tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1557)\r\n\tat 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)\r\n\tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)\r\n\tat 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)\r\n\tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)\r\n\tat 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)\r\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\r\n\tat 
org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)\r\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\r\n\tat 
org.eclipse.jetty.server.Server.handle(Server.java:502)\r\n\tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)\r\n\tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)\r\n\tat 
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)\r\n\tat org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)\r\n\tat 
org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)\r\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)\r\n\tat 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)\r\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)\r\n\tat 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)\r\n\tat org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)\r\n\tat 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)\r\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)\r\n\tat java.lang.Thread.run(Thread.java:748)\r\n","code":500}}
At line:1 char:1

观察

当我第一次“失败”时,我已经从我的配置中创建了一个zip文件,其中包含一个附加的顶级文件夹(例如,而不是MyConfig / solrconfig.xml等,例如我的ZIP是MyConfig / MyConfig / solrconfig.xml)。此命令已成功运行,但是第二个命令(创建集合)将失败,因为它找不到solrconfig.xml。这告诉我,ZIP正确存在于请求中,Solr似乎能够处理它,但是一旦我将其更正为实际的configset,它就会大量失败吗?

编辑:有人问我这个问题,以及在zip中使用“ conf”是否可行。正如我在这里提到的,这将导致成功上传(https://imgur.com/a/JHLZ8td),但是如您所见,它与其他配置集不匹配,当您尝试使用该集创建集合时,您将获得Error CREATEing SolrCore 'Test_shard1_replica_n1': Unable to create core [Test_shard1_replica_n1] Caused by: Can't find resource 'solrconfig.xml' in classpath or '/configs/Sitecore',cwd=C:\solr-8.1.1\server

问题

我在做什么错?这是一个错误吗?

解决方法

回顾一下我在SolrCloud上所做的一些工作,我想起了我遇到的一个烦人的问题:

如果我使用Windows UI中的“发送到压缩文件夹”或通过PowerShell中的Compress-Archive创建了该zip,则上传模式配置zip文件时会遇到奇怪的问题。我发现用7Zip压缩数据确实可以。

我怀疑Windows邮政编码(我认为它已经很旧了,而且他们使用许可很久了?)与Solr / ZooKeeper如何处理再次提取文件之间存在某些不兼容?

,

我在没有使用 Windows 邮政编码的情况下遇到了同样的问题。我试图从包含带有一堆文件的“lang”子目录的 conf 目录将配置集上传到 Solr 7.7.3。我收到 /configs/_myconfigsetname_/lang/stopwords_eu.txt 的 NoNode 错误。配置集通过 Java 中的递归目录路径动态压缩,使用 Java 的 ZipOutputStream 将每个文件名发送到 Zip 文件。然后将生成的压缩字节发送到 Solr/Zookeeper。

此代码适用于没有子目录的 conf 目录。原来,当有子目录时,需要先为该目录创建一个ZipEntry(eg lang/),然后才能将文件添加到Zip流中,例如lang/stopwords_eu.txt

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...