分裂发生在何时何地?

When and where does splitting happen?

例如,我在 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 块大小?应用程序主机如何知道应该选择哪个节点来 运行 拆分?

能否请您说清楚并给我一些链接以更深入地了解它?

数据的划分(将File划分为Block),这才是物理上真正的划分
Split和HDFS Block是一对多的关系;

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

在数据局部性的情况下,程序也会从远程节点读取少量数据,因为行被切割到不同的Block。

当你读一个文件时,它是这样的

客户端通过调用FileSystem对象的open()方法打开文件(对应HDFS文件系统,调用DistributedFileSystem对象)(即图中第一步)。 DistributedFileSystem通过RPC(Remote Procedure Call)调用调用NameNode来获取这个。文件前几个块的文件位置(第 2 步)。对于每一个block,namenode returns 是集群拓扑网络中所有拥有这个block备份的namenode的地址信息(按照距离client的远近排序。网络拓扑的实现方法见下文在 Hadoop 集群中)。

If the client itself is a datanode (if the client is a mapreduce task) and the datanode itself has the required file block, the client reads the file locally.

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