文件系统的作用就是永久存储数据。计算机可以存储数据的地方是内存,硬盘,优盘,SD卡等等。如果计算机断电关机,存放在内存里的数据就没有了,而存放在硬盘优盘SD卡这些上的数据会仍然存在。硬盘优盘SD卡上的数据是以文件的形式存在,文件系统就是文件的组织和处理。总之,凡是断电之后不会消失的数据,就必须由文件系统存储和管理。
从用户的角度来说,文件系统需要提供文件的创建,删除,读,写,追加,重命名,查看属性,更改属性等各种功能。文件夹,也叫目录,它的作用类似容器,保存其他文件夹和文件。于是,各级文件夹和各级文件就共同组成了文件系统的层次,看起来象一棵倒放的树,最上层是最大的目录,也叫根目录,然后这个目录包含子目录和文件,子目录又包含更多的子目录和文件,这棵树的术语叫目录树。
起初,Linux使用的文件系统是Minix文件系统。但Minix系统有不少限制,诸如最大文件尺寸只有64M,文件名最多是14个字符长度。后来,Linux内核加入了VFS,也就是虚拟文件系统Virtual File System。VFS是Linux内核和真正文件系统之间的抽象层,它提供统一的接口,真正的文件系统和Linxu内核必须通过VFS的接口进行沟通。随后,Linux逐步使用基于VFS的ext文件系统,ext2文件系统,ext3文件系统等等。基于VFS,Linux对Windows的FAT和NTFS格式也提供支持。
通常情况下,Linux的文件系统是单机的,也就说,从物理的角度看,文件系统只存储单台计算机的数据。分布式文件系统在物理上分散的计算机上存储数据。比如,NFS(NetWork File System)是一种非常经典的分布式文件系统,它基于VFS,由Sun公司开发的。本质上,NFS是在物理上分散的计算机之间增加了一个客户-服务器层。对NFS,可以这么理解:计算机A有自己的VFS,计算机B也有自己的VFS,那么,如果A想操作B上的文件,A的数据和命令依次通过的路线是:A的VFS-->A的NFS客户端-->网络-->B的NFS服务器端-->B的VFS-->B的文件系统。
Hadoop借鉴了VFS,也引入了虚拟文件系统机制。HDFS是Hadoop虚拟文件系统的一个具体实现。除了HDFS文件系统之外,Hadoop还实现很多其他文件系统,诸如本地文件系统,支持HTTP的HFTP文件系统,支持Amazon的S3文件系统等等。
HDFS从设计上来说,主要考虑以下的特征:超大文件,最大能支持PB级别的数据;流式数据访问,一次写入,多次读取;在不可靠的文件,故障率高的商用硬件上能运行。Hadoop的不利之处,是不适应低时间延迟的数据访问,不适应大量的小文件,也不适应多用户写入任意修改文件的情况。
假设有一个HDFS集群,那么这个集群有且仅有一台计算机做名字节点NameNode,有且仅有一台计算机做第二名字节点SecondaryNameNode,其他机器都是数据节点DataNode。在伪分布式的运行方式下,NameNode,SecodaryNameNode,DataNode都由同一台机器担任。
NameNode是HDFS的管理者。SecondaryNameNode是NameNode的辅助者,帮助NameNode处理一些合并事宜,注意,它不是NameNode的热备份,它的功能跟NameNode是不同的。DataNode以数据块的方式分散存储HDFS的文件。HDFS将大文件分割成数据块,每个数据块是64M,也可以设置成128M或者256M,然后将这些数据块以普通文件的形式存放到数据节点上,为了防止DataNode意外失效,HDFS会将每个数据块复制若干份放到不同的数据节点。
执行”hadoop fs -help”可以看到HDFS的命令行工具和用法。
如前所说,文件系统主要作用是提供文件的创建,删除,读,写,追加,重命名,查看属性,更改属性等各种功能 。在随后部分,本章选取若干功能,给出了HDFS的文件操作示例代码。熟悉这些之后会对HDFS的操作有一个形象了解。这样将来参考Hadoop API的FileSystem类及其相关子类,就可以写出更多的文件系统操作。
这个例子的功能跟”hadoop fs -put”是一样的。创建目录~/filecopy存放源代码、编译和打包结果。在filecopy目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileCopy.java。
|
package com.brianchen.hadoop; import java.net.URI; import java.io.InputStream; import java.io.OutputStream; import java.io.BufferedInputStream; import java.io.FileInputStream; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; public class FileCopy{ public static void main(String[] args) throws Exception{ if (args.length != 2){ System.err.println("Usage: filecopy "); System.exit(2); } Configuration conf = new Configuration(); InputStream in = new BufferedInputStream(new FileInputStream(args[0])); FileSystem fs = FileSystem.get(URI.create(args[1]), conf); OutputStream out = fs.create(new Path(args[1])); IOUtils.copyBytes(in, out, 4096, true); } } |
“cd ~/filecopy”
“javac -cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d ./classes ./src/*.java”
“jar -cvf filecopy.jar -C ./classes/ .”
“cd /home/brian/usr/hadoop/hadoop-1.2.1”
“./bin/hadoop jar ~/filecopy/filecopy.jar com.brianchen.hadoop.FileCopy README.txt readme.txt”
首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,仍然用README.txt做测试,将这个文件复制到HDFS,另存为readme.txt文件。
“./bin/hadoop fs -ls”
执行这个命令可以看到readme.txt是否存在。
“./bin/hadoop fs -ls cat readme.txt”
输出readme.txt文件到屏幕查看其内容。
这个例子的功能跟”hadoop fs -rm”是一样的。创建目录~/filedelete存放源代码、编译和打包结果。在filedelete目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileDelete.java。
|
package com.brianchen.hadoop; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class FileDelete{ public static void main(String[] args) throws Exception{ if (args.length != 1){ System.err.println("Usage: filedelete "); System.exit(2); } Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(args[0]), conf); fs.delete(new Path(args[0]), false); } } |
“cd ~/filedelete”
“javac -cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d ./classes ./src/*.java”
“jar -cvf filedelete.jar -C ./classes/ .”
“cd /home/brian/usr/hadoop/hadoop-1.2.1”
“./bin/hadoop jar ~/filedelete/filedelete.jar com.brianchen.hadoop.FileDelete readme.txt”
首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,删除readme.txt文件。
“./bin/hadoop fs -ls”
执行这个命令可以看到readme.txt是否存在,如果执行正常,readme.txt是不存在的。
这个例子的功能跟”hadoop fs -cat”是一样的。创建目录~/filecat存放源代码、编译和打包结果。在filecat目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileCat.java。
|
package com.brianchen.hadoop; import java.net.URI; import java.io.InputStream; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; public class FileCat{ public static void main(String[] args) throws Exception{ if (args.length != 1){ System.err.println("Usage: filecat "); System.exit(2); } Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(args[0]), conf); InputStream in = null; try{ in = fs.open(new Path(args[0])); IOUtils.copyBytes(in, System.out, 4096, false); }finally{ IOUtils.closeStream(in); } } } |
“cd ~/filecat”
“javac -cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d ./classes ./src/*.java”
“jar -cvf filecat.jar -C ./classes/ .”
“cd /home/brian/usr/hadoop/hadoop-1.2.1”
“./bin/hadoop fs -put README.txt readme.txt”
“./bin/hadoop jar ~/filecat/filecat.jar com.brianchen.hadoop.FileCat readme.txt”
首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,将readme.txt文件内容输出到屏幕。
这个例子的功能跟”hadoop fs -ls”类似。创建目录~/fileinfo存放源代码、编译和打包结果。在fileinfo目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileInfo.java。它获取和输出文件长度,块大小,备份,修改时间,所有者,权限等信息。
|
package com.brianchen.hadoop; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.Path; public class FileInfo{ public static void main(String[] args) throws Exception{ if (args.length != 1){ System.err.println("Usage: fileinfo "); System.exit(2); } Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(args[0]),conf); FileStatus stat = fs.getFileStatus(new Path(args[0])); System.out.println(stat.getPath()); System.out.println(stat.getLen()); System.out.println(stat.getModificationTime()); System.out.println(stat.getOwner()); System.out.println(stat.getReplication()); System.out.println(stat.getBlockSize()); System.out.println(stat.getGroup()); System.out.println(stat.getPermission().toString()); } } |
“cd ~/fileinfo”
“javac -cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d ./classes ./src/*.java”
“jar -cvf fileinfo.jar -C ./classes/ .”
“cd /home/brian/usr/hadoop/hadoop-1.2.1”
“./bin/hadoop fs -put README.txt readme.txt”
“./bin/hadoop jar ~/fileinfo/fileinfo.jar com.brianchen.hadoop.FileInfo readme.txt”
首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,将readme.txt文件的属性信息输出到屏幕。
创建目录~/filelist存放源代码、编译和打包结果。在fileinfo目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileList.java。
|
package com.brianchen.hadoop; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FileUtil; public class FileList{ public static void main(String[] args) throws Exception{ if (args.length != 1){ System.err.println("Usage: filelist "); System.exit(2); } Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(args[0]),conf); FileStatus[] status = fs.listStatus(new Path(args[0])); Path[] listedPaths = FileUtil.stat2Paths(status); for(Path p : listedPaths){ System.out.println(p); } } } |
“cd ~/filelist”
“javac -cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d ./classes ./src/*.java”
“jar -cvf filelist.jar -C ./classes/ .”
“cd /home/brian/usr/hadoop/hadoop-1.2.1”
“./bin/hadoop fs -put README.txt readme.txt”
“./bin/hadoop fs -put README.txt readme2.txt”
“./bin/hadoop jar ~/filelist/filelist.jar com.brianchen.hadoop.FileList hdfs://localhost:9000/user/brian”
首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,然后列出/user/brian下的文件,有两个,分别是readme.txt和readme2.txt。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23439102/viewspace-1119542/ ,如需转载,请注明出处,否则将追究法律责任。