HDFS DataNode 的数据写入与读取流程细节

各位观众老爷们,大家好!我是你们的老朋友,江湖人称“代码诗人”的码农张三。今天,咱们不聊风花雪月,不谈人生理想,就来扒一扒Hadoop大象屁股后面那坨叫做DataNode的东西,哦不,是DataNode的写入和读取流程。听起来是不是有点枯燥?别急,我保证用最幽默风趣的语言,把这坨“数据”给你揉碎了、嚼烂了、喂到你嘴里!😋

开场白:HDFS,数据世界的巨无霸

Hadoop HDFS,就像一个巨大的分布式文件系统,存储着海量的数据。它之所以能扛得住这么大的压力,就得归功于它的架构设计:NameNode负责掌管全局,DataNode负责实际存储数据。NameNode就像一个高高在上的皇帝,发号施令;DataNode就像勤勤恳恳的农民,默默耕耘。

今天,咱们的主角就是这些默默耕耘的DataNode。它们就像一个个辛勤的蜜蜂,不停地接收、存储、发送数据。那么,这些蜜蜂是如何工作的呢?咱们一起走进DataNode的世界,看看它们是如何“酿蜜”的。

第一幕:数据写入流程,一场惊心动魄的冒险

想象一下,你要把一封情书(数据)寄给远方的女神(HDFS)。DataNode就是那些帮你传递情书的快递小哥,他们可不是简单地把情书丢到女神家门口就完事了,他们要保证情书安全、完整地送到女神手里。

  1. 客户端的请求:女神我来了!

    首先,你的程序(客户端)会告诉NameNode:“我要往HDFS里写数据啦!”NameNode就像女神的闺蜜,会告诉你:“好啊,这几个DataNode(A, B, C)有空,你去找他们吧!”

    这个过程,客户端会向NameNode发送一个create()请求,NameNode会返回一个DataNode列表,这个列表里包含了多个DataNode的地址。

    Client -> NameNode (create("my_file.txt"))
    NameNode -> Client ([DataNode A, DataNode B, DataNode C])
  2. 建立管道:连接爱的桥梁

    拿到DataNode列表后,客户端会选择列表中的第一个DataNode(A)建立连接,这个连接就像一座桥梁,连接着你的情书和女神的心。

    客户端会向DataNode A发送一个writeBlock()请求,DataNode A收到请求后,会和DataNode B建立连接,DataNode B再和DataNode C建立连接。这样,就形成了一个数据管道,数据会像水一样,沿着管道流向各个DataNode。

    Client -> DataNode A (writeBlock())
    DataNode A -> DataNode B
    DataNode B -> DataNode C
  3. 数据传输:情书的传递

    客户端会将数据切分成一个个小的数据块(Packet),然后将这些Packet沿着管道依次发送给DataNode A、DataNode B、DataNode C。就像快递小哥把情书一页一页地传递给女神一样。

    每个DataNode在接收到Packet后,会先将Packet存储到本地磁盘上,然后将Packet转发给下一个DataNode。这个过程就像接力赛一样,每个DataNode都是一个接力棒。

    Client -> DataNode A (Packet 1)
    DataNode A -> DataNode B (Packet 1)
    DataNode B -> DataNode C (Packet 1)
    
    Client -> DataNode A (Packet 2)
    DataNode A -> DataNode B (Packet 2)
    DataNode B -> DataNode C (Packet 2)
    
    ...
  4. 确认接收:爱的回应

    当最后一个DataNode(C)接收到Packet后,会向DataNode B发送一个确认信息(ACK),表示自己已经成功接收。DataNode B收到ACK后,会向DataNode A发送ACK,DataNode A收到ACK后,会向客户端发送ACK。

    这个过程就像女神收到情书后,会给你一个微笑一样,表示她已经收到了你的心意。

    DataNode C -> DataNode B (ACK)
    DataNode B -> DataNode A (ACK)
    DataNode A -> Client (ACK)
  5. 关闭管道:情书传递完毕

    当所有的数据块都传输完毕后,客户端会向DataNode A发送一个close()请求,DataNode A会依次关闭和DataNode B、DataNode C的连接,关闭管道。

    Client -> DataNode A (close())
    DataNode A -> DataNode B (close())
    DataNode B -> DataNode C (close())

表格总结:数据写入流程

步骤 操作 描述
1 客户端请求 NameNode 客户端发送 create() 请求,请求写入数据。NameNode 返回 DataNode 列表。
2 建立管道 客户端和第一个 DataNode 建立连接,然后 DataNode 之间依次建立连接,形成数据管道。
3 数据传输 客户端将数据切分成 Packet,沿着管道依次发送给 DataNode。每个 DataNode 存储 Packet 并转发给下一个 DataNode。
4 确认接收 最后一个 DataNode 接收到 Packet 后,依次向上游 DataNode 发送 ACK,最终客户端收到 ACK。
5 关闭管道 客户端发送 close() 请求,DataNode 依次关闭连接。

第二幕:数据读取流程,寻找记忆的碎片

现在,女神想回忆一下你写给她的情书(读取数据)。DataNode就是那些保存着情书副本的“记忆盒子”,你需要找到这些盒子,然后把里面的内容拼凑起来,才能还原完整的情书。

  1. 客户端的请求:女神想你了!

    客户端会告诉NameNode:“我要读取HDFS上的某个文件!”NameNode就像女神的闺蜜,会告诉你:“好啊,这个文件的数据块分布在这些DataNode(A, B, C)上,你去他们那里找找吧!”

    客户端会向NameNode发送一个open()请求,NameNode会返回一个DataNode列表,这个列表里包含了多个DataNode的地址,以及每个DataNode上存储的数据块信息。

    Client -> NameNode (open("my_file.txt"))
    NameNode -> Client ([DataNode A(block1), DataNode B(block1), DataNode C(block1)])
  2. 选择DataNode:选择最佳记忆

    客户端会根据一定的策略(例如,选择距离最近的DataNode),选择一个DataNode(A)建立连接,开始读取数据。

    客户端会向DataNode A发送一个readBlock()请求,请求读取某个数据块。

    Client -> DataNode A (readBlock(block1))
  3. 数据传输:回忆的涌现

    DataNode A会将数据块从磁盘上读取出来,然后通过网络发送给客户端。这个过程就像女神从记忆深处挖掘出你的情书一样。

    DataNode A -> Client (data of block1)
  4. 数据验证:确认记忆的真实性

    客户端在接收到数据后,会对数据进行校验,确保数据的完整性和正确性。这个过程就像女神仔细阅读你的情书,确认每一个字、每一句话都是你真心实意的表达。

    客户端会使用校验和(checksum)来验证数据的完整性。如果在验证过程中发现数据错误,客户端会向NameNode报告,并尝试从其他DataNode读取相同的数据块。

  5. 重复步骤:寻找所有记忆碎片

    如果文件包含多个数据块,客户端会重复步骤2-4,从不同的DataNode读取不同的数据块,直到读取完所有的数据块。

  6. 数据拼接:重温完整爱情

    客户端会将从不同DataNode读取到的数据块拼接起来,还原成完整的文件。这个过程就像女神将所有情书的碎片拼凑在一起,重新感受到你浓浓的爱意。

表格总结:数据读取流程

步骤 操作 描述
1 客户端请求 NameNode 客户端发送 open() 请求,请求读取文件。NameNode 返回 DataNode 列表,包含数据块分布信息。
2 选择 DataNode 客户端根据策略选择 DataNode,并建立连接。
3 数据传输 DataNode 将数据块从磁盘读取出来,发送给客户端。
4 数据验证 客户端对数据进行校验,确保数据的完整性和正确性。
5 重复步骤 如果文件包含多个数据块,重复步骤2-4,直到读取完所有的数据块。
6 数据拼接 客户端将读取到的数据块拼接起来,还原成完整的文件。

第三幕:DataNode的心路历程,不为人知的秘密

DataNode看似简单,但它内部的实现却非常复杂。它要处理各种各样的请求,要保证数据的可靠性和可用性,还要进行各种各样的优化。

  • 数据存储:磁盘管理的艺术

    DataNode会将数据存储到本地磁盘上。为了提高磁盘的利用率,DataNode会将多个小文件合并成一个大的文件进行存储。这个过程就像把散落在各个角落的零钱收集起来,放到一个存钱罐里一样。

    DataNode还会对数据进行压缩,以减少磁盘空间的占用。这个过程就像把衣服叠起来,放到行李箱里一样。

  • 数据校验:火眼金睛的守护者

    DataNode会对存储在磁盘上的数据进行周期性的校验,以检测数据是否损坏。如果发现数据损坏,DataNode会尝试从其他DataNode复制数据,进行修复。这个过程就像医生定期给病人做体检,及时发现并治疗疾病一样。

  • 心跳机制:和NameNode的爱的呼唤

    DataNode会定期向NameNode发送心跳信息,告诉NameNode自己还活着。如果NameNode长时间没有收到某个DataNode的心跳信息,就会认为该DataNode已经失效,并将其从DataNode列表中移除。这个过程就像情侣之间每天都要发短信、打电话,确认对方还爱着自己一样。

总结:DataNode,HDFS的基石

DataNode是HDFS的核心组件之一,它负责实际存储数据,并提供数据的读取和写入服务。它的高效、可靠的运行,是HDFS能够存储海量数据的关键。

DataNode的数据写入流程就像一场惊心动魄的冒险,数据读取流程就像寻找记忆的碎片。DataNode的心路历程充满着挑战和艰辛。但是,正是这些DataNode默默无闻的付出,才构建了HDFS这个强大的分布式文件系统。

好了,今天的讲解就到这里。希望通过我的讲解,大家对DataNode的写入和读取流程有了更深入的了解。如果大家觉得我的讲解还不错,记得点赞、收藏、转发哦!我们下期再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注