分布式文件系统HDFS

HDFS: 全称Hadoop Distributed File System

一. HDFS简介

1. HDFS实现目标:

  • 兼容廉价的硬件设备
  • 实现流数据读写: 满足大规模数据的批量处理需求,对大量数据进行全部读写,而不是分块去访问
  • 支持大数据集: 能达到好几T
  • 支持简单的文件模型:只允许追加数据,不能修改数据
  • 强大的跨平台兼容性: 基于java语言开发的,所以具有跨平台兼容性

2. HDFS自身的局限性:

  • 不适合低延迟数据访问: 不能满足实时性的数据处理需求
  • 无法高效存储大量小文件:文件太小数量太大时,会严重耗时
  • 不支持多用户写入及任意修改文件: 只允许追加数据,不能修改数据

二. HDFS相关概念

1. : 为了分摊磁盘读写开销,也就是再大量数据间分摊磁盘寻址的开销,块大小普通默认为64MB,一个文件被分成多个块,以块作为存储单位,块的大小远远大于普通文件系统,当然也可以设置为128MB.

  • 为何要如此设计?  
  • 原因一: 支持面向大规模数据存储;
  • 原因二: 降低分布式节点的寻址开销

当然不能设置的太大,原因: 如果块太大会导致MapReduce就一两个任务在执行,完全牺牲了MapReduce的并行度,发挥不了分布式并行处理的效果.

HDFS采用这种抽象的块的概念的设计好处:

  • 支持大规模文件存储: 文件以块为单位进行存储,一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上,因此,一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量
  • 简化系统设计: 首先,大大简化了存储管理,因为文件块大小是固定的,这样就可以很容易计算出一个节点可以存储多少文件块;其次,方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他系统负责管理元数据
  • 适合数据备份: 每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性

2. HDFS两大组件:

名称节点:NameNode,是整个HDFS集群的管家,即一个数据目录来记录信息.

名称节点的数据结构
  • 在HDFS中,名称节点(NameNode)负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog
  • FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
  • 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作
  • 名称节点记录了每个文件中各个块所在的数据节点的位置信息

数据节点: DataNode,存储实际数据

  • 数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表
  • 每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中

分布式文件系统HDFS_第1张图片

  • 元数据: 文件是什么;文件被分成多少快;每个块和文件是怎么映射的;每个块被存储在那个服务器上面。

总结:

    • 分布式文件系统是大数据时代解决大规模数据存储问题的有效解决方案,HDFS开源实现了GFS,可以利用由廉价硬件构成的计算机集群实现海量数据的分布式存储。
   • HDFS具有兼容廉价的硬件设备、流数据读写、大数据集、简单的文件模型、强大的跨平台兼容性等特点。但是,也要注意到,HDFS也有自身的局限性,比如不适合低延迟数据访问、无法高效存储大量小文件和不支持多用户写入及任意修改文件等。
   • 块是HDFS核心的概念,一个大的文件会被拆分成很多个块。HDFS采用抽象的块概念,具有支持大规模文件存储、简化系统设计、适合数据备份等优点。

   • HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点和若干个数据节点。名称节点负责管理分布式文件系统的命名空间;数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取。

   • HDFS采用了冗余数据存储,增强了数据可靠性,加快了数据传输速度。HDFS还采用了相应的数据存放、数据读取和数据复制策略,来提升系统整体读写响应性能。HDFS把硬件出错看作一种常态,设计了错误恢复机制。

实例:

利用hadoop 的java api检测伪分布式文件系统HDFS上是否存在某个文件?

准备工作:在Ubuntu系统中安装和配置Eclipse
第一步:放置配置文件到当前工程下面( eclipse工作目录的bin文件夹下面)

第二步:编写实现代码

在所在项目中加载jar包,具体操作如下:在所选的Eclipse项目(Dblab)上右键点击—>弹出菜单中选择>Properties—>Java Build Path—>Libraries—>Add External JARS

下面编写一个简单的程序来测试伪分布式文件系统HDFS上是否存在input.txt文件?
第一步:放置配置文件到当前工程下面
需要把集群上的core-site.xml和hdfs-site.xml(这两文件存在/hadoop/etc/hadoop目录

下)放到当前工程项目下,即eclipse工作目录的bin文件夹下面


第二步:编写实现代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class Chapter3 {
public static void main(String[] args) {
try {
String filename = "hdfs://localhost:9000/user/hadoop/test.txt";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path(filename))){
System.out.println("文件存在");
}else{
System.out.println("文件不存在");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

* 如何获取jar包

Java API所在的jar包都在已经安装好的hadoop文件夹里,路径:/usr/local/hadoop/share/hadoop(如果读者安装的hadoop不在此目录,请找到jar包所在的文件夹)


你可能感兴趣的:(分布式文件系统HDFS)