Hadoop3-分布式文件系统1

来源:互联网 发布:淘宝如何返利 编辑:程序博客网 时间:2024/06/05 04:10

Hadoop Distributed Filesystem - 分布式文件系统

HDFS



以流式数据访问模式来存储超大文件。


超大文件


流式数据访问


商用硬件(故障)


不适合在HDFS上运行的应用:

低时间延迟的数据访问(HBase更好的选择)

大量小文件

多用户写入,任意修改文件



概念:

数据块:每个磁盘有默认数据块大小,磁盘进行IO的最小单位。

单个磁盘之上的文件系统通过磁盘快来管理文件系统中的块,

该文件系统块的大小可以是磁盘块的整数倍。

文件系统块一般为几千字节,磁盘块一般512字节。


HDFS文件系统  块默认为64MB,小于一个块大小的文件不会

占据整个块的空间。


分布式文件系统中块进行抽象的好处:

文件可以存储在集群中任意一个磁盘

使用块抽象而非整个文件作为存储单元

块适合用于数据备份。



namenode & datanode

HDFS集群有两类节点,并以管理者-工作者模式运行

namenode(管理者)

管理文件系统命名空间,维护文件系统树及整棵树上的所有文件和目录

(这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和

编辑日志文件)。也记录文件中各个块所在的数据节点信息,但它并不永久

保存块的位置信息,这些信息会在系统启动时由数据节点重建。


datanode(工作者)

文件系统的工作节点。根据需要存储并检索数据块,并且定期向namenode

发送它们所存储的块的列表。


如果允许namenode服务的机器毁坏,文件系统上的所有文件将会丢失。对namenode

实现容错非常重要,Hadoop提供两种机制:

1.备份那些组成文件系统元数据持久状态的文件。

2.运行一个辅助的namenode,但不能被用作namenode。定期通过编辑日志合并命名

空间镜像,防止编辑日志过大。


命令行接口

(伪分布式配置:fs.default.name =hdfs://localhost/ 设置默认文件系统

dfs.replication=1 文件系统复本)


基本文件系统操作:


1.本地文件系统复制文件到HDFS:

$ hadoop fs -copyFromLocalinput/docs/1.txt hdfs://localhost/user/t/1.txt

[简化] hadoop fs -copyFromLocal input/docs/1.txt user/t/1.txt

~~~~ input/docs/1.txt1.txt 相对路径


2.文件复制回本地文件系统,检查是否一致:

$ hadoop fs -copyToLocal 1.txt 1.copy.txt

$ md5 input/docs/1.txt1.copy.txt


3.HDFS文件列表

$hadoop fs -mkdir books

$hadoop fs -ls .




Hadoop 文件系统

java抽象类: org.apache.hadoop.fs.FileSystem 定义一个文件系统接口


fs.LocalFileSystem

hdfs.DistributedFileSystem

hdfs.hftpFileSystem

hdfs.HsftpFileSystem

fs.HarFileSystem

fs.kfs.kosmosFileSystem

fs.ftp.FTPFileSystem

fs.s3native.NativeS3FileSystem

fs.sa.S3FileSystem


列出本地文件系统根目录下文件:

$hadoop fs -ls file:///



Java接口


1.从Hadoop URL中读取数据

InputStream in=null;

try{

in=new URL("hdfs://host/path").openStream();

}finally{

IOUtils.closeStream(in);

}


//

static{

URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());

}


2.通过FileSystemAPI读取数据

HDFS通过Path对象代表文件

public static FileSystem get(Configuration conf) throws IOException

//conf -> conf/core-site.xml

public static FileSystem get(URI uri,Configuration conf) throws IOException


FileSystem.open(Path f) throws IOException

[abstract] FSDataInputStream open(Path f,int bufferSize) throws IOException