问题现象
在执行含有LIMIT Clause的查询的时候,有的时候会遇到查询失败,并给出如下的报错的情况。
smartcare=# select * from t1 limit 1;
WARNING: timeout while waiting for response
ERROR: Failed to read response from Datanodes datanode1 when ending query
可能原因
- 某一个或几个DataNode状态不正常,比如挂掉,导致DataNode不能正常给Coordinator发送数据。
- 某一个或几个物理节点的磁盘IO占满,分配给查询的IO不足,在指定的时间段内(目前是20S)没有向Coordinator发送数据,导致Coordinator误认为DataNode断开。
- 某一个或几个DataNode上的查询执行时间比较长,在指定的时间段内(目前是20S)没有向Coordinator发送数据,导致Coordinator误认为DataNode断开。
操作步骤
- 首先用cm_ctl query -v检查节点状态,如果报错信息指定的DataNode的状态异常,如果节点挂掉等,对节点进行修复;如果节点状态正常,执行第二步。
- 查看报错信息中DataNode所在物理节点的IO状态(在linux平台下可以用iostat等系统命令查看),如果磁盘空间的IO被占满,那么分析磁盘IO紧张的原因,把磁盘IO降下来,再执行查询;如果磁盘IO状态正常,执行第三部。
- 如果前两部都没有问题,那么一般是因为出错的DataNode上的执行计划过大,导致执行时间过长,这种情况只能通过优化SQL语句来解决。