【案例分享】HetuEngine执行SQL查询返回“No nodes available to run query"错误
【摘要】 HetuEngine查询非本集群的Hive数据,由于使用了“hive.force-local-scheduling=true“参数,导致查询无法被HetuEnigne调度执行。
问题现象
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
配置。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)