Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at org.apache.orc.OrcFile$WriterVersion.from(OrcFile.java:145)
at org.apache.orc.impl.OrcTail.getWriterVersion(OrcTail.java:74)
at org.apache.orc.impl.ReaderImpl.<init>(ReaderImpl.java:385)
at org.apache.orc.OrcFile.createReader(OrcFile.java:222)
at org.apache.orc.tools.FileDump.getReader(FileDump.java:255)
at org.apache.orc.tools.JsonFileDump.printJsonMetaData(JsonFileDump.java:80)
at org.apache.orc.tools.FileDump.main(FileDump.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:313)
at org.apache.hadoop.util.RunJar.main(RunJar.java:227)
这里说下背景。我们之前用datax 在cdh6.3.2上都hdfs读写都是好好的,生产也上了都ok,
最近需要转移到cdp上,cdp测试环境也测了hdfs的读写 都ok,
但是最近有个问题,cdp生产环境hdfsreader读取orc的时候报这个错 下标越界,一脸茫然,关键是datax这里的错误日志还没打印出来,重新打包后报错详细日志如上。
先说问题很简单。
这里有个获取版本的地方 ,但是枚举只有 01234 和个max。
经过我反复测试,其余的文件id=4 属于hive13083正常。但是这个文件id=6 这里不就是获取value[6] 然后不就是扯大蛋了么,下标在这里就越界了。
这里我就要吐槽了,注意看这里很明显是一个记录hive或者orc版本的枚举,明显有个future就是为了应付后面的版本的升级 id 0123肯定是老版本了,4差不多是新版本,还有未来的版本,你这里这个from方法写的和屎一样,写个大于不好么。。。
flink写入orc文件到hive表,hive表读取报数组越界_Ink__Bamboo的博客-CSDN博客_hive导入orc文件
——————————————————————————————————————————
这个orc文件是从 cdh distcp到cdp的,在cdh上是好好的,到cdp怎么就不行了呢。这里我有空又研究了一下orc的读写,发现 hive-orc.jar这个包就聪明多了,没有用枚举的from方法,自己写了一个方法 不符合1234的就算future
这个时候怎么解决这个问题呢?
hdfsreader读写错误原因是啥?hive-exec有问题,为啥有问题?那个version.from写的垃圾,改下就好了呗。
我们直接github下载hive源码,发现hive-2.1.1直接修复了这个问题。。。那就直接打包试下
GitHub - apache/hive: Apache Hive
pom文件修改
<exec executable="cmd" failοnerrοr="true"> <arg value="/c"/> <arg value="${basedir}/src/scripts/saveVersion.sh"/> <arg value="${project.version}"/> <arg value="${hive.version.shortname}"/> <arg value="${basedir}/src"/> </exec>
修改原因很简单 你如果是在linux环境可以不修改,原文直接是sh
但是windows环境没有sh 只有cmd。
mvn clean package -Pdist -DskipTests -Dmaven.javadoc.skip=true
打好包了之后
替换目录下的hive-exec.jar 。
成功案例
失败案例。
最后结尾说下。其实我这种应该算是治标不治本,但是勉强能用了。
真正的原因应该是hive写的时候采用的高版本 比如 我们cdp是hive3.1.1的 写orc文件的时候会有一个版本号, 比如我debug的时候发现cdh-hive2.1.1版本的orc文件都是 hive13083也就是枚举的4。显而易见当我们采用cdp-3.1.3写orc的时候 版本肯定更高 直接给6
有时间在研究写的时候如何控制版本号。。