hadoop文件系统HDFS
hadoop文件系统的特点:
1、最大支持PB级别的数据;
2、流式数据访问,一次写入,多次读取;
3、不可靠的文件,故障率高的商用硬件上能运行;
4、不适应低时间延迟的数据访问,不适应处理大量小文件,不适应多用户写入任意修改文件
在一个HDFS集群中,只有一台计算机做名称节点NameNode,一台计算机做第二名称节点SecondaryNameNode,其他及其均为数据节点DataNode。在伪分布式的运行方式下,三种节点由同一机器担任。
NameNode:HDFS的管理者。SecondaryNameNode:NameNode的辅助者,帮助NameNode处理一些合并事宜,它不是NameNode的热备份,功能与NameNode不同。
DataNode:以数据块的方式分散存储HDFS的文件。HDFS将大文件分割为数据块,每个数据块为64M(可以设置),然后将这些数据块以普通文件形式存放到数据节点上。为了防止DataNode意外失效,HDFS会把每个数据块复制若干存放到不同的数据节点。
帮助命令:hadoop fs -help
HDFS文件操作:
1、文件复制:功能效果同hadoop fs -put
在~/filecopy存放源码、编译和打包结果。
1 public static void main(String[] args) throws Exception{ 2 if (args.length != 2){ 3 System.err.println("Usage: filecopy <source> <target>"); 4 System.exit(2); 5 } 6 Configuration conf = new Configuration(); 7 InputStream in = new BufferedInputStream(new FileInputStream(args[0])); 8 FileSystem fs = FileSystem.get(URI.create(args[1]), conf); 9 OutputStream out = fs.create(new Path(args[1])); 10 IOUtils.copyBytes(in, out, 4096, true); 11 }
执行命令: ./bin/hadoop jar ~/filecopy/filecopy.jar com.setup.hadoop.FileCopy README.txt readme.txt
效果: 将文件复制到 HDFS,另存为 readme.txt 文件
检查结果: ./bin/hadoop fs -ls
./bin/hadoop fs -ls cat readme.txt
2、删除文件: 同名令:hadoop fs -rm
1 public static void main(String[] args) throws Exception{ 2 if (args.length != 1){ 3 System.err.println("Usage: filedelete <target>"); 4 System.exit(2); 5 } 6 Configuration conf = new Configuration(); 7 FileSystem fs = FileSystem.get(URI.create(args[0]), conf); 8 fs.delete(new Path(args[0]), false); 9 }
3、读取文件:FileCat.java
同命令:hadoop fs -cat
4、获取文件属性信息。
同命令:hadoop fs -ls
1 public static void main(String[] args) throws Exception{ 2 if (args.length != 1){ 3 System.err.println("Usage: fileinfo <source>"); 4 System.exit(2); 5 } 6 Configuration conf = new Configuration(); 7 FileSystem fs = FileSystem.get(URI.create(args[0]),conf); 8 FileStatus stat = fs.getFileStatus(new Path(args[0])); 9 System.out.println(stat.getPath()); 10 System.out.println(stat.getLen()); 11 System.out.println(stat.getModificationTime()); 12 System.out.println(stat.getOwner()); 13 System.out.println(stat.getReplication()); 14 System.out.println(stat.getBlockSize()); 15 System.out.println(stat.getGroup()); 16 System.out.println(stat.getPermission().toString()); 17 }
注意要引入的包:
1 import java.net.URI; 2 import java.io.InputStream; 3 import java.io.OutputStream; 4 import java.io.BufferedInputStream; 5 import java.io.FileInputStream; 6 import org.apache.hadoop.conf.Configuration; 7 import org.apache.hadoop.fs.FileSystem; 8 import org.apache.hadoop.fs.FSDataInputStream; 9 import org.apache.hadoop.fs.Path; 10 import org.apache.hadoop.io.IOUtils;