hive0.13.1 orc兼容性问题fix

简介:

线上使用cdh4.6.0和hive0.13.1,在hive0.11之后开始支持orcfile,hive0.13.1使用的是pb2.5.0,cdh4.6.0是用的2.4.0a,线上测试orcfile,建表正常,但是插入数据时报错报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
java.lang.VerifyError:  class  org.apache.hadoop.hive.ql.io.orc.OrcProto$RowIndex overrides  final  method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;
                 at java.lang.ClassLoader.defineClass1(Native Method)
                 at java.lang.ClassLoader.defineClass(Unknown Source)
                 at java.security.SecureClassLoader.defineClass(Unknown Source)
                 at java.net.URLClassLoader.defineClass(Unknown Source)
                 at java.net.URLClassLoader.access$ 100 (Unknown Source)
                 at java.net.URLClassLoader$ 1 .run(Unknown Source)
                 at java.net.URLClassLoader$ 1 .run(Unknown Source)
                 at java.security.AccessController.doPrivileged(Native Method)
                 at java.net.URLClassLoader.findClass(Unknown Source)
                 at java.lang.ClassLoader.loadClass(Unknown Source)
                 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
                 at java.lang.ClassLoader.loadClass(Unknown Source)
                 at org.apache.hadoop.hive.ql.io.orc.WriterImpl.<init>(WriterImpl.java: 129 )
                 at org.apache.hadoop.hive.ql.io.orc.OrcFile.createWriter(OrcFile.java: 369 )
                 at org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat$OrcRecordWriter.close(OrcOutputFormat.java: 103 )
                 at org.apache.hadoop.hive.ql.exec.Utilities.createEmptyFile(Utilities.java: 3065 )
                 at org.apache.hadoop.hive.ql.exec.Utilities.createDummyFileForEmptyPartition(Utilities.java: 3089 )
                 at org.apache.hadoop.hive.ql.exec.Utilities.getInputPaths(Utilities.java: 3013 )
                 at org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java: 369 )
                 at org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java: 136 )
                 at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java: 153 )
                 at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java: 85 )
                 at org.apache.hadoop.hive.ql.exec.TaskRunner.run(TaskRunner.java: 72 )

从错误可以看出是由于pb兼容问题导致,尝试使用pb2.4.0a编译hive0.13.1:

1.pom.xml文件:

更改

1
<protobuf.version> 2.5 . 0 </protobuf.version>

1
<protobuf.version> 2.4 .0a</protobuf.version>

2.运行mvn进行编译:

1
mvn clean  package  -DskipTests -Phadoop- 2  -Pdist

发现报如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[ERROR] /home/caiguangguang/hive_0.13_debug/ql/src/gen/protobuf/gen-java/
org/apache/hadoop/hive/ql/io/orc/OrcProto.java:[ 9828 , 38 ] cannot find symbolsymbol  
class  Parserlocation:  package  com.google.protobuf[ERROR] 
/home/caiguangguang/hive_0.13_debug/ql/src/gen/protobuf/gen-java/org/apache/hadoop
/hive/ql/io/orc/OrcProto.java:[ 9839 , 31 ] cannot find symbolsymbol  : 
class  Parserlocation:  package  com.google.protobuf
....
[ERROR] /home/caiguangguang/hive_0.13_debug/ql/src/gen/protobuf/gen-java/
org/apache/hadoop/hive/ql/io/orc/OrcProto.java:[ 169 , 9 ] getUnknownFields() 
in org.apache.hadoop.hive.ql.io.orc.OrcProto.IntegerStatistics cannot override 
getUnknownFields() in com.google.protobuf.GeneratedMessage; overridden method 
is  final [ERROR] /home/caiguangguang/hive_0.13_debug/ql/src/gen/protobuf/
gen-java/org/apache/hadoop/hive/ql/io/orc/OrcProto.java:[ 189 , 20
cannot find symbolsymbol  : method parseUnknownField
(com.google.protobuf.CodedInputStream,com.google.protobuf.UnknownFieldSet.
Builder,com.google.protobuf.ExtensionRegistryLite, int )

3.这里

1
hive_0.13_debug/ql/src/gen/protobuf/gen-java/org/apache/hadoop/hive/ql/io/orc/OrcProto.java

是由protoc2.5.0生成的,但是jar包却是2.4.0a的,因此会报错

4.考虑使用2.4.0a的protoc手动生成java代码

1
2
protoc --version
libprotoc  2.4 .0a

这里主要涉及两个proto文件:

1
2
3
protoc ql /src/protobuf/org/apache/hadoop/hive/ql/io/orc/orc_proto .proto --java_out=ql /src/gen/protobuf/gen-java/
protoc . /hcatalog/storage-handlers/hbase/src/protobuf/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpoint .proto
  --java_out=hcatalog /storage-handlers/hbase/src/gen-java/

5.重新编译成功,将hive-exec jar包解压后,可以看到pom.properties中pb的版本已经是2.4.0a了:

1
2
3
4
5
6
META-INF /maven/com .google.protobuf /protobuf-java/pom .properties
#Generated by Maven
#Thu Mar 10 11:50:31 CST 2011
version=2.4.0a
groupId=com.google.protobuf
artifactId=protobuf-java

更换hive-exec jar包之后,测试向orc file的表插入数据也正常。



本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1599128,如需转载请自行联系原作者

相关文章
|
9月前
|
SQL 消息中间件 数据处理
DataX读取Hive Orc格式表丢失数据处理记录
DataX读取Hive Orc格式表丢失数据处理记录
326 0
|
9月前
|
存储 SQL 算法
【Hive】ORC、Parquet等列式存储的优点
【4月更文挑战第14天】【Hive】ORC、Parquet等列式存储的优点
|
SQL 存储 HIVE
hive orc文件读取
支持增删改查建表: create table orc_table(id int, name string) clustered by (id) into 4 buckets stored as orc TBLPROP...
5664 0
|
存储 SQL HIVE
Hive语言手册-ORC
Hive语言手册-ORC LanguageManual ORC ORC File Format Version Introduced in Hive version 0.11.0. Optimized Row Columnar(ORC)文件格式提供了存储Hive数据的高效方法。
2612 0

热门文章

最新文章