HDFS——Hadoop内置分布式文件系统

前言

Hadoop有一个被称为HDFS的分布式系统,全称为Hadoop Distributed FileSystem。

在这里插入图片描述

HDFS的概念

磁盘有块的大小,代表着能够读写的最小数据量,文件系统通过处理大小为磁盘块大小证书背的数据块来运作磁盘。文件系统块大小一般为几千字节,而磁盘块大小为512字节。

HDFS也有块的概念,默认为64MB,作为单独的单元存储,其中小于一个块大小的文件不会占据整个块空间。

HDFS块大的原因

为了减小寻址开销,通过让一个块足够大,从磁盘转移数据的时间能够远远大于定位这个块开始端的时间。所以,传送一个由多个块组成的文件的时间就取决于磁盘传输速率。

分布式文件系统使用抽象块带来的好处

  • 一个文件可以大于网络中任意一个磁盘的容量;
  • 使用块抽象单元而不是文件会简化存储子系统;
  • 很适合于为提供容错和实用性而做的复制操作;

列出文件系统中组成各个文件的块
hadoop fsck / -files -blocks

名称节点与数据节点

HDFS集群有两种节点,以管理者-工作者模式运行,即名称节点(管理者)数据节点(工作者)

名称节点管理文件系统命名空间,维护着这个文件系统树及这个树内所有文件和索引目录。这些信息已命令空间镜像或编辑日志的形式永久保存在本地磁盘上。同时名称节点也记录着每个文件的每个块所在的数据节点,但是并不永久保存块的位置,因为这些信息会在系统启东时有数据节点重建。

数据节点是文件系统的工作者,它们存储并提供定位块的服务,并且定时的向名称节点发送它们存储的块的列表。

两种保护机制用来确保名称节点能够经受故障:

  • 复制那些组成文件系统元数据持久状态的文件,Hadoop可以通过配置使名称节点在多个文件系统上写入其持久化状态。这些写操作具有同步性和原子性。
  • 运行一个二级名称节点,虽然它不能作为名称节点使用,这个二级名称节点的重要作用就是定期通过编辑日志合并命名空间镜像,以防止编辑日志过大。二级名称节点比主节点之后,所以存在损失在所难免。

命令行接口

设置伪分布式配置

fs.default.name设置为 h d f s : / / l o c a l h o s t / hdfs://localhost/ hdfs://localhost/,用来为Hadoop设置默认文件系统。默认端口为8020,HDFS用户将通过这个属性的知名称节点在哪里运行以便连接。

dfs.replication设置为1,这样HDFS就不会按默认设置将文件系统复制3份。

基本文件系统操作

将本地文件系统的一个文件复制到HDFS:

hadoopfs -copyFromLocal 本地文件 HDFS路径

创建目录

hadoop fs -mkdir 目录名

显示目录列表

hadoop fs -ls .

Hadoop文件系统

Hadoop提供了许多文件系统的接口,一般使用URI方案来选取合适的文件系统实例交互。

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

hadoop fs -ls file:///
接口

Hadoop是用Java编写的,所有Hadoop文件系统间的相互作用都是由Java API调解得。

数据流

文件读取剖析

客户端从HDFS中读取数据

  • 客户端通过调用FileSystem对象的open()来读取希望打开的文件;
  • DistributedFileSystem通过使用RPC来调用名称节点,获取文件开头部分块的位置,名称节点会根据文件存储位置与客户端的距离排序,返回一个FSData InputStream对象。
  • 客户端对这个输入流调用read(),存储着文件开头部分块的数据节点地址的数据流与这些块最近的数据节点相连接;
  • 通过重复调用read(),数据从数据节点返回客户端。
  • 到达块的末端时,数据流会关闭与数据节点间的联系,然后为下一个块找到最佳的数据节点。
  • 数据传输完成调用close()。
文件写入剖析

客户端对HDFS写入数据

  • 客户端通过在DistributedFileSystem中调用create()来创建文件;
  • DistributedFileSystem一个RPC取调用名称节点,在文件系统的命名空间中创建一个新的文件。名称节点会执行各种不同的检查以确保这个文件不会已经存在,并且客户端有可以创建文件的适当许可。如果检查通过名称节点就生成一个新文件记录,否则,文件失败并向客户端抛出一个IO异常。分布式文件系统返回一个文件系统数据输出流,让客户端开始写入数据,文件系统数据输出流控制一个DFSoutPutStream,负责处理数据节点和名称节点之间的通信。
  • 在客户端写入数据时,DFSoutPutStream将它分成一个个包,写入内部的队列,称为数据队列。数据队列随数据流流动,数据流的责任是根据适合的数据节点列表来要求这些节点为副本分配新的块。这些数据节点的列表形成一个管线,数据流将包分流给管线中第一个的数据节点,这个节点会存储包并且发送给管线中的第二个数据节点,同样的第二个数据节点存储包并且传给管线中第三个数据节点。
  • DFSoutPutStream也有一个内部的包队列来等待数据节点收到确认,称为确认队列,当一个包在管线中所有节点确认后才会移除确认队列。
  • 客户端完成数据写入后就会在流中国调用close,在向名称节点发送完信息之前,此方法会将余下的所有包放入数据节点管线并等待确认。

名称节点如何选择哪个数据节点来保存副本?

Hadoop的策略是在与客户端相同的节点上放置第一个副本,第二个副本被放置在与第一个不通的随机选择的机架上,第三个副本被放置在与第二个相同的机架上,但在不同节点。

冗余副本策略
  • 可以在hdfs-site.xml中设置复制因子,指定副本数量;
  • 所有数据块都有副本;
    -DataNode启动时,遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列表汇报给namenode。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值