据我所知,HDFS中的块系统是基础文件系统之上的逻辑分区。
但是,当我发出cat
命令时,如何检索文件。
假设我有一个1 GB的文件。我的默认HDFS
块大小为64 MB。
我发出以下命令:
hadoop -fs copyFromLocal my1GBfile.db input/data/
以上命令将文件my1GBfile.db
从本地计算机复制到HDFS:
我有16个要复制和复制的块(1 GB / 64 MB~16)。
如果我有8 datanodes
,则单个datanode可能没有所有块来重建文件。
当我发出以下命令时
hadoop -fs cat input/data/my1GBfile.db | head
现在发生了什么?
文件是如何重构的?虽然块只是逻辑分区,但1 GB文件是如何物理存储的。它存储在HDFS上。每个datanode获取文件的一些物理部分。 因此,通过将输入1GB文件分成64 MB块,我们可能会破坏记录级别的某些内容(例如在行之间)。这是怎么处理的?
我检查了我的datanode,我确实看到了blk_1073741825
,在编辑器中打开时实际上显示了该文件的内容。
所创建的文件块是不合逻辑的,但是真正的partition
数据会发生?
请帮助澄清这个
答案 0 :(得分:6)
到目前为止,我从你的问题中了解到,根据我的理解,我的回答是这样的......
首先,您需要了解不同的黑白HDFS块大小和inputSplit大小。
块大小 - HDFS的块大小(64/128/256 MB)实际上包含原始(1 GB)文件的数据。并且内部/最终这些数据存储在fileSystem(ext等)上的块(4/8 KB)中。因此,HDFS的块大小是原始文件的物理分区。
InputSplit - 文件被分成输入分割,它是文件的逻辑分区。逻辑分区意味着 - 它只具有块地址/位置的信息。 Hadoop使用存储在文件块中的数据(输入拆分)的逻辑表示。当MapReduce作业客户端计算输入拆分时,它会计算块中第一个完整记录的开始位置以及块中最后一个记录的结束位置。
如果块中的最后一条记录不完整,则输入拆分包括下一个块的位置信息和完成记录所需数据的字节偏移。
希望,上面的区别是b / w块大小和输入分割大小。
现在回答你关于'hadoop fs -cat /'工作的问题----->
有关块位置的所有信息都作为元数据存储在NameNode中。如果节点在记录级别被拆分,则DataNode将块的地址/位置信息发送到NameNode。
因此,当客户端向Hadoop发出'cat'命令时,基本上客户端向NameNode发送一个请求 - “我想读取fileA.txt,请提供我存储在各种文件中的所有块的位置位置”。 NameNode的职责是提供存储在各种DataNode上的块的位置。
根据这些位置,客户端直接与DataNode联系以获取这些块。最后,客户端以相同的顺序/方式读取所有这些块,这些块在HDFS中存储(此处NameNode将文件的所有块的地址返回给客户端) - 从而为客户端生成完整的文件。
希望,我能稍微澄清你的疑问。
答案 1 :(得分:4)
块实际上只是datanode上的文件。当您在HDFS中cat
文件时,您的计算机直接从各自的数据节点流式传输这些块,并在本地重建整个文件。
答案 2 :(得分:0)
除了之前的回答,您还可以使用Java API获取有关块的信息。例如,您可以在此课程中使用FilterFileSystem
课程和FilterFileSystem
方法。因此,您可以看到如何将文件拆分为块并存储在群集中。
链接到JavaAPI:http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FilterFileSystem.html