例如,我在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块大小?应用程序主机如何知道应该选择哪个节点来运行拆分?
您能说清楚一点,给我一些链接以使其更深入吗?
答案 0 :(得分:1)
数据划分(将文件划分为块),这在物理上是真正的划分
拆分和HDFS块是一对多的关系;
HDFS块是数据的物理表示,而Split是块中数据的逻辑表示。
在数据局部性的情况下,该程序还从远程节点读取少量数据,因为行被剪切到不同的块。
当您读取文件时,就是这样
客户端通过调用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)。