多线程同时查询报错

【详述】问题详细描述
同时开了30个线程查询报错,
image
【背景】java写了多线程同时查询, 始终保持30个连接查询,有的sql成功,有的sql报错
【业务影响】
【StarRocks版本】 :1.19.2
【集群规模】 3fe(1 follower+2observer)+8be(fe与be混部)
【机器信息】 48C/256G/万兆
【附件】
be.warn.log

  • 并行度:24

  • cbo是否开启:±------------------------------------±------+
    | Variable_name | Value |
    ±------------------------------------±------+
    | cbo_enable_dp_join_reorder | true |
    | cbo_enable_greedy_join_reorder | true |
    | cbo_max_reorder_node_use_dp | 10 |
    | cbo_max_reorder_node_use_exhaustive | 4 |
    | enable_cbo | false |

  • be节点cpu和内存使用率截图

查询的表后台有进行数据导入么?上下文中有其他报错信息么?可以搜索某一个fragment id(fail to open fragment后面的字段),查看下日志中的其他信息

查询运行几十秒会报这个错误

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Put planfragment a4d377ff-74d9-11ec-90cf-78ac445d4f71 to thread pool failed. err = Thread pool is at capacity (4096/4096 tasks running, 2048/2048 tasks queued)
at sun.reflect.GeneratedConstructorAccessor27.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1779)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2135)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1383)
at com.dhgate.monitor.main.ConnectDoris$.readMysql(ConnectDoris.scala:46)
at Demo$ThreadDemo.run(Demo.scala:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

be 下 fragment id 没有其它报错信息 fe下会报错
2022-01-14 09:31:17,669 WARN (starrocks-mysql-nio-pool-3650|232103) [Coordinator.exec():552] exec plan fragment failed, errmsg=Put planfragment a5664133-74d9-11ec-90cf-78ac445d4f6b to thread pool failed. err = Thread pool is at capacity (4096/4096 tasks running, 2048/2048 tasks queued), code: INTERNAL_ERROR, fragmentId=F10, backend=.26:9060
2022-01-14 09:31:17,725 INFO (starrocks-mysql-nio-pool-3650|232103) [StmtExecutor.execute():451] execute Exception. Put planfragment a5664133-74d9-11ec-90cf-78ac445d4f6b to thread pool failed. err = Thread pool is at capacity (4096/4096 tasks running, 2048/2048 tasks queued)

报错的表会有频繁的数据导入么?

没有写入,只有查询

查询执行线程池被占满了。 BE的 配置 fragment_pool_thread_num_max 改成 8192。

在be.conf文件下填加这一句吗
image

是的 然后重启be

您那边都是什么类型的查询?复杂么?都是不同的sql么?

42个不同的sql,有复杂的,有简单的,复杂一点的会失败,单表,多表都有

新的错误
be 的日志


查询中报的错

fail to send batch 这个问题修改be的配置参数brpc_socket_max_unwritten_bytes=1342177280 ,默认1M,可以修改到5M) 。还是会有fail to open fragment么?

fail to open fragment 这个没有报错了,下面这个应该调大哪个参数呢,例如这种报错从哪里可以直接查到应该调哪个参数
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Ocurrs time out with specfied time 299872 MILLISECONDS
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

fail to open fragment那个问题,开了 4096个线程都被占满了,可能是查询比较复杂,并发比较高,可能会有这个问题。 这里会有卡住的问题。可以试下2.0新的pipeline 引擎,针对这个问题有优化。上面Ocurrs time out with specfied time 299872 MILLISECONDS 问题先检查一下be状态是否正常

be状态正常 ,同时查询的10个sql,有的sql单独查一个的情况就会time out ,应该是查询的太复杂了

调整session 变量query_timeout,调大后查看下单sql是否可查询出来,以及查询时间。另外 exec_mem_limit和parallel_fragment_exec_instance_num这两个参数您那边分别设置的多大呢

有时候会报这个错误
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: failed to get tablet. tablet_id=779592, with schema_hash=2140774279, reason=tablet does not exist
at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

这个可能是导入频率过快,后台将版本合并,fe尚未更新元数据导致。可以适当降低导入频率

image
image