小编Ale*_* A.的帖子

在Hadoop SequenceFile中处理Writables完全限定的名称更改

我有一堆Hadoop SequenceFiles,它们是用我编写的一些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)
...
Run Code Online (Sandbox Code Playgroud)

处理这个问题的几个选项很明显.我可以简单地重新运行以前的所有作业,使用最新的密钥类名重新生成输出,依次运行任何依赖的作业.这显然是非常耗时的,有时甚至是不可能的.

另一种可能性是编写一个简单的作业,将SequenceFile作为文本读取,并用新的实例替换类名的任何实例.这基本上是方法#1,带有调整,使其不那么复杂.如果我有很多大文件,它仍然是不切实际的.

有没有更好的方法来处理SequenceFiles中使用的完全限定类名的重构?理想情况下,我正在寻找一些方法来指定新的回退类名称(如果找不到指定的名称),以允许针对此SequenceFile的日期和更新类型运行.

serialization hadoop sequencefile

6
推荐指数
1
解决办法
949
查看次数

标签 统计

hadoop ×1

sequencefile ×1

serialization ×1