溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。
Fayson的github: https://github.com/fayson/cdhproject
提示:代碼塊部分可以左右滑動查看噢
1
問題重現
當我們在使用ORC文件格式創建Hive表,並且對Hive表的schema進行更改後,然後進行如insert into…select或insert overwrite … select會報錯,以下具體看看報錯。
1.首先我們創建一張ORC格式的Hive表,從插入一行數據。
CREATE TABLE orc_test( s1 date, s2 string, s3 string ) STORED AS ORC LOCATION '/fayson/orc_test'; insert into orc_test values('2015-12-18','25','11111'); select * from orc_test;
(可左右滑動)
2.我們先使用alter命令增加一列到該表,然後對該表進行insert操作。
ALTER TABLE orc_test ADD COLUMNS (testing string); INSERT overwrite table orc_test SELECT * FROM orc_test; INSERT into table orc_test SELECT * FROM orc_test;
(可左右滑動)
3.發現無論是insert還是insert overwrite都會報錯,如下。
----- Diagnostic Messages for this Task: Error: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:179) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row at org.apache.hadoop.hive.ql.exec.vector.VectorMapOperator.process(VectorMapOperator.java:52) at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:170) ... 8 more Caused by: java.lang.NullPointerException at java.lang.System.arraycopy(Native Method) at org.apache.hadoop.io.Text.set(Text.java:225) at org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriterFactory$6.writeValue(VectorExpressionWriterFactory.java:686) at org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriterFactory$VectorExpressionWriterBytes.writeValue(VectorExpressionWriterFactory.java:272) at org.apache.hadoop.hive.ql.exec.vector.VectorFileSinkOperator.getRowObject(VectorFileSinkOperator.java:89) at org.apache.hadoop.hive.ql.exec.vector.VectorFileSinkOperator.processOp(VectorFileSinkOperator.java:76) at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815) at org.apache.hadoop.hive.ql.exec.vector.VectorSelectOperator.processOp(VectorSelectOperator.java:138) at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815) at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:98) at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:157) at org.apache.hadoop.hive.ql.exec.vector.VectorMapOperator.process(VectorMapOperator.java:45) ... 9 more FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask MapReduce Jobs Launched: Stage-Stage-1: Map: 1 HDFS Read: 0 HDFS Write: 0 FAIL Total MapReduce CPU Time Spent: 0 msec
(可左右滑動)
其實這個異常主要是因爲使用ORC格式的文件與Hive的矢量化特性不兼容導致的,本文Fayson會介紹會如何解決這個故障。
- 測試環境
1.CM和CDH版本爲5.15.0
2.採用root用戶操作
3.Hive1.1.0
2
問題解決
2.1
方法1:禁用矢量化
1.禁用矢量化後,再次執行同樣的insert語句。
set hive.vectorized.execution.enabled=false; INSERT overwrite table orc_test SELECT * FROM orc_test; INSERT into table orc_test SELECT * FROM orc_test;
(可左右滑動)
執行成功,沒有報錯。
2.2
方法2:使用Parquet
1.我們drop掉這張表,同樣的操作使用Parquet文件格式再次操作一遍。
CREATE TABLE orc_test( s1 string, s2 string, s3 string ) STORED AS parquet LOCATION '/fayson/orc_test'; insert into orc_test values('2015-12-18','25','11111'); ALTER TABLE orc_test ADD COLUMNS (testing string); INSERT overwrite table orc_test SELECT * FROM orc_test; INSERT into table orc_test SELECT * FROM orc_test;
(可左右滑動)
執行成功,沒有報錯。
3
總結
1.hive.vectorized.execution.enabled參數在CDH5的Hive中默認是開啓的,矢量查詢(Vectorized query) 每次處理數據時會將1024行數據組成一個batch進行處理,而不是一行一行進行處理,這樣能夠顯著提高執行速度。
2.但當該參數開啓後,會與ORC格式文件的Hive表衝突,也會導致本文第一章所描述的報錯,該jira是在Hive2才修復的,所以要在CDH6中才會修復,具體參考一個非常大的jira包:
https://issues.apache.org/jira/browse/HIVE-11981
https://issues.apache.org/jira/browse/HIVE-16314
3.要解決該bug導致的問題,可以禁用矢量化查詢的功能,即:set hive.vectorized.execution.enabled=false或者不要對於Hive表使用ORC格式,而是統一改爲Parquet格式。
4.ORC文件格式的事務支持尚不完善,具體參考《Hive事務管理避坑指南》,所以在CDH中的Hive中使用ORC格式是不建議的,另外Cloudera Impala也不支持ORC格式,如果你在Hive中創建ORC格式的表,也沒辦法達到一份數據,多個計算引擎同時訪問的目的。最後其實ORC格式是Hortonworks家的,Parquet纔是Cloudera的,從兩家產品競爭關係上講,也不會互相支持。所以只要你還在玩CDH5,就別再折騰ORC了。
提示:代碼塊部分可以左右滑動查看噢
爲天地立心,爲生民立命,爲往聖繼絕學,爲萬世開太平。 溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。
推薦關注Hadoop實操,第一時間,分享更多Hadoop乾貨,歡迎轉發和分享。