SOLR 8.4.1 上传含OpenNLP模型bin文件的配置至ZooKeeper时连接被中止
问题定位
这个报错不要第一时间排查网络、防火墙,场景特征非常明确:仅当配置目录放入OpenNLP的bin模型文件、新增对应fieldType时才会断连,不放大文件时上传完全正常,本质是ZooKeeper默认的单请求大小限制卡了大文件传输。
ZooKeeper默认jute.maxbuffer参数值为4MB,对请求大小超过该阈值的客户端连接会直接主动断开,抛出的异常就是日志里记录的“主机端软件中止了已建立的连接”。几个OpenNLP英语模型单文件体积普遍在几M到十几M,单文件就远超默认4M阈值,上传时传输请求被ZK直接掐断,才会出现断连报错。
分步解决操作
- 调整ZooKeeper服务端的单请求大小上限
如果用的是Solr内置绑定的ZooKeeper(即随Solr一起启动的9983端口节点),需要修改Solr启动脚本的JVM参数,添加-Djute.maxbuffer=104857600(即100MB上限,足够覆盖OpenNLP全套英语模型的体积);如果是独立部署的ZooKeeper集群,需要在ZK服务的启动JVM参数里添加同值配置,重启ZK服务让参数生效。 - 调整ZK上传客户端的对应参数
执行upconfig命令的Solr脚本本身也是ZK客户端,同样需要匹配相同的jute.maxbuffer参数,否则哪怕服务端调大了上限,客户端还是会用默认4M的限制传输,触发断连。两种配置方式二选一:- 临时生效:在执行上传命令前,先设置环境变量
set SOLR_JAVA_OPTS=-Djute.maxbuffer=104857600,再执行原来的bin/solr.cmd zk upconfig命令 - 永久生效:把上面的JVM参数写入Solr的Windows环境配置文件
solr.in.cmd,后续所有ZK操作都会自动加载该参数
- 临时生效:在执行上传命令前,先设置环境变量
- 修正fieldType的模型路径配置
Solr 8.x版本的OpenNLP各工厂类,默认不会直接从配置根目录加载模型文件,需要在每个模型参数值前加上conf/前缀,明确告知Solr从ZooKeeper存储的当前配置目录下查找模型,修正后的配置片段参考:
不添加路径前缀的话,哪怕配置上传成功,Solr节点加载该fieldType时也会报模型文件找不到的错误。<fieldType name="text_opennlp" class="solr.TextField" positionIncrementGap="100" multiValued="true" > <analyzer> <tokenizer class="solr.OpenNLPTokenizerFactory" sentenceModel="conf/en-sent.bin" tokenizerModel="conf/en-token.bin"/> <filter class="solr.OpenNLPPOSFilterFactory" posTaggerModel="conf/en-pos-maxent.bin"/> <filter class="solr.OpenNLPChunkerFilterFactory" chunkerModel="conf/en-chunker.bin"/> <filter class="solr.TypeAsPayloadFilterFactory"/> </analyzer> </fieldType>
避坑提醒
- 不要把这个报错归因为网络、防火墙、端口不通:场景触发条件非常明确,仅当配置目录包含大体积bin文件时才断连,纯文本配置上传完全正常,说明端口连通性、网络链路没有问题。
- 确保服务端和客户端的
jute.maxbuffer参数值完全一致:两边参数不匹配的话,传输大文件时依然会被主动断连。 - 注意模型版本匹配:Solr 8.4.1内置依赖的OpenNLP版本为1.9.3,不要下载过高版本的OpenNLP预训练模型,否则上传完成后加载阶段会抛出模型版本不兼容的错误。
内容的提问来源于stack exchange,提问作者Michał Wieczorek
相关产品推荐
相关产品推荐

