我对Hadoop中的块有一些疑问。我读到Hadoop使用HDFS,它将创建特定大小的块。
第一个问题这些块是否存在于普通文件系统(如NTFS)上的Harddisk上,即我们可以看到托管文件系统(NTFS)上的块,还是只能使用hadoop命令看到它们?
第二个问题 hadoop在运行任务之前是否创建了块,即只要存在文件就从一开始就存在块,或者只有在运行任务时hadoop才会创建块。
第三个问题在分割之前是否确定并创建了块(即,InputFormat类的getSplits方法),无论分割数量多少,或者取决于分割后?
Forth Question 运行任务之前和之后的块是否相同或者取决于配置,是否有两种类型的块用于存储文件,另一种用于分组文件并发送它们通过网络到数据节点执行任务?
答案 0 :(得分:1)
在NTFS这样的普通文件系统上硬盘上是否存在块,即我们可以看到托管文件系统(NTFS)上的块,还是只能使用hadoop命令看到它?
是的,这些块在物理上存在于群集中数据节点的磁盘上。我想你可以“看到”它们,如果你在其中一个数据节点上并且你真的想要,但它可能不会有启发性。它只是一个随机的128m(或者在dfs.block.size
中设置的任何hdfs-site.xml
)文件,没有有意义的文件名。 hdfs dfs
命令使您可以将HDFS视为“真正的”文件系统。
hadoop在运行任务之前是否创建了块,即只要存在文件就从一开始就存在块,或者只有在运行任务时hadoop才会创建块。
当您将文件放入HDFS时(通过适用于您的情况的任何方法),Hadoop负责将文件拆分为块并在数据节点之间分配。
在分割之前是否确定并创建块(即,InputFormat类的getSplits方法),无论分割数量多少,或者取决于分割后?
不完全确定你的意思,但是这些块之前存在,而不管你用它们做什么处理。
运行任务之前和之后的块是否相同或者取决于配置,有两种类型的块用于存储文件,一种用于分组文件并通过网络将它们发送到数据节点以执行任务?
同样,HDFS中的块在任何处理完成之前确定,如果有的话完成的话。 HDFS只是一种以分布式方式存储大文件的方法。当您进行处理时,例如使用MapReduce作业,Hadoop会将中间结果写入磁盘。这与阻止HDFS中的原始文件无关。
答案 1 :(得分:1)
1.在NTFS等普通文件系统上硬盘上是否存在块,即我们可以看到托管文件系统(NTFS)上的块,还是只能使用hadoop命令看到它?
是。块物理存在。您可以使用hadoop fsck /path/to/file -files -blocks
有关查看块的命令,请参阅下面的SE问题:
Viewing the number of blocks for a file in hadoop
2.在运行任务之前,hadoop是否创建了块,即只要存在文件就从一开始就存在块,或者只有在运行任务时hadoop才会创建块。
Hadoop =分布式存储( HDFS )+分布式处理( MapReduce& Yarn)。
MapReduce作业适用于输入拆分=>输入拆分是从Datanodes中的数据块创建的。在文件的写入操作期间创建数据块。如果您正在对现有文件运行作业,则会在作业之前预先设置数据块,并在Map操作期间创建InputSplits。您可以将数据块视为物理实体,将InputSplit视为逻辑实体。 Mapreduce作业不会更改输入数据块。 Reducer生成输出数据作为新数据块。
Mapper 处理输入拆分并将输出发送到 Reducer 作业。
3.第三个问题在分割之前是否确定和创建块(即InputFormat类的getSplits方法),无论分割数量多少,或者取决于分割后?
输入已经可用于物理DFS块。 MapReduce作业在InputSplit中有效。 Blocks和InputSplits可能相同也可能不同。 Block是一个物理实体,InputSplit是逻辑实体。有关详细信息,请参阅下面的SE问题:
How does Hadoop perform input splits?
4.Forth问题运行任务之前和之后的块是否相同或者取决于配置,有两种类型的块用于存储文件,一种用于分组文件并通过网络将它们发送到数据节点执行任务?
映射器输入:输入块预先存在。映射过程从输入块/拆分开始,在Mapper作业开始之前已存储在HDFS中。
映射器输出:未存储在HDFS中,将复制因子X大于1的HDFS存储中间结果没有意义。
减速机输出:减速机输出存储在HDFS中。块数取决于reducer输出数据的大小。