1.这些块是否物理存在于普通文件系统(如 NTFS)的硬盘上,即我们可以看到托管文件系统(NTFS)上的块还是只能使用 hadoop 命令看到它们?
是的。块是物理存在的。您可以使用类似的命令hadoop fsck /path/to/file -files -blocks
有关查看块的命令,请参阅以下 SE 问题:
查看hadoop中文件的块数 https://stackoverflow.com/questions/11168427/viewing-the-number-of-blocks-for-a-file-in-hadoop
2.hadoop是否在运行任务之前创建块,即每当有文件时块就从一开始就存在,或者hadoop仅在运行任务时创建块。
Hadoop = 分布式存储(HDFS) + 分布式处理 (MapReduce 和 Yarn).
MapReduce 作业处理输入拆分 => 输入拆分是从 Datanode 中的数据块创建的。数据块是在文件的写操作期间创建的。如果您在现有文件上运行作业,则在作业之前预先创建数据块,并在 Map 操作期间创建 InputSplits。您可以将数据块视为物理实体,将InputSplit视为逻辑实体。 Mapreduce 作业不会更改输入数据块。 Reducer 生成输出数据作为新的数据块。
Mapper处理输入拆分并将输出发送到Reducer job.
3.第三个问题无论分割次数如何,块是否会在分割之前(即InputFormat类的getSplits方法)确定并创建,还是根据分割数在分割之后确定和创建?
输入已可用于物理 DFS 块。 MapReduce 作业在 InputSplit 中工作。 Blocks 和 InputSplit 可能相同也可能不同。 Block是物理实体,InputSplit是逻辑实体。请参阅下面的 SE 问题了解更多详细信息:
Hadoop 如何执行输入拆分? https://stackoverflow.com/questions/2831507/how-does-hadoop-perform-input-splits/34247868#34247868
4.第四个问题运行任务之前和之后的块是否相同或者取决于配置,是否有两种类型的块,一种用于存储文件,一种用于对文件进行分组并通过网络将它们发送到数据节点以执行任务任务?
映射器输入:输入块已存在。映射过程在输入块/分割上启动,这些块/分割在映射器作业开始之前已存储在 HDFS 中。
映射器输出:不存储在 HDFS 中,并且将复制因子 X 大于 1 的中间结果存储在 HDFS 上没有意义。
减速机输出:Reducer 输出存储在 HDFS 中。块的数量将取决于减速器输出数据的大小。