HDFS--Hadoop分布式文件系统

HDFS是什么

HDFS设计特性和概念

HDFS,全称是Hadoop Distributed Filesystem,是一个分布式的文件系统,以流式数据訪问模式来存储超大文件(一次写入、多次读取)。

HDFS具有例如以下设计特性:

(1)处理超大文件,指的是GB、TB、PB级别的文件。百度、淘宝都有PB级别的HDFS,百度应该有国内最大规模的HDFS。几十PB。

(2)流式数据訪问。一次写入,多次读取,所处理的场景中,读取整个数据的延迟比读取第一条记录的时间延迟重要。

(3)执行在普通商用PC就可以,比方3万级别的普通PCserver(16-32G ECC内存,8-16核CPU)。

(4)是为高数据吞吐量优化的,以高时间延迟为代价。

(5)推荐处理大量小文件。因为namenode将文件系统的元数据存储在内存中,故文件总数受制于namenode节点内存。依据经验。一个文件/文件夹/block大约占用150自己,所以亿级别文件还能够,10亿级别内存就不够了。

(6)对于写入。仅仅能有一个写入操作,也仅仅能把内容加入在文件的末尾。

概念:

(1)数据块(block)。默认64M,一般用128M,相对于文件系统块(几K字节大小)、磁盘块(一般512毕节),HDFS的块设计明显大的多。这是为了最小为寻址开销(寻址占传输的百分比,比方:寻址10S。传输100MB/S。则寻址时间仅占传输时间的1%)。

(2)名称节点(namenode),是管理者,维护整个HDFS的文件系统树及树内全部的文件和文件夹。

(3)数据节点(datanode)。是文件系统工作节点,依据namenode调度,存储并检索数据块,定期向namenode发送它所存储的块列表。

namenode单点风险的2种解决的方法:

(1)备份那些组成文件系统元数据持久状态的文件,比方。持久状态写入本地磁盘的同一时候,写入一个远程的文件系统。

(2)执行一个辅助namecode,因为辅助namecode的滞后性,所以namecode损坏时,难免会丢失部分数据。

Hadoop抽象文件系统

Hadoop有一个抽象文件系统,由org.apache.hadoop.fs.FileSystem定义,HDSF仅仅是当中的一个实现。

Hadoop所实现的文件系统列表。大致例如以下图所看到的:

Hadoop对文件系统提供了很多接口,它一般使用URI方案来选取合适的文件系统实例进行交互。。比方例如以下代码:

String uri = "hdfs:///test/input/t/temperature.txt";

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(uri), conf);

即时依据hdsfs://来推断,使用hdfs.DistributedFileSystem。假设改成file://,则使用fs.LocalFileSystem。

HDFS命令行接口

查看全部命令:

hadoop fs -help

hdfs fsck -help

也能够通过Web界面浏览文件系统:http://192.168.1.10:50070/

HDFS JAVA API

从Hadoop URL中读取数据

import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.zookeeper.common.IOUtils;

public class URLCat {
	static {
		URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
	}

	public static void main(String[] args) throws Exception {
		InputStream in = null;
		try {
			in = new URL("hdfs:///test/input/t/temperature.txt").openStream();
			IOUtils.copyBytes(in, System.out, 4096, false);
		} finally {
			IOUtils.closeStream(in);
		}
	}
}

把hdfs换成file,则能够直接处理当前本地文件系统。

以上的方法是非常easy的,利用的java.net.URL对象打开数据流。从中读取数据。可是这种方法有个限制,Java虚拟机仅仅能调用这个set方法一次,这个限制意味着假设有其它不受控制的第三方组件(已经声明了URLStreamHandlerFactory实例),则我们无法再使用这样的方法读取数据。因而,不推荐使用。

通过FileSystem API读取数据

import java.io.InputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.zookeeper.common.IOUtils;

public class FileSystemCat {
	public static void main(String[] args) throws Exception {
		String uri = "hdfs:///test/input/t/temperature.txt";
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		InputStream in = null;
		try {
			in = fs.open(new Path(uri));
			IOUtils.copyBytes(in, System.out, 4096, false);
		} finally {
			IOUtils.closeStream(in);
		}
	}
}

实际上,open方法返回的是FSDataInputStream对象,是继承java.io.DataInputStream的一个特殊类。支持随机訪问,由此能够从流的任何位置读取数据。比方,我们把try段的代码变成:

			in = fs.open(new Path(uri));
			IOUtils.copyBytes(in, System.out, 4096, false);
			((FSDataInputStream) in).seek(0);	//go back to the start of the file
			IOUtils.copyBytes(in, System.out, 4096, false)

则,会显示两遍文件temperature.txt文件的内容。

将本地文件拷贝到Hadoop文件系统

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class FileCopyWithProgress {

	public static void main(String[] args) throws Exception
	{
		String localSrc = "/home/hadoop/temperature.txt";
		String dst = "hdfs:///test/input/t/temperature2.txt";
		InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(dst),conf);
		OutputStream out = fs.create(new Path(dst),new Progressable(){
			public void progress(){
				System.out.println(".");
			}
		});
		IOUtils.copyBytes(in,out,4096,true);
	}
}

每次Hadoop调用progress()方法时。也就是每次讲64KB数据包写入datanode后。

列出文件

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;

public class ListStatus {

	public static void main(String[] args) throws Exception {
		String uri = "hdfs:///test/input/t/";
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		// 显示一组路径的文件夹列表的并集
		/*
		 * Path[] paths = new Path[] { new Path("hdfs:///test/input/t/"), new
		 * Path("hdfs:///test/input/wc") }; FileStatus[] status =
		 * fs.listStatus(paths);
		 */
		// 通配方式
		FileStatus[] status = fs.globStatus(new Path(
				"hdfs:///test/input/wc/*02.txt"));

		Path[] listedPaths = FileUtil.stat2Paths(status);
		for (Path p : listedPaths) {
			System.out.println(p);
		}
	}
}

文件元数据FileStatus,封装了文件系统中文件和文件夹的元数据,包含文件长度、块大小、备份、改动时间、全部者以及权限信息。

删除数据

使用FileSystem的delete()方法能够永久性删除文件或文件夹。

public boolean delete(Path f,boolean recursive) throws IOException

假设f是一个文件或空文件夹,那么recursive的值就会被忽略。

假设f是一个非空文件夹,则仅仅有recursive为true才干删除。否则会抛出IOException。

Hadoop数据流

文件读取剖析

文件写入剖析

复本的布局策略(以3个为例):1、执行client的节点,2、离架节点,3、2所在机架的随机节点。

一致模型

文件系统的一致模型,描写叙述了对文件读/写的数据可见性。HDFS为性能牺牲了一些POSIX要求,因此一些操作与你期望的不同。

		Path p = new Path("p");
		Fs.create(p);
		Path p = new Path("p");
		OutputStream out = fs.create(p);
		out.write("content".getBytes("UTF-8"));
		out.flush();

以上两段代码都不能这个文件在文件系统马上可见。除非在out.flush();后面添加一行out.sync()。目的是强制全部的缓存与数据节点同步,另外,在HDFS中关闭文件out.close(0事实上隐含运行了sync()方法。

这个一致模型相应用设计的重要性:

假设不调用sync(),可能因client故障而丢失数据。而常常调用sync()也会有额外性能开销,所以须要在数据健壮性和吞吐量直接有所取舍,这与详细的应用有关,通过设置不同的调用sync()的频率来衡量应用的性能。终于找到一个合适的频率。

通过distcp进行并行复制

前面介绍的都是单线程的HDFS訪问模型,distcp是一个分布式的复制程序。典型应用是在两个HDFS直接传输 数据,假设两个集群执行同样版本号的Hadoop,则能够例如以下:

hadoop distcp hdfs://集群1的某节点/foo hdfs://集群2的某节点/foo

能够通过-overrite,指定覆盖现有的文件;通过-update指定仅更新改动过的文件。

假设两个集群版本号不一样,能够例如以下这样:

hadoop distcp hftp://集群1的某节点:50070/foo hdfs://集群2的某节点/foo

默认情况下。每一个集群节点(tasktracker)。最多分配20个map任务,假设复制1000G数据到100个节点的集群,一共会有2000个map任务,每一个map任务平均分配512M数据。能够指定-m參数,降低map任务数,比方-m 1000,将分配1000个map任务,平均每一个复制1GB数据;可是一般不推荐这么做,可能导致集群不平衡。

Hadoop存档

Hadoop存档文件(HAR文件),是一个高效的文件存档工具,它将文件存入HDFS块。降低namenode内存使用的同一时候,依旧同意对文件进行透明的訪问(即Hadoop文档能够作为MapReduce的输入)。

命令演演示样例如以下:

hadoop fs -ls -R /test/input

hadoop archive -archiveName files.har -p /test input /test/file

hadoop fs -ls /test/file

hadoop fs -ls /test/file/files.har

hadoop fs -ls -R har:///test/file/files.har

hadoop fs -rm -r /test/file

har文件的不足:

(1)创建一个存档文件会创建原始文件的一个复本。因此须要额外的和原始文件一样大小的磁盘空间。当然,创建了存档文件。能够删除原始文件。

har是不压缩的,很类似于tar文件

(2)一旦创建,存档文件不能改动。其实。一般不会改动存档文件,由于它们是定期成批存档的,比方每日或每周。

(3)Har文件作为mapreduce输入时,InputFormat类并不知道文件已经存档,虽然该类能够将多个文件打包成一个MapReduce分片。所以即使在har文件里处理很多小文件,依旧和原来一样低效。

时间: 2024-10-29 19:06:31

HDFS--Hadoop分布式文件系统的相关文章

HDFS——Hadoop分布式文件系统深度实践pdf

下载地址:网盘下载 <高可用性的HDFS:Hadoop分布式文件系统深度实践>专注于Hadoop分布式文件系统(HDFS)的主流HA解决方案,内容包括:HDFS元数据解析.Hadoop元数据备份方案.Hadoop Backup Node方案.AvatarNode解决方案以及最新的HA解决方案Cloudrea HA Name Node等.其中有关Backup Node方案及AvatarNode方案的内容是该书重点,尤其是对AvatarNode方案从运行机制到异常处理方案的步骤进行了详尽介绍,同时

三、HDFS——Hadoop分布式文件系统

一.hdfs的设计目标 1.1.硬件错误是常态而不是异常.Hadoop的设计理念之一就是它可以运行在廉价的普通PC机上,因而硬件故障是常态.在硬件故障时,可通过容错机制保证数据的正确性.完整性,从而保证系统的正常运行. 1.2.大文件存储.hdfs存储的文件大小一般在GB~TB的级别. 1.3.流式数据访问.由于hadoop处理的都是大文件,因此流式数据访问方式更适合.流式数据访问是指一次性地读取一大块文件后再做处理,其特点是吞吐率高,延迟高:与之相反的是随机数据访问,特点是随机性地读取数据,延

深入理解HDFS:Hadoop分布式文件系统

文本详细介绍了HDFS中的许多概念,对于理解Hadoop分布式文件系统很有帮助. 1. 介绍 在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储.统一管理分布在集群上的文件系统称为分布式文件系统.而一旦在系统中,引入网络,就不可避免地引入了所有网络编程的复杂性,例如挑战之一是如果保证在节点不可用的时候数据不丢失. 传统的网络文件系统(NFS)虽然也称为分布式文件系统,但是其存在一些限制.由于NFS中,文件是存储在单机上,因此无法提供可靠性保证,当很多客户端同时访问NFS Serve

Hadoop分布式文件系统(HDFS)设计

Hadoop分布式文件系统是设计初衷是可靠的存储大数据集,并且使应用程序高带宽的流式处理存储的大数据集.在一个成千个server的大集群中,每个server不仅要管理存储的这些数据,而且可以执行应用程序任务.通过分布式存储和在各个server间交叉运算,集群和存储可以按需动态经济增长.以下的设计原则和经验是根据yahoo通过HDFS管理的40PB得来的. 1. HDFS简介 HDFS是一个分布式文件系统,并且为MapReduce分布式算法提供了一分析和传输大数据的框架.HDFS使用java编写,

Hadoop分布式文件系统-HDFS

Hadoop历史 雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 随后在2003年Google发表了一篇技术学术论文谷歌文件系统(GFS).GFS也就是google File System,google公司为了存储海量搜索数据而设计的专用文件系统. 2004年Nutch创始人Doug Cutting基于Google的GFS论文实现了分布式文件存储系统名为NDFS. 2004年G

Hadoop分布式文件系统HDFS的工作原理详述

Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.它能提供高吞吐量的数据访问,非常适合大规模数据集上的应用.要理解HDFS的内部工作原理,首先要理解什么是分布式文件系统. 1.分布式文件系统 多台计算机联网协同工作(有时也称为一个集群)就像单台系统一样解决某种问题,这样的系统我们称之为分布式系统. 分布式文件系统是分布式系统的一个子集,它们解决的问题就是数据存储.换句话说,它们是横跨在多台计算机上的存

【HDFS】Hadoop分布式文件系统:架构和设计

引言 前提和设计目标 硬件错误 流式数据访问 大规模数据集 简单的一致性模型 "移动计算比移动数据更划算" 异构软硬件平台间的可移植性 Namenode 和 Datanode 文件系统的名字空间 (namespace) 数据复制 副本存放: 最最开始的一步 副本选择 安全模式 文件系统元数据的持久化 通讯协议 健壮性 磁盘数据错误,心跳检测和重新复制 集群均衡 数据完整性 元数据磁盘错误 快照 数据组织 数据块 Staging 流水线复制 可访问性 DFSShell DFSAdmin

【转载】Hadoop分布式文件系统HDFS的工作原理详述

转载请注明来自36大数据(36dsj.com):36大数据 » Hadoop分布式文件系统HDFS的工作原理详述 转注:读了这篇文章以后,觉得内容比较易懂,所以分享过来支持一下. Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的 机器上.它能提供高吞吐量的数据访问,非常适合大规模数据集上的应用.要理解HDFS的内部工作原理,首先要理解什么是分布式文件系统. 1.分布式文件系统 多台计算机联网协同工作(有时也

大数据笔记04:大数据之Hadoop的HDFS(分布式文件系统)

1.HDFS是什么? Hadoop分布式文件系统(HDFS),被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点. 2.HDFS中的基本概念 (1)块(block)     " 块 " 是固定大小的存储单元,HDFS的文件被分成块进行存储,HDFS的块默认大小是64MB.文件传递过来之后,HDFS会把文件拆分成块进行管理," 块"就是文件存储处理的逻辑单元. (2)HDFS有两类节点: Name

Hadoop分布式文件系统HDFS详解

Hadoop分布式文件系统即Hadoop Distributed FileSystem.        当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(Partition)并存储到若干台单独的计算机上,管理网络中跨越多台计算机存储的文件系统成为分布式文件系统(Distributed FileSystem).    该系统架构与网络之上,势必引入网络编程的复杂性,因此分布式文件系统比普通磁盘文件系统更为复杂.例如:使文件系统能够容忍节点故障且不丢数据便是一个极大的挑战.