当 hive.execution.engine 设置为 MR 时,Hive 查询失败,当设置为 Tez 时,它们可以工作?

问题描述 投票:0回答:1

我在工作中使用 HDP 2.1 沙箱。 jar 文件列出的 hive 版本是:

hive-exec-0.13.0.2.1.1.0-385.jar

我在 HDFS 中创建了一个包含天气信息的目录。实际信息位于具有以下 5 个字段的文本文件中(usafid:string,obsdate:string,winddir:int,windspeed:int,visibility:double), 例如。文件内容是:

  • 725805 201301010853 70 8 10.0
  • 725805 201301010953 350 6 10.0
  • 725805 201301011053 20 11 10.0
  • 725805 201301011153 20 8 10.0

我现在使用 SQL 命令覆盖 HIVE 表

CREATE DATABASE weather;
USE weather;
CREATE EXTERNAL TABLE IF NOT EXISTS wind( 
    usafid     STRING,
    obsdate    STRING,
    winddir    INT,
    windspeed  INT,
   visibility DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES  TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/WEATHER/PROCESSED/WIND_RECORDS';

当我运行查询

SELECT * from wind;
时,它工作正常。但是,如果我运行查询
SELECT * from wind WHERE wind = 3;
,hive 会启动 MR 作业并失败并显示以下堆栈跟踪:

2014-10-29 00:10:58,975 ERROR [IPC Server handler 3 on 52990] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1414566304731_0001_m_000000_0 - exited : java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 0
    at org.apache.hadoop.hive.ql.exec.Utilities.getBaseWork(Utilities.java:284)
    at org.apache.hadoop.hive.ql.exec.Utilities.getMapWork(Utilities.java:250)
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.init(HiveInputFormat.java:256)
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.pushProjectionsAndFilters(HiveInputFormat.java:383)
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.pushProjectionsAndFilters(HiveInputFormat.java:376)
    at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getRecordReader(CombineHiveInputFormat.java:552)
    at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.<init>(MapTask.java:168)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:409)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1557)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
    at java.beans.XMLDecoder.readObject(XMLDecoder.java:250)
    at org.apache.hadoop.hive.ql.exec.Utilities.deserializeObject(Utilities.java:679)
    at org.apache.hadoop.hive.ql.exec.Utilities.deserializePlan(Utilities.java:622)
    at org.apache.hadoop.hive.ql.exec.Utilities.getBaseWork(Utilities.java:272)

我做了很多研究和挖掘,并能够在解析“查询计划”期间跟踪错误。任何带有“WHERE”子句的查询都会失败。如果我使用命令将执行引擎设置为 Tez,则查询运行良好。

set hive.execution.engine=tez; 

不确定发生了什么以及为什么在

hive.execution.engine=mr
(我相信这是默认设置)时失败?

编辑:我设置了一个 3 节点集群并使用 Ambari 来安装和设置 HDP 2.1。我无法在 3 节点集群上重现该问题。看起来该问题仅在独立 VM HDP 2.1 中出现。

hadoop hive hortonworks-data-platform
1个回答
0
投票

确实,

mr
默认值;但是,请记住 Hive 0.13.0 已被弃用,并且“它可能会在没有进一步警告的情况下被删除”。请考虑 Tez 和 Spark 是更好的选择。

另一方面,列

wind
在您的架构中不存在。我最好的猜测是,异常
ArrayIndexOutOfBoundsException
意味着未找到列
wind
,而 Tez 可以忽略它的不存在并完成查询。

© www.soinside.com 2019 - 2024. All rights reserved.