从零开始学习Hadoop--第3章 HDFS分布式文件系统

原创
2017/01/17 09:13
阅读数 23

1.文件系统从头说

文件系统的作用就是永久存储数据。计算机可以存储数据的地方是内存,硬盘,优盘,SD卡等等。如果计算机断电关机,存放在内存里的数据就没有了,而存放在硬盘优盘SD卡这些上的数据会仍然存在。硬盘优盘SD卡上的数据是以文件的形式存在,文件系统就是文件的组织和处理。总之,凡是断电之后不会消失的数据,就必须由文件系统存储和管理。


从用户的角度来说,文件系统需要提供文件的创建,删除,读,写,追加,重命名,查看属性,更改属性等各种功能。文件夹,也叫目录,它的作用类似容器,保存其他文件夹和文件。于是,各级文件夹和各级文件就共同组成了文件系统的层次,看起来象一棵倒放的树,最上层是最大的目录,也叫根目录,然后这个目录包含子目录和文件,子目录又包含更多的子目录和文件,这棵树的术语叫目录树。


起初,Linux使用的文件系统是Minix文件系统。但Minix系统有不少限制,诸如最大文件尺寸只有64M,文件名最多是14个字符长度。后来,Linux内核加入了VFS,也就是虚拟文件系统VirtualFileSystemVFSLinux内核和真正文件系统之间的抽象层,它提供统一的接口,真正的文件系统和Linxu内核必须通过VFS的接口进行沟通。随后,Linux逐步使用基于VFSext文件系统,ext2文件系统,ext3文件系统等等。基于VFSLinuxWindowsFATNTFS格式也提供支持。


通常情况下,Linux的文件系统是单机的,也就说,从物理的角度看,文件系统只存储单台计算机的数据。分布式文件系统在物理上分散的计算机上存储数据。比如,NFSNetWorkFileSystem)是一种非常经典的分布式文件系统,它基于VFS,由Sun公司开发的。本质上,NFS是在物理上分散的计算机之间增加了一个客户-服务器层。对NFS,可以这么理解:计算机A有自己的VFS,计算机B也有自己的VFS,那么,如果A想操作B上的文件,A的数据和命令依次通过的路线是:AVFS-->ANFS客户端-->网络-->BNFS服务器端-->BVFS-->B的文件系统。









2.Hadoop的文件系统

Hadoop借鉴了VFS,也引入了虚拟文件系统机制。HDFSHadoop虚拟文件系统的一个具体实现。除了HDFS文件系统之外,Hadoop还实现很多其他文件系统,诸如本地文件系统,支持HTTPHFTP文件系统,支持AmazonS3文件系统等等。


HDFS从设计上来说,主要考虑以下的特征:超大文件,最大能支持PB级别的数据;流式数据访问,一次写入,多次读取;在不可靠的文件,故障率高的商用硬件上能运行。Hadoop的不利之处,是不适应低时间延迟的数据访问,不适应大量的小文件,也不适应多用户写入任意修改文件的情况。


假设有一个HDFS集群,那么这个集群有且仅有一台计算机做名字节点NameNode,有且仅有一台计算机做第二名字节点SecondaryNameNode,其他机器都是数据节点DataNode。在伪分布式的运行方式下,NameNodeSecodaryNameNodeDataNode都由同一台机器担任。


NameNodeHDFS的管理者。SecondaryNameNodeNameNode的辅助者,帮助NameNode处理一些合并事宜,注意,它不是NameNode的热备份,它的功能跟NameNode是不同的。DataNode以数据块的方式分散存储HDFS的文件。HDFS将大文件分割成数据块,每个数据块是64M,也可以设置成128M或者256M,然后将这些数据块以普通文件的形式存放到数据节点上,为了防止DataNode意外失效,HDFS会将每个数据块复制若干份放到不同的数据节点。


执行”hadoopfs -help”可以看到HDFS的命令行工具和用法。

如前所说,文件系统主要作用是提供文件的创建,删除,读,写,追加,重命名,查看属性,更改属性等各种功能。在随后部分,本章选取若干功能,给出了HDFS的文件操作示例代码。熟悉这些之后会对HDFS的操作有一个形象了解。这样将来参考HadoopAPIFileSystem类及其相关子类,就可以写出更多的文件系统操作。

3.如何将文件复制到HDFS

3.1 目录和文件结构

这个例子的功能跟”hadoopfs-put”是一样的。创建目录~/filecopy存放源代码、编译和打包结果。在filecopy目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileCopy.java

3.2FileCopy.java文件的源代码


packagecom.brianchen.hadoop;

importjava.net.URI;

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.io.BufferedInputStream;

importjava.io.FileInputStream;


importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.FSDataInputStream;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.IOUtils;


public classFileCopy{

public staticvoid main(String[] args) throws Exception{

if(args.length != 2){

System.err.println("Usage:filecopy <source> <target>");

System.exit(2);

}


Configurationconf = new Configuration();

InputStreamin = new BufferedInputStream(new FileInputStream(args[0]));

FileSystem fs= FileSystem.get(URI.create(args[1]), conf);

OutputStreamout = fs.create(new Path(args[1]));

IOUtils.copyBytes(in,out, 4096, true);

}

}


3.3 编译

cd~/filecopy”

javac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./classes ./src/*.java”

3.4打包

jar-cvf filecopy.jar -C ./classes/ .”

3.5 运行

cd/home/brian/usr/hadoop/hadoop-1.2.1”

./bin/hadoopjar ~/filecopy/filecopy.jar com.brianchen.hadoop.FileCopy README.txtreadme.txt”

首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,仍然用README.txt做测试,将这个文件复制到HDFS,另存为readme.txt文件。

3.6 检查结果

./bin/hadoopfs -ls”

执行这个命令可以看到readme.txt是否存在。

./bin/hadoopfs -ls cat readme.txt”

输出readme.txt文件到屏幕查看其内容。

4.HDFS删除文件

4.1 目录和文件结构

这个例子的功能跟”hadoopfs-rm”是一样的。创建目录~/filedelete存放源代码、编译和打包结果。在filedelete目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileDelete.java

4.2FileDelete.java文件的源代码


packagecom.brianchen.hadoop;


importjava.net.URI;


importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.Path;


public classFileDelete{

public staticvoid main(String[] args) throws Exception{

if(args.length != 1){

System.err.println("Usage:filedelete <target>");

System.exit(2);

}


Configurationconf = new Configuration();

FileSystem fs= FileSystem.get(URI.create(args[0]), conf);

fs.delete(newPath(args[0]), false);

}

}


4.3 编译

cd~/filedelete”

javac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./classes ./src/*.java”

4.4 打包

jar-cvf filedelete.jar -C ./classes/ .”

4.5 运行

cd/home/brian/usr/hadoop/hadoop-1.2.1”

./bin/hadoopjar ~/filedelete/filedelete.jar com.brianchen.hadoop.FileDeletereadme.txt”

首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,删除readme.txt文件。

4.6 检查结果

./bin/hadoopfs -ls”

执行这个命令可以看到readme.txt是否存在,如果执行正常,readme.txt是不存在的。

5.读取HDFS的文件

5.1 目录和文件结构

这个例子的功能跟”hadoopfs-cat”是一样的。创建目录~/filecat存放源代码、编译和打包结果。在filecat目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileCat.java

5.2FileCat.java文件的源代码





packagecom.brianchen.hadoop;


importjava.net.URI;

importjava.io.InputStream;


importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.IOUtils;


public classFileCat{

public staticvoid main(String[] args) throws Exception{

if(args.length != 1){

System.err.println("Usage:filecat <source>");

System.exit(2);

}


Configurationconf = new Configuration();

FileSystem fs= FileSystem.get(URI.create(args[0]), conf);

InputStreamin = null;

try{

in =fs.open(new Path(args[0]));

IOUtils.copyBytes(in,System.out, 4096, false);

}finally{

IOUtils.closeStream(in);

}

}

}


5.3 编译

cd~/filecat”

javac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./classes ./src/*.java”

5.4 打包

jar-cvf filecat.jar -C ./classes/ .”

5.5 运行

cd/home/brian/usr/hadoop/hadoop-1.2.1”

./bin/hadoopfs -put README.txt readme.txt”

./bin/hadoopjar ~/filecat/filecat.jar com.brianchen.hadoop.FileCat readme.txt”

首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,将readme.txt文件内容输出到屏幕。

6.获取文件的属性信息

6.1 目录和文件结构

这个例子的功能跟”hadoopfs-ls”类似。创建目录~/fileinfo存放源代码、编译和打包结果。在fileinfo目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileInfo.java。它获取和输出文件长度,块大小,备份,修改时间,所有者,权限等信息。

6.2FileInfo.java文件的源代码


packagecom.brianchen.hadoop;


importjava.net.URI;


importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.FileStatus;

importorg.apache.hadoop.fs.Path;


public classFileInfo{

public staticvoid main(String[] args) throws Exception{

if(args.length != 1){

System.err.println("Usage:fileinfo <source>");

System.exit(2);

}


Configurationconf = new Configuration();

FileSystem fs= FileSystem.get(URI.create(args[0]),conf);

FileStatusstat = 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());

}

}


6.3 编译

cd~/fileinfo”

javac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./classes ./src/*.java”

6.4 打包

jar-cvf fileinfo.jar -C ./classes/ .”

6.5 运行

cd/home/brian/usr/hadoop/hadoop-1.2.1”

./bin/hadoopfs -put README.txt readme.txt”

./bin/hadoopjar ~/fileinfo/fileinfo.jar com.brianchen.hadoop.FileInfo readme.txt”

首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,将readme.txt文件的属性信息输出到屏幕。

7.列出目录下所有文件

7.1 目录和文件结构

创建目录~/filelist存放源代码、编译和打包结果。在fileinfo目录下,有两个子目录,分别是src目录和classes目录,src目录存放Java源代码,class存放编译结果。在src目录下,只有一个源代码文件FileList.java


7.2FileList.java文件的源代码

packagecom.brianchen.hadoop;


importjava.net.URI;


importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.FileStatus;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.fs.FileUtil;


public classFileList{

public staticvoid main(String[] args) throws Exception{

if(args.length != 1){

System.err.println("Usage:filelist <source>");

System.exit(2);

}


Configurationconf = 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);

}

}

}


7.3 编译

cd~/filelist”

javac-cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d./classes ./src/*.java”

7.4 打包

jar-cvf filelist.jar -C ./classes/ .”

7.5 运行

cd/home/brian/usr/hadoop/hadoop-1.2.1”

./bin/hadoopfs -put README.txt readme.txt”

./bin/hadoopfs -put README.txt readme2.txt”

./bin/hadoopjar ~/filelist/filelist.jar com.brianchen.hadoop.FileListhdfs://localhost:9000/user/brian”

首先确认Hadoop已经是运行的,然后切换到Hadoop的安装目录,然后列出/user/brian下的文件,有两个,分别是readme.txtreadme2.txt

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部