• 1. FileSystem各种用于操作文件的方法1、创建文件方法create: public abstract FSDataOutputStream create(Path f,         FsPermission permission,//权限         boolean overwrite,//是否覆盖         int bufferSize,//用于写文件所需的缓存大小         short replication,//备份数,默认情况下为1         long blockSize,//块大小,默认为64MB         Progressable progress);//进度函数,用于实时获取文件的写入进度  
  • 2. 2、读取文件的内容方法open:public abstract FSDataInputStream open(Path f, int bufferSize)throws IOException; FileSystem的open方法返回一个FSDataInputStream,实现了Seekable、PositionedReadable这两个接口,支持随机访问读取文件,可以通过指定开始读取的位置
  • 3. 3、目录创建mkdirs可以指定文件的权限或使用默认的路径。对于指定的path,会创建不存在的父目录( 可以用exits来判断路径是否存在)。 例: FileSystem.creat(new Path("Training/testbed/LV/Out"), true);
  • 4. 4、文件的复制、移动()FileSystem中有两种复制:copyFromLocalFile和copyToLocalFile。 fs.copyFromLocalFile(new Path("/testbed/in"), new Path("/Training/testbed/LV")); 文件的移动可以看成是文件的复制再将源文件删除 moveFromLocalFile和moveToLocalFile Path s=new Path("/Training/"); fs.deleteOnExit(s);
  • 5. SequenceFile SequenceFile的存储类似于Log文件,所不同的是Log File的每条记录的是纯文本数据,而SequenceFile的每条记录是可序列化的字符数组。 SequenceFile可通过如下API来完成新记录的添加操作: fileWriter.append(key,value) 可以看到,每条记录以键值对的方式进行组织,但前提是Key和Value需具备序列化和反序列化的功能。 Hadoop预定义了一些Key Class和Value Class,他们直接或间接实现了Writable接口,满足了该功能,包括: Text 等同于Java中的String IntWritable 等同于Java中的Int BooleanWritable 等同于Java中的Boolean
  • 6. 存储结构在存储结构上,SequenceFile主要由一个Header后跟多条Record组成,如图所示:
  • 7. Header主要包含了Key classname,Value classname,存储压缩算法,用户自定义元数据等信息,此外,还包含了一些同步标识,用于快速定位到记录的边界。 每条Record以键值对的方式进行存储,用来表示它的字符数组可依次解析成:记录的长度、Key的长度、Key值和Value值,并且Value值的结构取决于该记录是否被压缩。
  • 8. SequenceFile读/写 操作Configuration conf=new Configuration(); FileSystem fs=FileSystem.get(conf); Path seqFile=new Path("seqFile.seq"); //Reader内部类用于文件的读取操作 SequenceFile.Reader reader=new SequenceFile.Reader(fs,seqFile,conf); //Writer内部类用于文件的写操作,假设Key和Value都为Text类型 SequenceFile.Writer writer=new SequenceFile.Writer(fs,conf,seqFile,Text.class,Text.class); //通过writer向文档中写入记录 writer.append(new Text("key"),new Text("value")); IOUtils.closeStream(writer); //关闭write流 //通过reader从文档中读取记录 Text key=new Text(); Text value=new Text(); while(reader.next(key,value)){ System.out.println(key); System.out.println(value); } IOUtils.closeStream(reader);//关闭read流
  • 9. 实例public class sequence { public static FileSystem fs; public static final String Output_path="/Training/testbed/zj/in/A.txt"; public static Random random=new Random(); private static final String[] DATA={ "One,two,buckle my shoe", "Three,four,shut the door", "Five,six,pick up sticks", "Seven,eight,lay them straight", "Nine,ten,a big fat hen" }; public static Configuration conf=new Configuration();
  • 10. public static void write(String pathStr) throws IOException{ Path path=new Path(pathStr); FileSystem fs=FileSystem.get(URI.create(pathStr), conf); SequenceFile.Writer writer=SequenceFile.createWriter(fs, conf, path, Text.class, IntWritable.class); // 通过createWriter()静态方法创建SequenceFile对象,并返SequenceFile.Writer实例 Text key=new Text(); IntWritable value=new IntWritable(); for(int i=0;i
  • 11. public static void read(String pathStr) throws IOException{ FileSystem fs=FileSystem.get(URI.create(pathStr), conf); SequenceFile.Reader reader=new SequenceFile.Reader(fs, new Path(pathStr), conf); Text key=new Text(); IntWritable value=new IntWritable(); while(reader.next(key, value)){ System.out.println(key); System.out.println(value); } 创建SequenceFile.Reader实例后反复调用next()方法迭代读取记录的过程。 } public static void main(String[] args) throws IOException { write(Output_path); read(Output_path); } }
  • 12. FileSysterm相关知识FileSystem是一个具有一般文件系统特性的类。在hdfs中有多个管理对象用于管理不同的文件系统对应的信息。 文件系统的信息 1、Statistics类一个FileSystem的统计信息 2、FileStatus文件元数据类(目录也可以视为文件) 3、Key,作为一个特定文件系统的标识 4、文件块类BlockLocation,基于备份冗余机制,一个文件块可能有多个备份,存放在不同的位置
  • 13. Hadoop –MapFile类MapFile其实是排序后的SequenceFile,通过观察其目录结构可以看到MapFile由两部分组成,分别是data和index。
  • 14. index作为文件的数据索引,主要记录了每个Record的key值,以及该Record在文件中的偏移位置。 优缺点: 在MapFile被访问的时候,索引文件会被加载到内存,通过索引映射关系可迅速定位到指定Record所在文件位置,因此,相对SequenceFile而言,MapFile的检索效率是高效的,缺点是会消耗一部分内存来存储index数据。MapFile的KeyClass一定要实现WritableComparable接口,即Key值是可比较的。
  • 15. MapFile 的两个重要方法Writer方法: 解决如何把数据写入文件中 Reader方法: 在MapFile文件依次遍历所有条目的过程类似SequenceFile中的过程:先建立MapFile.Reader实例,然后调用next()方法,知道返回值为false。
  • 16. MapFile读写方法的代码解释Configuration conf=new Configuration();   FileSystem fs=FileSystem.get(conf);   Path mapFile=new Path("mapFile.map");   //Reader内部类用于文件的读取操作    MapFile.Reader reader=new MapFile.Reader(fs,mapFile.toString(),conf);   //Writer内部类用于文件的写操作,假设Key和Value都为Text类型    MapFile.Writer writer=new MapFile.Writer(conf,fs,mapFile.toString(),Text.class,Text.class);   //通过writer向文档中写入记录    writer.append(new Text("key"),new Text("value"));   IOUtils.closeStream(writer);//关闭write流    //通过reader从文档中读取记录    Text key=new Text();   Text value=new Text();   while(reader.next(key,value)){       System.out.println(key);       System.out.println(key);   }   IOUtils.closeStream(reader);//关闭read流