文档章节

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

brian_2017
 brian_2017
发布于 2017/01/17 09:13
字数 2536
阅读 4
收藏 0

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

© 著作权归作者所有

brian_2017
粉丝 3
博文 61
码字总数 145216
作品 0
私信 提问
[推荐]开源软件架构

这本书原先只有英文版,现在图灵这里有中文版的了,写的真好 http://www.ituring.com.cn/minibook/19 前言(卷一) 卷1:第1章 Asterisk 卷1:第3章 The Bourne-Again Shell 卷1:第4章 Berk...

难易
2013/11/23
3.1K
4
Hadoop文件系统详解

Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现。Java抽象类 org.apache.hadoop.fs.FileSystem展示了Hadoop的一个文件系统,而且有几个具体实现,如表 3-1所示。 文件系统 URI 方案...

超人学院
2016/07/22
137
0
Hadoop文件系统详解----(一)

Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现。Java抽象类 org.apache.hadoop.fs.FileSystem展示了Hadoop的一个文件系统,而且有几个具体实现,如表 3-1所示。 文件系统 URI 方案...

超人学院
2015/04/03
145
0
Apache Hadoop 入门教程第三章

免密码 ssh 设置 现在确认能否不输入口令就用 ssh 登录 localhost: $ ssh localhost 1 如果不输入口令就无法用 ssh 登陆 localhost,执行下面的命令: $ ssh-keygen -t rsa -P '' -f ~/.ssh/...

哈斗篷
2018/05/10
0
0
【电子书】Hadoop实战手册 (样章第一章)

Hadoop实战手册 [美] Jonathan R. Owens,Jon Lentz,Brian Femiano 著; 傅杰,赵磊,卢学裕 译 内容简介   这是一本Hadoop实用手册,主要针对实际问题给出相应的解决方案。《Hadoop实战手...

dwf07223
2018/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部