我有一堆 Hadoop 序列文件,它们是用我写的一些 Writable 子类编写的。我们称它为 FishWritable。
这个 Writable 运行了一段时间,直到我决定为了清楚起见需要重命名包。所以现在 FishWritable 的完全限定名称是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 的过时和更新类型运行。