【笔记】HDFS

HDFS

HDFS是基于流式数据访问模式,为处理超大文件(PB级别)的需求而设计的。流式数据访问模式的关键是流式数据,所谓流式数据就是将数据序列化为字节流,如同将冰融化成水,类似于Java中的对象的序列化接口。

HDFS中存放的一定是流式数据,是可序列化和反序列化的数据。HDFS是不支持存储和访问非序列化数据的。可以将超大文件序列化为字节的序列或者字节数组来存储,这样不会破坏原来的文件的结构和内容。为了把超大文件保存下来,需要通过集群的多台服务器同时存储,这时就要加将文件序列化为字节的序列,然后按照字节的顺序进行切分之后分布式地存储在各个服务器上。若要将一个大的文件进行切分,该文件必须支持序列化(流化);若要存储在文件系统中,该文件必须是流式访问模式的。

大规模的数据以分布式发的方式均存储在集群中的各个服务器上,然后分布式并行计算框架MapReduce可以利用各个服务器的本地计算资源,在本地服务器上对大规模数据集的子数据集进行计算。

一次写入多次读取,但屏蔽频繁的修改。提供高效的多次读取。为了避免一台机器宕机造成用户数据丢失的问题,HDFS分布式集群采用数据冗余的方式,将同一份数据的多个副本保存在多个节点上。

HDFS优势

1、处理超大文件;
2、处理非结构化数据;
3、流式数据访问模式;
4、运行在廉价的商业机器集群;
5、发生故障时能够继续运行且不被用户察觉。

HDFS局限性

1、不适合处理低延迟数据访问(HBase可以),是为了提高数据吞吐量来处理大型数据集分析任务而设计的。
2、无法高效存储大量小型文件。会给HDFS的扩展性和访问处理性能带来严重问题。
3、不支持多用户写入及任意修改同一个文件。多个用户对同一个文件的操作,会涉及到多线程安全问题,造成系统处理性能上的降低。从业务角度来说,对一个PB级别的文件数据进行分析时,修改了其中几行数据的值,对结果的影响微乎其微,甚至可以忽略。

HDFS特性

1、可扩展性
2、跨平台性。HDFS是Java语言开发的,具备跨平台特性。
3、Shell命令行接口
4、Web界面。HDFS提供了两个内置的Web系统,可以通过URL(http://localhost:50070)查看HDFS的基本信息。对于MapReduce分布式并行计算框架资源的管理和回收,Hadoop2.0引入了一个新的框架YARN,主要对集群中内存、CPU进行管理。YARN的内部有一个Web系统(http://localhost:18088)。

HDFS核心设计
  • 数据块
    • Block是HDFS上存储数据的基本单位。Hadoop2.0数据块的大小为128MB,小于一个数据块大小的文件存储进来不会占据整个数据块的空间,剩余的空间还可以被其他文件使用。
  • 数据块复制
    • 提升HDFS的可靠性,可以创建多分数据块的副本,并将它们放置在服务器集群的DataNode节点。对每一个数据文件切分的每一个数据块进行复制,一本系数为3,选择这三个副本中任意一个来用。
  • 数据块副本存放策略
    • 当一份数据由多个副本时,应该选择哪一个呢?机架内多个服务器之间的网络速速通常会高于跨机架机器之间的网络速度。Hadoop对数据文件的分布式存放是以数据块为单位的,每个数据块会有多个副本(3),存放策略:
    • 第一个存放在客户端所在的DataNode节点里,客户端不在集群里就就近原则的DataNode。
    • 第二个副本放置在于第一个节点不同机架中的DataNode中,随机选取。
    • 第三个副本放置在于第一个副本所在节点同一个机架的另一个节点上。
  • 机架感知
    • 启用Hadoop的机架感知,配置:
    <property>
    	<name>topology.script.file.name</name>
    	<value>/path/to/RackAware.py</value>
    </property>
    
    脚本接收一个DataNode的IP地址,输出该IP地址对应的DataNode节点所在的机架,例如Rack1。该配置选项非空,NameNode在接收到每一个DataNode心跳时,将IP传给该脚本,将得到的几家信息保存到内存映射中。
  • 数据块的备份数
    • 一般为3,配置方式:
    • (1)xml(重启生效)
    <property>
    	<name>dfs.replication</name>
    	<value>3</value><!--副本系数-->	
    </property>
    
    • (2)命令行(不需要重启)
    [xx@master ~]$ bin/hadoop fs -setrep -R 3 /
    
  • 安全模式
    • SafeMode保护模式。Hadoop自动检查数据块的完整性,HDFS周期性地检查各个数据块副本的完整性,如果发现已损坏的数据块,就会及时向NameNode汇报并做好标记,随后NameNode负责将修复数据块的任务分配给某个具体的DataNode节点。
    • 相关命令行
    hadoop dfsadmin -safemode leave #强制NameNode退出安全模式
    hadoop dfsadmin -safemode enter #进入安全模式
    hadoop dfsadmin -safemode get #查看安全模式状态
    hadoop dfsadmin -safemode wait #等待、一直到安全模式结束
    
  • 负载均衡
    • 当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,对各个节点上的数据存储分布进行调整,让这些数据均匀地分布在各个节点上,均衡I/O性能。
    • 负载均衡算法流程
    • HDFS中包含一个start-balancer.sh脚本,启动HDFS数据均衡服务,热插拔,无需重启计算机和Hadoop服务。启动命令:
      $HADOOP_HOME/bin/start-balancer.sh -threshold
      
  • 心跳机制
    • 每隔一段时间连接一次的机制,具体过程是客户端每隔几分钟发送一个固定格式的信息给服务端,服务端收到后,回复一个固定格式的信息给客户端;如果服务端几分钟内没收到客户端的信息则视客户端已断开。
    • 固定格式的信息内容称为心跳数据包,因为它像心跳一样每隔一定时间发送一次,一次告诉服务器这个客户端还活着。
    • 心跳数据包主要是为了保持长连接,对于信息内容没有特别规定,一般都是很小的数据包,也可能只包含头。从节点通过心跳给主节点汇报自己的信息,主节点通过心跳给从节点下达命令。如果主节点10min以内没有收到从节点的心跳,主节点就认为从节点已失效。
HDFS体系结构

1、主从架构(Master/Slave)
一个HDFS集群由多个NameNode和多个DataNode组成的。
DataNode:数据存储节点,负责自身所在物理节点上的存储管理。客户端访问操作数据,是通过向NameNode发起请求并获取文件数据所在DataNode节点的地址信息的。对数据流的读写操作在DataNode节点完成,NameNode几点不会参与文件数据流的读写,而是由DataNode节点负责完成。

2、核心组件

  • NameNode:维护文件系统树,不存储真实数据,而是存储元数据,NameNode保存在内存中。是所有元数据的仲裁者和管理者。控制文件数据副本存放在哪些DataNode上。
  • DataNode:在磁盘上保存的基本单位是数据块,默认大小128。
  • SecondaryNameNode:辅助NameNode,主要用于同步元数据信息,辅助NaMeNode对fsimage和edits进行合并,即冷备份。

3、数据块损坏处理

  • 每个副本数据块都会生成一个校验码,用来检测或校验数据传输或保存后所产生的错误。客户端从某DataNode读取数据块的时候,再次计算校验和,如果和该数据块创建时的不一样,损坏。客户端停止接收数据块,向NameNode申请读取该数据块的其他副本。客户端把已损坏的数据块的信息汇报给NameNode,标记数据块的状态为损坏。NameNode通过心跳机制给某个DataNode节点发起复制数据块的命令,得到命令的DataNode从该数据块的正常副本中再复制一个,NameNode将其分配给某个合适的DataNode节点,保证集群中文件数据的各个数据块的副本始终是3个。
  • DataNode自检:数据块创建3周后,自动触发校验和运算,保证集群中数据块的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antrn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值