我刚刚开始学习Hadoop和map-reduce概念,并且在继续前进之前有几个我想要清除的问题:
根据我的理解:
当涉及大量数据时,专门使用Hadoop。当我们在HDFS中存储文件时,会发生的情况是,文件被分成不同的块(块大小通常为64MB或128MB ......或者为当前系统配置的任何内容)。现在,一旦将大文件拆分为各种块,则这些块将存储在群集上。这是由hadoop环境内部处理的。
问题的背景是:
让我们说系统中存储了多个如此庞大的文件。现在,这些不同文件的块可以存储在数据节点A(有3个数据节点,A,B和C)。而且,同一文件的多个块也可以存储在同一个数据节点A中。
场景1 :
如果客户端请求需要访问同一数据节点上的同一文件的多个块,那么会发生什么?是否会为这些不同的块分配多个映射器,或者同一个映射器将处理多个块?
同一问题的另一部分是,客户如何知道什么阻止或让我们说出处理需要哪个文件部分? 由于客户端不知道如何存储文件,它如何向NameNode询问块位置等? 或者对于每个这样的处理,是否处理了相应文件的所有块?我想问一下,NameNode上存储了哪些元数据?
Scenario2
如果有两个不同的请求访问同一数据节点上的不同文件块,那么会发生什么?在这种情况下,会有其他数据节点没有工作要做,并且不会在单个数据节点上出现瓶颈吗?
答案 0 :(得分:1)
1)映射器数量=文件块数。也就是说,每个块的单独映射器。理想情况下,没有。群集中的节点应该非常高,同一个文件中的两个块中没有一个存储在同一台机器上。
2)每当客户提交作业时,作业将在整个文件上执行,而不是在特定的块上执行。
3)当客户端提交作业或将文件存储在HDFS中时,它的框架如何运行。客户端不应该知道hadoop功能,基本上不是他的业务。客户应该只知道两件事 - 文件和工作(.jar)。
4)Namenode存储有关HDFS内存储的所有文件的所有元数据信息。它存储有关文件分发/分配的块数的信息。文件的每个块都存储在多少个节点/机器上。 平均而言,为了存储每个块的元数据信息,namenode需要150个字节。
5)场景2 :Namenode非常好地管理这些问题。 HDFS的defult复制因子为3,这意味着每个块将存储在3个不同的节点上。因此,通过这些其他节点,HDFS可以管理负载平衡,但是,复制的主要目标是确保数据可用性。但要考虑到读取文件内容的请求非常少。 Hadoop用于处理数据,而不仅仅是读取内容。
我希望这能解决你的一些疑虑。
答案 1 :(得分:0)
如果出现需要访问多个块的客户端请求 在同一个数据节点上的同一个文件,然后会发生什么?
客户端不需要是映射器,在此级别我们正在处理HDFS,数据节点将向请求它们的任何客户端提供相同的数据。
是否会有多个映射器分配给这些不同的块或>相同的映射器将处理多个块?
每个地图减少作业都有自己的地图制作工具。涉及相同数据块的更多作业意味着更多的映射器可以处理相同的数据。
同一问题的另一部分是,客户如何知道什么 阻止或让我们说一下文件的哪个部分是必需的 处理? 由于客户端不知道如何存储文件,它将如何询问 块位置等的NameNode? 或者对于每个这样的处理,相应文件的所有块 是处理?我的意思是问,NameNode上存储了哪些元数据?
客户端知道由于namenode需要哪些块。在文件访问开始时,客户端使用文件名转到namenode,并返回一个块列表,其中数据存储在保存它们的datanode中。 namenode将“目录信息”保存在数据所在的块列表中,所有这些信息都存储在RAM中,并在每次系统启动时更新。此外,datanode将心跳发送到namenode块分配信息。 每个datanode报告给每个namenode。
如果有两个不同的请求来访问不同的块 在同一个数据节点上的文件,然后会发生什么?在这种情况下, 将有其他数据节点没有工作要做,也不会有 单个数据节点的瓶颈?
除非datanode没有响应(失败),否则访问始终在同一个datanode上。复制不是用来使事情快速工作,而是确保没有数据丢失。 I.E:当您写入HDFS时,您的数据将被转发到任何复制块,这使得写入速度非常慢。我们需要确保数据是安全的。