处理hadoop sequencefile中的可写完全限定名称更改

unguejic  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(293)

我有一堆hadoop序列文件,它们是用我编写的一些可写子类编写的。我们称之为可写的。
这个可写的工作了一段时间,直到我决定有一个包重命名为清晰的需要。现在fishwriteable的完全限定名是 com.vertebrates.fishes.FishWritable 而不是 com.mammals.fishes.FishWritable . 鉴于有关一揽子计划的范围是如何演变的,这是一个合理的变化。
然后我发现我的mapreduce作业都不会运行,因为它们在尝试初始化sequencefilerecordreader时崩溃:

java.lang.RuntimeException: java.io.IOException: WritableName can't load class: com.mammals.fishes.FishWritable
at org.apache.hadoop.io.SequenceFile$Reader.getKeyClass(SequenceFile.java:1949)
at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1899)
...

处理这个问题的两个选择是显而易见的。我可以简单地重新运行以前的所有作业,以使用最新的键类名重新生成输出,并按顺序运行任何依赖作业。这显然非常耗时,有时甚至不可能。
另一种可能是编写一个简单的作业,将sequencefile作为文本读取,并用新示例替换类名的任何示例。这基本上是一种方法#1,有一个微调,使之不那么复杂。如果我有很多大文件,那还是很不切实际的。
有没有更好的方法来处理SequenceFile中使用的完全限定类名的重构?理想情况下,如果找不到指定的回退类名,我会寻找一些方法来指定一个新的回退类名,以允许对这个sequencefile的日期和更新类型运行。

dsf9zpds

dsf9zpds1#

看看sequencefile的规范,很明显没有考虑其他类名。
如果我不能重新编写数据,还有一个选择是让com.maleminals.fishes.writable扩展com.verticates.fishes.writable,并将其注解为deprecated,这样就不会有人意外地将代码添加到空 Package 器中。在足够长的时间之后,用旧类编写的数据将被废弃,您将能够安全地删除该类。

k5ifujac

k5ifujac2#

这个 org.apache.hadoop.io.WritableName 异常堆栈跟踪中提到的类有一些有用的方法。
从文件中:
实用程序,允许重命名可写实现类,而不使包含其类名的文件无效。

// Add an alternate name for a class.
public static void addName(Class writableClass, String name)

在您的情况下,您可以在读取SequenceFile之前调用此命令:

WritableName.addName(com.vertebrates.fishes.FishWritable.class, "com.mammals.fishes.FishWritable");

这样,当试图读取 com.mammals.fishes.FishWritable 从一个旧的序列文件,新的 com.vertebrates.fishes.FishWritable 将使用类。
附:为什么鱼在哺乳动物 Package 中放在第一位?;)

相关问题