HDFS笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS笔记相关的知识,希望对你有一定的参考价值。
参考技术A 1.Hadoop 分布式 文件系统。特点:性能高、效率高、速度快
2.可以在廉价的机器上运行的 可容错 文件系统。
当集群中有机器挂掉时,HDFS会自动将挂掉的机器上的任务分配给正常的机器,使任务继续保持正常工作。
2.HDFS处理更加容易。当对一个大型文件进行写操作时,如果将该文件整个写入一个节点,那么该节点的负载便会急剧增加,这样就丧失了分布式文件系统的意义。所以,应该利用HDFS将文件拆分成不同的块,然后将不同的块分配到不同的节点上去,此时,DFS就需要管理者确定文件如何进行拆分,以及每一个块应该分配到哪一个节点。对文件进行操作时,在单机情况下,首先需要知道文件被拆分成多少块,每一个块被放在了哪一个节点上,以及块之间的顺序(文件的粘连)。而HDFS的出现,使得分布式文件集群不再需要人进行管理,利用HDFS读取文件时,我们不需要关心文件如何拆分,分配,粘连。只用告诉HDFS文件的路径即可。
HDFS的指令类似于linux下的指令。
查看文件:hdfs dfs -ls /查询的文件目录
删除文件:hdfs dfs -rm r /删除的文件
创建文件夹:hdfs dfs -mkdir /文件夹名称
上传文件至HDFS:hdfs dfs -put 需要上传的文件 /上传的文件路径
为什么需要学习HDFS结构?
1.面试中,能够运用于所有分布式文件系统设计。
既然分布式系统下是多节点运行,那么节点之间是否通信?slave节点只接受来自master节点的命令,向master节点发送心跳指令,slave节点之间不会主动通信。
a.Master slaver 模式:
1.High consistency:一致性。当文件中的一个数据块写入slave节点时,当且仅当数据块被成功写入到所有备份的slave节点,slave节点向client反馈写入操作成功,否则,重传写入;
2.Simple design:易设计:不需要考虑子节点如何通信。只需要考虑主节点的工作;
3.单master节点不具有鲁棒性。
b.Peer peer 模式:
1.所有的读写操作均匀分布在每一个节点上,每一个节点的负载不会很高;
2.任意一个节点挂掉不会影响其他节点;
3.低一致性。没有数据的复制步骤。
2.更好的理解hadoop生态系统
a.master节点会传输数据吗?
不会,master节点只接收client的请求,决定哪一个slave节点进行读写操作,然后,client直接与slave节点进行通信。如果数据从master节点传输,那么master节点就会成为影响数据传输的瓶颈。
b.slave节点如何存储数据?
整个大文件?小的文件块?。HDFS借鉴GFS的设计理念,以block为传输单位,将大文件拆分成一个一个小文件,而一个小文件就是block。block的大小可以由Configuration定义,默认大小是128M。
c.谁来决定将文件拆分成块?
master?slave?。两者都不是,由HDFS client决定将大文件拆分成block(块)。HDFS的目的是将所有的节点包装起来,可以理解成将所有的节点放在一个黑箱里,我们不需要知道黑箱里到底发生了什么,只需要告诉黑箱需要做什么工作,这里的HDFS client相当于HDFS与user通信的中间媒介。HDFS client相当于一个软件包(api),可以存放在master或者slave或者额外的一个新节点上。
写入in memory失败(ACK出现问题)时,master会重新选择3个新的slave节点。
HDFS学习笔记初探HDFS
Hadoop分布式文件系统(Hadoop Distributed File System, HDFS)
分布式文件系统是一种同意文件通过网络在多台主机上分享的文件系统。可让多机器上的多用户分享文件和存储空间。
hdfs仅仅是当中一种。适用于一次写入、多次查询的情况。不支持并发写情况。小文件不合适。
2.HDFS架构
HDFS採用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心server,负责管理文件系统的名字空间(namespace)以及client对文件的訪问。
集群中的Datanode通常是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间。用户可以以文件的形式在上面存储数据。从内部看,一个文件事实上被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode运行文件系统的名字空间操作,比方打开、关闭、重命名文件或文件夹。它也负责确定数据块到详细Datanode节点的映射。Datanode负责处理文件系统client的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
NameNode
- 是整个文件系统的管理节点。
它维护着整个文件系统的文件文件夹树,文件/文件夹的元信息和每个文件相应的数据块列表。
接收用户的操作请求。
- 文件包括: (详细查看 dfs.name.dir文件夹)
- fsimage: 元数据镜像文件。
存储某一时段NameNode内存元数据信息。
- edits: 操作日志文件。
- fstime: 保存近期一次checkpoint的时间
- fsimage: 元数据镜像文件。
- 以上这些文件是保存在linux的文件系统中。
DataNode
- 提供真实文件数据的存储服务。
- 文件块(block):最主要的存储单位。对于文件内容而言,一个文件的长度大小是size。那么从文件的0偏移開始,依照固定的大小,顺序对文件进行划分并编号,划分好的每个块称一个Block。HDFS默认Block大小是128MB。以一个512MB文件,共同拥有4个Block.
- 不同于普通文件系统的是,HDFS中。假设一个文件小于一个数据块的大小,并不占用整个数据块存储空间
- Replication。多副本。默认是三个。
SecondaryNameNode
- HA(High Availability 高可用性)的一个解决方式。
但不支持热备。
配置就可以。
- 运行过程:从NameNode上下载元数据信息(fsimage,edits)。然后把二者合并。生成新的fsimage。在本地保存,并将其推送到NameNode,同一时候重置NameNode的edits.
- 默认在安装在NameNode节点上,但这样…不安全!
HDFS读过程
1.初始化FileSystem。然后client(client)用FileSystem的open()函数打开文件
2.FileSystem用RPC调用元数据节点。得到文件的数据块信息。对于每个数据块,元数据节点返回保存数据块的数据节点的地址。
3.FileSystem返回FSDataInputStream给client。用来读取数据。client调用stream的read()函数開始读取数据。
4.DFSInputStream连接保存此文件第一个数据块的近期的数据节点。data从数据节点读到client(client)
5.当此数据块读取完成时。DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的近期的数据节点。
6.当client读取完成数据的时候,调用FSDataInputStream的close函数。
7.在读取数据的过程中。假设client在与数据节点通信出现错误,则尝试连接包括此数据块的下一个数据节点。
8.失败的数据节点将被记录。以后不再连接。
HDFS写过程
1.初始化FileSystem,client调用create()来创建文件
2.FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。元数据节点首先确定文件原来不存在。而且client有创建文件的权限,然后创建新文件。
3.FileSystem返回DFSOutputStream。client用于写数据,client開始写入数据。
4.DFSOutputStream将数据分成块,写入data queue。
data queue由Data Streamer读取。并通知元数据节点分配数据节点。用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
5.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
6.当client结束写入数据,则调用stream的close函数。此操作将全部的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完成。
7.假设数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的開始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重新启动后可以察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。
官方文档
以上是关于HDFS笔记的主要内容,如果未能解决你的问题,请参考以下文章