Doris报错:failed to send brpc when exchange的解决过程

 更新时间:2025年11月06日 09:24:30   作者:fzip  
Doris中出现"failedtosendbrpcwhenexchange"错误通常是由于BRPC通信异常导致的,可能的原因包括网络问题、BRPC配置不合理、节点负载过高、数据倾斜、节点状态异常和版本兼容性问题,通过排查网络、调整BRPC参数、优化SQL和表结构等方法可以解决该问题

Doris 中出现 “failed to send brpc when exchange” 错误,通常与 Doris 的分布式执行框架中 BRPC 通信异常相关,主要发生在查询执行过程中不同节点(FE/BE 或 BE 之间)通过 Exchange 算子传递数据时。

可能的原因及解决方案

1. 网络问题

节点间网络不通或延迟过高

  • 检查 BE 节点之间的网络连通性(使用 pingtelnet 等工具)。
  • 查看网络是否存在丢包(mtrtraceroute 命令),高延迟或丢包会导致 BRPC 通信超时。
  • 确保节点间防火墙规则允许 Doris 通信端口(默认的 BRPC 端口等)。

结果

  • ping是通的,telnet也是通的,防火墙没有开

2. BRPC 配置不合理

  • 超时时间过短

be.conf 中适当调大 BRPC 相关超时参数:

brpc_arrow_flight_work_pool_max_queue_size=-1
brpc_arrow_flight_work_pool_threads=-1
brpc_connection_check_timeout_ms=10000
brpc_heavy_work_pool_max_queue_size=-1
brpc_heavy_work_pool_threads=-1
brpc_idle_timeout_sec=-1
brpc_light_work_pool_max_queue_size=-1
brpc_light_work_pool_threads=-1
brpc_max_body_size=3147483648
brpc_num_threads=256
brpc_port=8060
brpc_socket_max_unwritten_bytes=-1
brpc_streaming_client_batch_bytes=262144
  • 连接数限制

检查是否因连接数过多导致失败,可调整 grpc_threadmgr_threads_nums 4096 等参数。

结果

3. 节点负载过高

BE 节点内存/CPU 耗尽

  • 查看 BE 节点的资源使用情况(topfree 命令),若内存不足可能导致 BRPC 线程无法正常工作。
  • 临时减轻负载: kill 大查询任务,避免资源竞争。
  • 长期优化:增加 BE 节点数量,或调整查询并发度(max_concurrent_queries)。

结果

  • 内存正常、cpu正常、磁盘IO异常(使用iotop可以看到有很多BaseCompaction)

4. 数据倾斜或查询计划不合理

Exchange 算子处理数据量过大

  • 某些查询可能因数据倾斜导致单个 Exchange 节点需要处理远超预期的数据量,引发通信失败。
  • 优化 SQL:检查是否有大表 Join 未指定合理的分桶键,或聚合操作未做预聚合。
  • 查看查询计划:通过 EXPLAIN 分析 Exchange 算子的分布情况,调整分桶策略或 SQL 写法。

结果

  • 大表分桶数量设置不合理

5. 节点状态异常

BE 节点心跳异常或已下线

  • 检查 FE 控制台(http://fe_host:8030)的 “Backends” 页面,确认所有 BE 节点状态正常(Alive)。
  • 若节点异常,尝试重启 BE 服务:sh bin/stop_be.sh && sh bin/start_be.sh
  • 检查 BE 日志(log/be.INFO),搜索 “brpc” 相关错误信息,定位具体故障节点。

结果

  • 节点都正常

6. 版本兼容性问题

若近期升级过 Doris 版本,可能存在 BRPC 协议不兼容的情况,建议:

  • 确认所有节点(FE/BE)版本一致。
  • 参考官方升级文档,检查是否遗漏了某些配置项的更新。

结果

  • 不存在版本兼容问题

排查步骤建议

  1. 查看 FE 日志(log/fe.INFO)和对应 BE 节点的日志(log/be.INFO),定位具体是哪个节点间的通信失败。
  2. 检查涉事节点的网络和资源状态。
  3. 针对频繁出现该错误的查询,优化其 SQL 或表结构。
  4. 逐步调整 BRPC 相关参数,观察是否改善。
  5. 通过be.INFO查看每个query的实例数量:

cat ./be.INFO |grep "total fragment num on current host"|awk '{print $1"-"$2,$6,$16,$23}'|awk -F '[ ,]' '$4>100 {print $0}'

上千的特别大概率都是不合理的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • GBase 8s数据库主键约束、唯一约束和唯一索引的区别解析

    GBase 8s数据库主键约束、唯一约束和唯一索引的区别解析

    这篇文章主要介绍了GBase 8s数据库主键约束、唯一约束和唯一索引的区别,通过示例代码给大家说明这三者之间的区别,感兴趣的朋友一起看看吧
    2022-02-02
  • Navicat运行sql文件导入数据不全或导入失败的解决方案

    Navicat运行sql文件导入数据不全或导入失败的解决方案

    最近导出数据库到另一个服务器,遇到这个问题,下面这篇文章主要给大家介绍了关于Navicat运行sql文件导入数据不全或导入失败的解决方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 在数据库中如何高效的实现订座功能

    在数据库中如何高效的实现订座功能

    这篇文章主要给大家介绍了关于在数据库中如何高效的实现订座功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 使用alwayson后如何收缩数据库日志的方法详解

    使用alwayson后如何收缩数据库日志的方法详解

    这篇文章主要介绍了使用alwayson后如何收缩数据库日志,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 数据库 三范式最简单最易记的解释

    数据库 三范式最简单最易记的解释

    数据库 三范式最简单最易记的解释,整理一下方便大家记忆。
    2009-07-07
  • SQL之Join的使用详解

    SQL之Join的使用详解

    关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面就为大家介绍一下相关资料,需要的朋友可以参考下
    2020-09-09
  • SQL表连接图解

    SQL表连接图解

    估计很多人在学习SQL表连接的时候都会被各种类型的表连接搞得稀里糊涂的,现在好了,有了下面的图,就可以很直观的区分各种表连接了
    2014-12-12
  • 分布式缓存Redis与Memcached的优缺点区别比较

    分布式缓存Redis与Memcached的优缺点区别比较

    Redis和Memcached都是基于内存key-value的数据存储系统。两者都可以通过缓存数据结果,HTML片段或其他可能产生成本很高的内容来帮助加快应用程序的速度。与memcached相比,Redis功能更强大,更受欢迎并且得到更好的支持。
    2022-12-12
  • 利用Navicat Premium导出数据库表结构信息至Excel的方法

    利用Navicat Premium导出数据库表结构信息至Excel的方法

    这篇文章主要介绍了利用Navicat Premium导出数据库表结构信息至Excel的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 浅谈为什么数据库字段建议设置为NOT NULL

    浅谈为什么数据库字段建议设置为NOT NULL

    本文主要介绍了MySQL数据库中将字段设置为NOT NULL的性能和优缺点,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12

最新评论