【案例分享】HetuEngine执行SQL查询返回“No nodes available to run query"错误
问题现象
HetuEngine查询Hive数据,提交SQL语句后被返回如下错误:
..spi.*Exception: No nodes available to run query
at ..execution.scheduler.UniformNodeSelector.computeAssignments(UniformNodeSelector.java:170)
at ..execution.scheduler.DynamicSplitPlacementPolicy.computeAssignments(DynamicSplitPlacementPolicy.java:41)
at ..execution.scheduler.SourcePartitionedScheduler.schedule(SourcePartitionedScheduler.java:305)
at ..execution.scheduler.SourcePartitionedScheduler$1.schedule(SourcePartitionedScheduler.java:168)
at ..execution.scheduler.SqlQueryScheduler.schedule(SqlQueryScheduler.java:550)
问题分析
- 从堆栈信息上大致可确认此错误与任务调度相关。
- 由于HetuEngine查询Hive数据时,是HetuEngine计算实例的Worker节点直接与Hive数据的HDFS交互,通过访问NameNode和DataNode来获取数据。首先确认HetuEngine计算实例运行的节点(即Yarn的NodeManager节点)与Hive数据的HDFS节点网络是正常,排除网络通信因素。
- 根据错误描述
No nodes available
,推测是由于HetuEngine计算实例内没有Worker节点可用,导致任务无法被调度执行。其次进入HetuEngine原生页面,确认当前计算实例有足够个数的、处于Active状态的Worker节点,排除没有可用Worker节点因素。 - 接下来就只能排查配置了。由于HetuEngine与被查询的Hive数据分属不同集群,再看HetuEngine对接Hive数据的配置中存在
hive.force-local-scheduling=true
这个较为不寻常的参数,这个参数的用途是强制将任务调度到与任务要处理的数据所在的Hadoop DataNode节点上(计算感知存储),但前提是HetuEngine计算实例的每个节点与每个DataNode都同在一个机器节点。由此可确定这个参数不能用于此场景,否则会造成HetuEngine计算实例的Coodinator节点错把非本机器节点的任务强制Local执行。
解决方案
在HetuEngine管理节点HSConsole中修改对接Hive数据的配置,删除
hive.force-local-scheduling=true
配置。
- 点赞
- 收藏
- 关注作者
评论(0)