| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Java - MR 读写 orc 之 NoSuchMethodError: hive.ql.exec.vector.VectorizedRowBatch.getMaxSize() -> 正文阅读 |
|
[游戏开发]Java - MR 读写 orc 之 NoSuchMethodError: hive.ql.exec.vector.VectorizedRowBatch.getMaxSize() |
一.引言上一篇文章提到了 Java map-reduce 如何单独读取 ORC 文件以及 RcFile 文件,在同一个 MR 任务下分别读取 RcFile 以及 ORC 文件时,报如下错误:?java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch.getMaxSize()I。完整的异常栈如下:
其中 orc map-reduce 依赖为:
二.问题分析与解决1.是否拥有该方法noSuchMethod 错误首先需要判断是否确实没有该方法,由于之前很多次遇到 noSuchMethod 都是依赖冲突,所以总是上来就按依赖冲突解决,其实很多时候确实是没有该依赖,只需要增加 pom 即可解决。所以查看项目依赖中是否包含?org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch.getMaxSize()I 该方法,检查后发现对应 VectorizedRowBatch 类下无 getMaxSize 方法,所以验证了上面的想法,说明需要引入新的依赖。 Tips: 这里简单说下 getMaxSize()I 这个方法最后面 I 的含义,最后面 I 的含义为该方法对应的返回值,上面报错的第一行其实就是完整的 java 函数签名,转换一下:
除了 I 之外,常见的还有如下返回值签名:
2.寻找对应方法的 jar 包上述?VectorizedRowBatch 类来源于 hive-exec 依赖,该依赖?VectorizedRowBatch 类不包含?getMaxSize()I 方法,所以顺着回去找读取 orc 文件时其内部用到的类来自哪个依赖: 首先根据异常栈第三行找到调用该类的 class 以及其对应的 import? 然后调出快捷搜索框搜索 VectorizedRowBatch: 这下找到了,该方法真实调用的?org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch 方法来源于 hive-storage-api-2.8.1 版本 : 果断加入该依赖重新打包尝试~?
执行后发现依然报错 o(╥﹏╥)o
3.jar包依赖冲突之前提到过 noSuchMethod 的几种常见可能: A.无该 method,引入 pom 依赖解决 B.多 package 拥有该 method,但版本不同,统一版本解决 C.多 package 拥有该 method,签名不同,去除或 exclude 错误 jar 解决 这里属于类型 D,多 jar 包拥有父类,但不都包含对应 method,所以运行继续报错 noSuchMethod,由于读取 rcFile 需要用到 hive-exec 包所以不能按照上面 B,C 的解决方法删除掉该 jar 包,这时候需要用到 maven 依赖的优先级,maven 打包根据 pom 的放置顺序采用最短路径调用,即取最靠上方的依赖,所以这里把 hive-storage-api 依赖挪到 orc-mapreduce 和 hive-exec 上面,读取 orcFile 时优先调用?hive-storage-api 的?VectorizedRowBatch.getMaxSize(),读取 rcFile 和其他文件时,不使用该方法所以忽略,继续调用后续 pom 依赖:
这里简单总结下上面的情况: D.多 package 拥有父类,但只有一个 package 父类拥有对应方法,调整 pom 依赖顺序解决 再次打包尝试任务终于正常运行 🕶
三.总结开发总是遇到 noSuchMethod,而且还是不同类型,只能通过慢慢积累,根据其异常栈一步一步回看源码和原始 jar 才能解决,bug 无止境呀~ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:39:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |