vespa - 应用程序初始化期间出错:ClusterSearcher 应具有顶级调度
问题描述
具有多个内容且每个内容具有多个文档的应用程序正在抛出“ClusterSearcher 应该具有顶级调度”。当部署在具有多个内容节点的多节点集群上时。这同样适用于具有单个内容节点的单节点集群。
使用 [Vespa 版本:] 7.51.13
com.yahoo.container.di.componentgraph.core.ComponentNode$ComponentConstructorException:错误构造'com.yahoo.prelude.cluster.ClusterSearcher in acme' 原因:java.lang.IllegalStateException:ClusterSearcher 应该具有顶级调度。
================= services.xml ==============
<?xml version="1.0" encoding="utf-8" ?>
<admin version="2.0">
<adminserver hostalias="admin0"/>
<configservers>
<configserver hostalias="admin0"/>
</configservers>
</admin>
<container id="container" version="1.0">
<config name="search.config.qr-start">
<jvm>
<heapSizeAsPercentageOfPhysicalMemory>50</heapSizeAsPercentageOfPhysicalMemory>
</jvm>
</config>
<document-api />
<http>
<server id="stateless1" port="8080">
</server>
</http>
<search>
<chain id="default" inherits="vespa">
<searcher id="com.acme.search.CatalogSearcher" bundle="sth-search">
<config name="com.acme.search.Searcher">
<redirectsFile>redirects.txt</redirectsFile>
<autoCorrectAPI>https://apps02.acme.com:9815/search/</autoCorrectAPI>
<connectionTimeout>250</connectionTimeout>
<connectionRequestTimeout>250</connectionRequestTimeout>
<socketTimeout>250</socketTimeout>
</config>
</searcher>
</chain>
</search>
<nodes jvmargs="-verbose:gc">
<node hostalias="stateless0"/>
<node hostalias="stateless1"/>
</nodes>
</container>
<content id="sth" version="1.0">
<redundancy>2</redundancy>
<documents>
<document type="sth" mode="index" />
</documents>
<nodes>
<node hostalias="content0" distribution-key="0"/>
<node hostalias="content1" distribution-key="1"/>
</nodes>
</content>
<content id="thesaurus" version="1.0">
<redundancy>2</redundancy>
<documents>
<document type="thesaurus" mode="index"/>
</documents>
<nodes>
<node hostalias="content0" distribution-key="0"/>
<node hostalias="content1" distribution-key="1"/>
</nodes>
</content>
<content id="acme" version="1.0">
<redundancy>2</redundancy>
<documents>
<document type="vc_products" mode="index" />
<document type="vc_thesaurus" mode="index"/>
</documents>
<nodes>
<node hostalias="content0" distribution-key="0"/>
<node hostalias="content1" distribution-key="1"/>
</nodes>
</content>
解决方案
从评论中,您不会在实际部署在多个节点上时得到这个,而是当您尝试在单元测试中实例化模拟应用程序实例时,如 Application.fromApplicationPackage(...)。
原因是 Application 不能完全模拟完整的应用程序,只能模拟无状态的容器部分。在此设置中实例化的 ClusterSearcher 抱怨说它在下游看不到任何真实的内容集群(这是正确的),它不知道它是在模拟设置中创建的。
出于这个原因,您需要为单元测试创建特殊的 services.xmls,因为通常您在生产中使用的那个会产生这样的问题。使用 Application 适用于测试一组组件的特定功能,但不适用于单元测试您的真实生产应用程序。
我们想通过在应用程序中模拟组件集群来改进这一点,但目前没有人在处理它。如果你想尝试一下,代码在 https://github.com/vespa-engine/vespa/tree/master/application
推荐阅读
- kubernetes - 多种环境中的 ArgoCD
- python - 这个数组中有多少列/行?
- google-api - 谷歌一键登录以控制云端硬盘
- python - 从 NETCDF 文件中提取数据的有效方法
- javascript - 如何使用 MomentJs 和 React 比较日期和时间
- bash - scp bash脚本的多个参数
- javascript - 如何将 async / await 与辅助函数一起使用?
- postgresql - 具有大量列的唯一索引
- c# - AutoMapper - 缺少类型映射配置 System.Object
- security - 无法从 Canvas 应用程序中访问 Azure Blob 存储上的文件