HDFS

HDFS:Hadoop Distributed File System 分布式文件系统,为海量数据存储&计算服务,HDFS 将将要存储的大文件进行分割,分割到既定的存储块(Block)中进行了存储,并通过本地设定的任务节点进行预处理,从而解决对大文件存储与计算的需求。

文件系统的名字空间

HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。

Blocks:

Block块比一般单机文件系统大得多,默认为128M,可以自己设置有条规则

size=max(minsize,min(blocksize, maxsize))

HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。

安全模式

NameNode的安全模式本质上是HDFS集群的一种只读模式,此时集群不允许任何对文件系统或者数据块修改的操作。通常NameNode会在开始阶段自动地退出安全模式。

机架感知

NameNode设法将数据块副本保存在不同的机架上以提高容错性,配置完后,每个节点都会运行一个脚本来获取它的机架ID。通过机架感知,可以确定俩个节点是否在一个机架上。

//配置
<name>topology.script.file.name</name>
<value>topology.sh</value>//用来获取机架id的脚本 

如果topology.script.file.name未被设置,对于所有传入的IP地址,模块会返回/default-rack作为机架id。在Map/Reduce部分还有一个额外的配置项mapred.cache.task.levels,该参数决定cache的级数(在网络拓扑中)。例如,如果默认值是2,会建立两级的cache- 一级针对主机(主机 -> 任务的映射)另一级针对机架(机架 -> 任务的映射)。

容错&副本存放

HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件,文件的数据块大小和副本系数都是可配置的。
存放

副本的存放是HDFS可靠性和性能的关键。大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。

通过一个机架感知的过程,Namenode可以确定每个Datanode所属的机架id。一个简单但没有优化的策略就是将副本存放在不同的机架上。这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写的代价。

一般情况下,副本存3份, 存放时,会将一个副本放在本地机架上,然后随机到另外一个机架,最后一个副本放在俩个机架中的一个的不同节点上,这种方式减少机架之间的数据传输(跨机架要比同机架节点之间通信消耗的资源要多)

RPC

  • RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
  • RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

写入数据

  1. 根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
  2. namenode返回是否可以上传
  3. client请求第一个?block该传输到哪些datanode服务器上
  4. namenode返回3个datanode服务器ABC
  5. client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
  6. client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
  7. 当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

比较详细的:

  1. 客户端调用create()函数创建文件。

  2. DistributedFileSystem通过RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。元数据节点会首先确定文件原先不存在,并且客户端有创建文件的权限,然后创建新文件。

  3. DistributedFileSystem返回FSDataOutputStream,客户端用于写数据。

  4. FSDataOutputStream将数据分成块,写入Data Queue。Data Queue由Data Streamer读取,并通知元数据节点分配数据节点用来存储数据块(每块默认复制3份)。分配的数据节点放在一个Pipeline中。Data
    Streamer将数据块写入Pipeline中的第一个数据节点;第一个数据节点再将数据块发送给第二个数据节点;第二个数据节点再将数据发送给第三个数据节点。

  5. FSDataoutputStream为发出去的数据块保存了ACK Queue,等待Pipeline中的数据节点告知数据已成功写入。如果数据节点在写入过程中失败了,则关闭Pipeline,将Ack
    Queue中的数据块放入到Data Queue的开始。

  6. 当前数据块在已经写入的数据节点中会被元数据节点赋予新的标识,则错误节点重启后能察觉到其数据块是过时的,将会被删除。失败的数据节点从Pipeline中移除,另外的数据块则写入Pipeline中的另外两个数据节点。元数据节点则被通知此数据块复制块数不足,将来会再创建第三份备份。

  7. 当客户端结束写入数据后,则调用stream的close()方法。此操作将所有的数据块写入pipeline中的数据节点,并等待ACK Queue成功返回。最后通知元数据节点写入完毕。

读取数据

  1. 客户端通过Distributed FileSystem向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的datanode地址。

  2. 挑选一台datanode(就近原则,然后随机)服务器,请求读取数据。

  3. datanode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。

  4. 客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

  1. 客户端(Client)调用FileSystem的open()函数打开文件。

  2. DistributeFileSystem通过RPC调用元数据节点,得到文件的数据块信息。对于每一个数据块,元数据节点返回数据块的数据节点位置。

  3. DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。客户端调用stream的read()方法读取数据。

  4. FSDataInputStream连接保存此文件第一个数据块的最近的数据节点,Data从数据节点读到客户端(Client)。

  5. 当此数据块读取完毕后,FSDataInputStream关闭和此数据节点的连接,然后读取保存下一个数据块的最近的数据节点。

  6. 当数据读取完毕后,调用FSDataInputStream的close()函数。

  7. 在数据读取过程中,如果客户端在与数据节点通信时出现错误,则会尝试读取包含有此数据块的下一个数据节点,并且失败的数据节点会被记录,以后不会再连接。

特点

  • HDFS是一个高度容错性的系统,适合部署在廉价的机器上
  • HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
  • HDFS具有高度可配置性,其默认配置非常适合许多安装。大多数情况下,需要仅针对非常大的群集调整配置。
  • HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。

适用于:

  • 存储非常大的文件:这里非常大指的是几百M、G、或者TB级别。实际应用中已有很多集群存储的数据达到PB级别。
  • 采用流式的数据访问方式: 一次写入、多次读取数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 分析工作经常读取其中的大部分数据, 因此读取整个数据集所需时间比读取第一条记录的延时更重要。
  • 运行于商业硬件上: Hadoop不需要特别贵的、reliable的(可靠的)机器,可运行于普通商用机器(可以从多家供应商采购),商用机器不代表低端机器。在集群中(尤其是大的集群),节点失败率是比较高的HDFS的目标是确保集群在节点失败的时候不会让用户感觉到明显的中断。

相反:

  • 低延时的数据访问
    对延时要求在毫秒级别的应用,不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时HBase更适合低延时的数据访问。

  • 大量小文件
    文件的元数据(如目录结构,文件block的节点列表,block-node mapping)保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小。

不得不处理小数据的时候,考虑将小数据转换成大数据,比如通过合并压缩等方法,通过自定义 InputFormat和RecordReader来实现对海量小文件的并行处理。

  • 多方读写,需要任意的文件修改
    HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改。不支持多个写入器(writer)。

以下是HDFS中有用功能的子集:

文件权限和身份验证。
机架感知:在调度任务和分配存储时考虑节点的物理位置。 安全模式:维护的管理模式。
fsck:用于诊断文件系统运行状况,查找丢失文件或块的实用程序。
fetchdt:一个实用程序,用于获取DelegationToken并将其存储在本地系统的文件中。
平衡器:当数据在DataNode之间分布不均匀时平衡群集的工具。
升级和回滚:软件升级后,可以在升级前回滚到HDFS状态,以防出现意外问题。
Secondary NameNode:执行命名空间的定期检查点,并帮助将包含HDFS修改日志的文件大小保持在NameNode的特定限制内。
检查点节点:执行命名空间的定期检查点,并有助于最小化存储在包含HDFS更改的NameNode的日志大小。替换以前由Secondary
NameNode填充的角色,但尚未进行战斗强化。只要没有向系统注册备份节点,NameNode就可以同时允许多个Checkpoint节点。
备份节点:Checkpoint节点的扩展。除了检查点之外,它还从NameNode接收编辑流并维护其自己的命名空间的内存中副本,该副本始终与活动的NameNode名称空间状态同步。一次只能向NameNode注册一个备份节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值