前段时间往用户画像的hive表里增加了一个字段,之后提交作业一直报找不到这个方法的错,过了好久才突然想起来,我提交的jar包并没有更新(真是傻)...
更新了jar包之后,出现了local class incompatible这个错,也就是序列化版本不一致的问题。
于是开始各种找解决方案,大部分人的解决方法都是在序列化的class定义中,手动指定一个序列化的版本号,但由于我并不能直接修改Hive表的数据定义,所以这个方法并不可行。实际上,如果你用来编译的jar包与提交的jar包是同一个,一般是不会出现这种问题的,再就是,增加和删除字段通常也不会引发这种问题,只有修改了字段类型时,有一定概率出现。
那么我最后的解决方案,我发现实际上,我存了一部分数据到文件里,调用的方法是saveAsObjectFile,也就是包装后的SequenceFile,所以在我更新jar之后,无法读取用旧的jar存的文件,就是这样(囧,又是一个好傻的错)。我把所有文件都删掉,重新生成之后就好了。
所以,出现这个错误时。
首先,把你的程序用新的jar编译一遍。
其次,检查你提交的jar是不是最新的jar。
之后,检查你是否有之前使用旧的jar包生成的文件。
如果以上三项都没有问题,那么你可以尝试在class中手动指定一个序列化的id。java的bin目录下带有一个可以查看class 序列化版本号的工具,名字叫做serialver,不习惯用命令行的可以使用serialver -show,就会弹出一个小框框,可以自己填啦~