今天在学习Hadoop的I/O操作时,对于基于文件的数据结构SequenceFile这个类的使用时遇到了一个问题,我是基于Hadoop-2.8.5。其中在调用SequenceFile的createWriter(FileSystem fs,Configuration conf,Path path,Writable key,Writable value)方法和SequenceFile.Reader(FileSystem fs,Path path,Configuration conf)构造器时,编译器对其划线并显示is deprecated标识,这表示此方法或构造器已经被抛弃,并可能在以后的新API中删除掉。
并给出了新的建议采用
createWriter(Configuration conf,Option...option);
new Read(Configuration conf,Option...option);
参看下官方API文档,废除了很多的createWriter和Reader重载的方法和构造函数,Option这个参数更为抽象,它封装了原来的参数,这样会更加灵活。下面截选了一部分源码:(从中可以看到,Option封装了废除的方法中的参数,这样调用方法更加灵活且耦合度更低。)
public static Option blockSize(long value) {
return new BlockSizeOption(value);
}
public static Option progressable(Progressable value) {
return new ProgressableOption(value);
}
public static Option keyClass(Class<?> value) {
return new KeyClassOption(value);
}
public static Option valueClass(Class<?> value) {
return new ValueClassOption(value);
}
public static Option metadata(Metadata value) {
return new MetadataOption(value);
}
public static Option compression(CompressionType value) {
return new CompressionOption(value);
}
public static Option compression(CompressionType value,
CompressionCodec codec) {
return new CompressionOption(value, codec);
}
那么之前敲入的代码需要变更为如下:
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path path = new Path(uri);
IntWritable key = new IntWritable();
Text value = new Text();
SequenceFile.Writer writer = null;
try {
//writer=SequenceFile.createWriter(fs, conf, path, key.getClass(),value.getClass());//被弃用的方法
SequenceFile.Writer.Option optionfile=Writer.file(path);
SequenceFile.Writer.Option optionkey=Writer.keyClass(key.getClass());
SequenceFile.Writer.Option optionvalue=Writer.valueClass(value.getClass());
writer=SequenceFile.createWriter(conf, optionfile,optionkey,optionvalue);
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path path = new Path(uri);
SequenceFile.Reader reader = null;
try {
// reader = new SequenceFile.Reader(fs, path, conf);//被弃用的构造器
SequenceFile.Reader.Option optionfile=Reader.file(path);
reader=new SequenceFile.Reader(conf, optionfile);