Hadoop以数据节点(DN)上的块形式保存文件,有关文件的元数据保存到名称节点(NN)中。每当客户端读取任何文件时,NN就会发送一个读取管道(DN列表),从中拾取文件块。读取管道包含最近的 DN(w.r.t客户端)以提供读取请求。
我很想知道NN如何保存文件块的DN信息。我的意思是数据结构。它是包含DN的所有副本位置信息的图表吗?然后在创建读取管道时,一些算法用于查找客户端和相应DN之间的最短路径?
答案 0 :(得分:1)
实际上并没有一个名为“read pipeline”的术语。对于读/写请求,粒度是块级。通常,写入管道类似于:client - > DN1 - > DN2 - > DN3。对于读取,客户端连接NN以获取包含要读取的块的副本的DN列表。然后客户端直接从最近的DN读取数据,而不涉及其他DN(如果出现错误,客户端可能会尝试列表中的另一个DN)。
关于块信息的DN的“数据结构”,有一个块 - >内存映射的DN由NN维护。基本上,映射是一个映射。要更新地图,DN会定期向NN报告其本地块副本。
客户可以自由选择最近的DN进行阅读。为此,HDFS应该是拓扑感知的。来自HDFS architecture doc:
为了最大限度地减少全局带宽消耗和读取延迟,HDFS尝试满足最接近读取器的副本的读取请求。如果在与读取器节点相同的机架上存在副本,则该副本首选满足读取请求。如果angg / HDFS群集跨越多个数据中心,则驻留在本地数据中心的副本优先于任何远程副本。