赞
踩
一、HDFS设计原理
二、HDFS系统架构
三、HDFS关键技术
四、HDFS应用实例
五、解决HDFS不能处理小文件详解问题
HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)是专为大规模数据集设计的分布式文件存储解决方案,它通过一系列的技术和设计理念,实现了高效、可靠、可扩展的大数据存储。以下是对HDFS如何做到大规模数据存储的详细说明,包括其设计原理、架构、关键技术以及应用实例,
HDFS的设计原理主要基于“分而治之”的策略,即将大文件分割成固定大小的数据块(Block),并将这些数据块分布存储在多个计算节点(DataNode)上,以实现数据的并行处理和冗余存储。这种设计使得HDFS能够处理PB级别的数据存储,并支持高吞吐量的数据访问。
HDFS采用主从架构(Master-Slave Architecture),主要由以下几个组件组成:
以互联网公司使用HDFS存储用户行为数据为例,HDFS作为大数据离线分析的基础存储平台,可以支撑PB级别数据的存储和分析。具体流程如下:
数据收集:通过日志收集系统(如Flume)将用户行为数据实时收集并写入HDFS。
数据存储:HDFS将收集到的数据按照一定的规则进行分割和存储,每个数据块会被复制到多个DataNode上,以实现数据的冗余存储。
数据分析:数据挖掘工程师可以使用MapReduce、Spark等计算框架对存储在HDFS中的数据进行处理和分析,以发现有价值的信息。
结果展示:分析得到的结果可以通过数据可视化工具进行展示,为企业的决策提供有力支持。
HDFS通过其独特的设计原理和架构,实现了大规模数据的高效、可靠、可扩展存储。它采用数据块分割、副本机制、元数据管理等多种技术,保障了数据的可靠性和可用性。同时,HDFS还支持动态扩展,能够轻松应对数据量的快速增长。在实际应用中,HDFS已经成为大数据处理和分析的重要工具之一,为企业提供了强有力的数据支持。
然而,需要注意的是,HDFS并非完美无缺。由于其针对大规模数据集进行优化,因此在处理小文件时可能会存在性能瓶颈。此外,HDFS的写入操作相对较慢,且不支持并发写入和随机读写操作。因此,在选择存储解决方案时,需要根据具体的应用场景和需求进行综合考虑。在数据仓库中,小文件问题是一个常见的挑战,特别是在使用Hadoop HDFS(Hadoop Distributed File System)等分布式存储系统时。小文件会导致大量的元数据开销、NameNode性能下降以及HDFS读写效率的降低。为了有效地处理小文件问题,可以采取以下几种策略:
1.客户端发起写入数据的请求给namenode
2.namenode接收到客户端请求,开始校验(是否有权限,路径是否存在,文件是否存在等),如果校验没问题,就告知客户端可以写入
3.客户端收到消息,开始把文件数据分割成默认的128m大小的的block块,并且把block块数据拆分成64kb的packet数据包,放入传输序列
4.客户端携带block块信息再次向namenode发送请求,获取能够存储block块数据的datanode列表
5.namenode查看当前距离上传位置较近且不忙的datanode,放入列表中返回给客户端
6.客户端连接datanode,开始发送packet数据包,第一个datanode接收完后就给客户端ack应答(客户端就可以传入下一个packet数据包),同时第一个datanode开始复制刚才接收到的数据包给node2,node2接收到数据包也复制给node3(复制成功也需要返回ack应答),最终建立了pipeline传输通道以及ack应答通道
7.其他packet数据根据第一个packet数据包经过的传输通道和应答通道,循环传入packet,直到当前block块数据传输完成(存储了block信息的datanode需要把已经存储的块信息定期的同步给namenode)
8.其他block块数据存储,循环执行上述4-7步,直到所有block块传输完成,意味着文件数据被写入成功(namenode把该文件的元数据保存上)
9.最后客户端和namenode互相确认文件数据已经保存完成(也会汇报不能使用的datanode)
1.客户端发送读取文件请求给namenode
2.namdnode接收到请求,然后进行一系列校验(路径是否存在,文件是否存在,是否有权限等),如果没有问题,就告知可以读取
3.客户端需要再次和namenode确认当前文件在哪些datanode中存储
4.namenode查看当前距离下载位置较近且不忙的datanode,放入列表中返回给客户端
5.客户端找到最近的datanode开始读取文件对应的block块信息(每次传输是以64kb的packet数据包),放到内存缓冲区中
6.接着读取其他block块信息,循环上述3-5步,直到所有block块读取完毕(根据块编号拼接成完整数据)
7.最后从内存缓冲区把数据通过流写入到目标文件中
8.最后客户端和namenode互相确认文件数据已经读取完成(也会汇报不能使用的datanode)
1.namenode第一次启动的时候先把最新的fsimage文件中内容加载到内存中,同时把edits文件中内容也加载到内存中
2.客户端发起指令(增删改查等操作),namenode接收到客户端指令把每次产生的新的指令操作先放到内存中
3.然后把刚才内存中新的指令操作写入到edits_inprogress文件中
4.edits_inprogress文件中数据到了一定阈值的时候,把文件中历史操作记录写入到序列化的edits备份文件中
5.namenode就在上述2-4步中循环操作…
6.当secondarynamenode检测到自己距离上一次检查点(checkpoint)已经1小时或者事务数达到100w,就触发secondarynamenode询问namenode是否对edits文件和fsimage文件进行合并操作
7.namenode告知可以进行合并
8.secondarynamenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行合并(这个过程称checkpoint)
9.secondarynamenode把刚才合并后的fsimage.checkpoint文件拷贝给namenode
10.namenode把拷贝过来的最新的fsimage.checkpoint文件,重命名为fsimage,覆盖原来的文件
注意: 不要死记硬背,要结合自己的理解,转换为自己的话术,用于面试
为了保证数据安全和效率,block块信息存储多个副本,第一副本保存在客户端所在服务器,第二副本保存在和第一副本不同机架服务器上,第三副本保存在和第二副本相同机架不同服务器
namenode为了保证不同的datanode中block块信息大体一样,分配存储任务的时候会优先保存在距离近且余量比较大的datanaode上
datanode每隔3秒钟向namenode汇报自己的状态信息,如果某个时刻,datanode连续10次不汇报了,namenode会认为datanode有可能宕机了,namenode就会每5分钟(300000毫秒)发送一次确认消息,连续2次没有收到回复,就认定datanode此时一定宕机了(确认datanode宕机总时间310+52*60=630秒)。观察地址http://node3:9864/datanode.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。