[英]Hive queries fail when the hive.execution.engine is set to MR, they work when set to Tez?
我在工作中使用 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),例如文件內容是:
我現在正在使用 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 中表現出來。
確實, mr
是默認值; 但是,請記住 Hive 0.13.0 已被棄用,並且“它可能會在沒有進一步警告的情況下被刪除”。 請考慮 Tez 和 Spark 是更好的選擇。
另一方面,您的架構中不存在列wind
。 我最好的猜測是異常ArrayIndexOutOfBoundsException
意味着沒有找到列wind
,而 Tez 可以忽略它的不存在並完成查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.