【发布时间】:2018-09-06 01:37:29
【问题描述】:
上下文
我在 GCP Kubernetes Engine 中运行 official Docker Hub Apache Solr 7.4 image。
问题
我需要将 JSON 文档上传到索引。过去,我只有使用bin/post 命令或管理 UI 上传存储在托管 Solr 实例的同一台机器上的文档的经验。
现在我需要从我的机器上传相当多的 JSON 文档到 Docker 容器中的 Solr 实例(准确地说是 86 个文档,每个大约 30MB)。向图像添加如此多的额外数据没有意义。而JSON Formatted Index Updates docs 页面只提供了两个选项:
- 上传与 Solr 实例位于同一台机器上的 JSON 文档或
- 直接在 curl 命令中指定 JSON 文档
我厌倦了使用我希望工作的命令添加文档(请注意,我在这里使用localhost,因为我首先在本地测试 Docker 映像,但想法是一样的):
curl 'http://localhost:8983/solr/my_core/update?commit=true' --data-binary @/my/local/data/part1.json -H 'Content-type:application/json'
但以上返回500 状态码。我尝试了其他一些变体,但都没有奏效。
将外部数据文件上传到 Apache Solr 的最佳方式是什么?
如果您提供一些适合我的上下文的替代解决方案,也会有所帮助。
附加信息
小样本 JSON 文件
只有 2 个文档,但我在尝试将它们上传到文件时得到了相同的结果。
[{"iframe":"<iframe src=\"https:\/\/www.example.com\/embed\/ph5b8e18ce6b447\" frameborder=\"0\" height=\"481\" width=\"608\" scrolling=\"no\"><\/iframe>","main_thumbnail_url":"https:\/\/ci.excdn.com\/file\/201809\/04\/181459731\/original\/(m=eaf8Ggaaaa)(mh=sYnlTgQZyb7M8XKU)8.jpg","title":"Example 1","tags":["t1","t2","t3","t4","t5"],"categories":["a","b","c","d","e","f"],"author_name":null,"duration":501,"views":0,"likes":0,"dislikes":0,"likes_ratio":0.0,"id":4250000},{"iframe":"<iframe src=\"https:\/\/www.example.com\/embed\/ph5b8e18c2943af\" frameborder=\"0\" height=\"481\" width=\"608\" scrolling=\"no\"><\/iframe>","main_thumbnail_url":"https:\/\/ci.excdn.com\/files\/201809\/04\/181459741\/original\/(m=eaf8Ggaaaa)(mh=uumefyKUUQmKHNx0)5.jpg","title":"Example 2","tags":["t1","t2"],"categories":["a","b","c","d","e","f","g","h","i"],"author":null,"duration":53,"views":0,"likes":0,"dislikes":0,"likes_ratio":0.0,"id":4250001}]
堆栈跟踪
{
"responseHeader":{
"status":500,
"QTime":6},
"error":{
"trace":"java.lang.NullPointerException\n\tat org.apache.solr.update.processor.AddSchemaFieldsUpdateProcessorFactory$AddSchemaFieldsUpdateProcessor.mapValueClassesToFieldType(AddSchemaFieldsUpdateProcessorFactory.java:509)\n\tat org.apache.solr.update.processor.AddSchemaFieldsUpdateProcessorFactory$AddSchemaFieldsUpdateProcessor.processAdd(AddSchemaFieldsUpdateProcessorFactory.java:396)\n\tat org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55)\n\tat org.apache.solr.update.processor.FieldMutatingUpdateProcessor.processAdd(FieldMutatingUpdateProcessor.java:118)\n\tat org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55)\n\tat org.apache.solr.update.processor.FieldMutatingUpdateProcessor.processAdd(FieldMutatingUpdateProcessor.java:118)\n\tat org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55)\n\tat org.apache.solr.update.processor.FieldMutatingUpdateProcessor.processAdd(FieldMutatingUpdateProcessor.java:118)\n\tat org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55)\n\tat org.apache.solr.update.processor.FieldMutatingUpdateProcessor.processAdd(FieldMutatingUpdateProcessor.java:118)\n\tat org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55)\n\tat org.apache.solr.update.processor.FieldNameMutatingUpdateProcessorFactory$1.processAdd(FieldNameMutatingUpdateProcessorFactory.java:75)\n\tat org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55)\n\tat org.apache.solr.update.processor.FieldMutatingUpdateProcessor.processAdd(FieldMutatingUpdateProcessor.java:118)\n\tat org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55)\n\tat org.apache.solr.update.processor.AbstractDefaultValueUpdateProcessorFactory$DefaultValueUpdateProcessor.processAdd(AbstractDefaultValueUpdateProcessorFactory.java:92)\n\tat org.apache.solr.handler.loader.JsonLoader$SingleThreadedJsonLoader.handleAdds(JsonLoader.java:501)\n\tat org.apache.solr.handler.loader.JsonLoader$SingleThreadedJsonLoader.processUpdate(JsonLoader.java:145)\n\tat org.apache.solr.handler.loader.JsonLoader$SingleThreadedJsonLoader.load(JsonLoader.java:121)\n\tat org.apache.solr.handler.loader.JsonLoader.load(JsonLoader.java:84)\n\tat org.apache.solr.handler.UpdateRequestHandler$1.load(UpdateRequestHandler.java:97)\n\tat org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:68)\n\tat org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:199)\n\tat org.apache.solr.core.SolrCore.execute(SolrCore.java:2539)\n\tat org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:709)\n\tat org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:515)\n\tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:377)\n\tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:323)\n\tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1634)\n\tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)\n\tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)\n\tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)\n\tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)\n\tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)\n\tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)\n\tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.eclipse.jetty.server.Server.handle(Server.java:531)\n\tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352)\n\tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)\n\tat org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281)\n\tat org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)\n\tat org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)\n\tat org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)\n\tat org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:760)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:678)\n\tat java.base/java.lang.Thread.run(Thread.java:844)\n",
"code":500}}
编辑:
这与我的 JSON 文件的格式有关...我可以毫无问题地上传 Solr example JSON file。
我很确定我的文件是格式正确的 JSON,因为我是通过 saving a Pandas DataFrame as JSON 获得的。 Python 标准json 模块也可以毫无问题地加载文件。所以它必须与 Solr/Java 读取我的文件的方式有关。
【问题讨论】:
-
你得到了哪个错误/堆栈跟踪? Jetty(Solr 内部使用)的默认文件上传大小为 200k,因此您可能会达到上传文件大小限制(我猜它已针对 Solr 的捆绑版本进行了调整,但您可能需要进一步增加该值)
-
@MatsLindh 使用
curl 'http://localhost:8983/solr/my_core/update?commit=true' --data-binary @/my/local/data/part1.json -H 'Content-type:application/json'时,我得到 500 状态码,并在堆栈跟踪RequestHandlerBase java.lang.NullPointerException和HttpSolrCall null:java.lang.NullPointerException中看到两个条目。我用 5KB 的文件试了一下,得到了同样的结果 -
收到 500 错误与收到 400 错误不同 - 实际的错误消息是什么,您是否有可以共享的 JSON 文件来重现该问题?如果可能,将堆栈跟踪与文件一起添加到问题中。
-
文件路径前是否有可能只是缺少
@?这就是你在评论里先说400然后500的原因吗? -
@Harald 你是对的,我在问这个问题时错过了它。 Solr 文档和 curl 手册页指定在上传本地文件时必须使用
@。将@附加到文件路径时,我得到500状态代码。查看更新的问题。