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这里的错误日志还没打印出来,重新打包后报错详细日志如上。
先说问题很简单。
![](https://img-blog.csdnimg.cn/2bb9b599ea55498489eb7aeea622f2ca.png)
![](https://img-blog.csdnimg.cn/7df08f1f90984f3bb077a86ab0cc9ec2.png)
这里有个获取版本的地方 ,但是枚举只有 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文件
![](https://img-blog.csdnimg.cn/2297053ca191452e8be5f9568ce33bd4.png)
——————————————————————————————————————————
这个orc文件是从 cdh distcp到cdp的,在cdh上是好好的,到cdp怎么就不行了呢。这里我有空又研究了一下orc的读写,发现 hive-orc.jar这个包就聪明多了,没有用枚举的from方法,自己写了一个方法 不符合1234的就算future
![](https://img-blog.csdnimg.cn/6a15d274b4b6432681c115057ddb48a6.png)
![](https://img-blog.csdnimg.cn/366339a3306043b9b0341f299968fafa.png)
这个时候怎么解决这个问题呢?
hdfsreader读写错误原因是啥?hive-exec有问题,为啥有问题?那个version.from写的垃圾,改下就好了呗。
我们直接github下载hive源码,发现hive-2.1.1直接修复了这个问题。。。那就直接打包试下
GitHub - apache/hive: Apache Hive
pom文件修改
![](https://img-blog.csdnimg.cn/f079118c7cce49c291fe4d24d2cbb124.png)
<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
打好包了之后
![](https://img-blog.csdnimg.cn/9d32beff19664dd192287d7b593a81a9.png)
![](https://img-blog.csdnimg.cn/d2162761d63e45789cb94d02d385d875.png)
替换目录下的hive-exec.jar 。
成功案例
![](https://img-blog.csdnimg.cn/dfc7405801f74127aceec4e72f8eb04a.png)
失败案例。
![](https://img-blog.csdnimg.cn/4b34c00e884a41deaf1d35f507298c66.png)
最后结尾说下。其实我这种应该算是治标不治本,但是勉强能用了。
真正的原因应该是hive写的时候采用的高版本 比如 我们cdp是hive3.1.1的 写orc文件的时候会有一个版本号, 比如我debug的时候发现cdh-hive2.1.1版本的orc文件都是 hive13083也就是枚举的4。显而易见当我们采用cdp-3.1.3写orc的时候 版本肯定更高 直接给6
![](https://img-blog.csdnimg.cn/04cb7b4a45ca4693b9982dcf65d09a5a.png)
有时间在研究写的时候如何控制版本号。。