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