datax->hdfsreader->orc文件读取出错ArrayIndexOutOfBoundsException: 6

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

有时间在研究写的时候如何控制版本号。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值