何时何地发生分裂?

时间:2018-11-08 12:33:54

标签: hadoop mapreduce hdfs bigdata

例如,我在HDFS中有一个1 Gb的文件,例如

2018-10-10 12:30  
EVENT INFORMATION  
2018-10-10 12:35  
ANOTHER EVENT INFORMATION  
...

所以我需要使用NLineInputFormat(N = 2),对吧?
问题在于更多的概念性原则。这个1 Gb文件何时何地转换为InputSplits? hadoop如何处理不同的拆分逻辑?它是否需要解析整个文件以创建拆分(因为我们需要遍历文件才能逐行计数行数)?
该文件在HDFS(1024/128)中分为8个块。因此,当我提交作业时,Hadoop会在每个节点上使用该文件的块(默认分割大小)启动映射器。

如果我的文件没有被整齐地分割会怎样?喜欢

<block1>
...
2018-10-10 12:
</block1>
<block2>
40
EVENT INFORMATION
...
</block2> 

第一个映射器将如何知道位于另一个数据节点上的其余部分?

如果分割大小= 1/2块大小会发生什么?还是4/5块大小?应用程序主机如何知道应该选择哪个节点来运行拆分?

您能说清楚一点,给我一些链接以使其更深入吗?

1 个答案:

答案 0 :(得分:1)

数据划分(将文件划分为块),这在物理上是真正的划分
拆分和HDFS块是一对多的关系;

HDFS块是数据的物理表示,而Split是块中数据的逻辑表示。

在数据局部性的情况下,该程序还从远程节点读取少量数据,因为行被剪切到不同的块。

当您读取文件时,就是这样

enter image description here

客户端通过调用FileSystem对象的open()方法(对应于HDFS文件系统并调用DistributedFileSystem对象)打开文件(即,图中的第一步)。 DistributedFileSystem通过RPC(远程过程调用)调用来调用NameNode来获取此名称。文件的前几个块的文件位置(步骤2)。对于每个块,namenode返回具有该块备份的所有namenode的地址信息(按距群集拓扑网络中与客户端的距离排序。有关如何在Hadoop群集中执行网络拓扑的信息,请参见以下内容)

  

如果客户端本身是数据节点(如果客户端是mapreduce   任务),并且datanode本身具有所需的文件块,客户端   本地读取文件。

上述步骤完成后,DistributedFileSystem将返回FSDataInputStream(支持文件查找),客户端可以从FSDataInputStream读取数据。 FSDataInputStream包装DFSInputSteam类,该类处理名称节点和数据节点的I / O操作。
然后,客户端执行read()方法(步骤3),并将DFSInputStream(已经存储了要读取的文件的前几个块的位置信息)连接到第一个数据节点(即最近的数据节点) )以获取数据。通过重复调用read()方法(第四和第五步),文件中的数据将流式传输到客户端。读取块的末尾时,DFSInputStream关闭指向该块的流,而是查找下一个块的位置信息,然后重复调用read()方法以继续流传输该块。
这些过程对用户是透明的,并且在用户看来这是整个文件的不间断流。
读取整个文件后,客户端将调用FSDataInputSteam中的close()方法以关闭文件输入流(步骤6)。