hadoop—文件是否划分为块以存储在hdfs中?

zpf6vheq  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(313)

我知道hdfs中的块系统是底层文件系统之上的逻辑分区。但是当我发布一个 cat 命令。
假设我有一个1GB的文件。我的默认值 HDFS 块大小为64 mb。
我发出以下命令:

hadoop -fs copyFromLocal my1GBfile.db input/data/

上面的命令复制文件 my1GBfile.db 从我的本地计算机到 HDFS: 我有16个块要复制和复制(1 gb/64 mb~16)。
如果我有8个 datanodes ,单个数据节点可能没有所有的块来重新定位文件。
当我发出以下命令时

hadoop -fs cat input/data/my1GBfile.db | head

现在发生了什么?
文件是如何重建的?尽管块只是逻辑分区,但是1GB文件是如何物理存储的。它存储在hdfs上。每个数据节点是否都获得文件的某些物理部分。因此,通过将输入的1gb文件分成64MB的块,我们可能会在记录级别(比如在行间)破坏某些内容。这是怎么处理的?
我签入了我的datanode,我确实看到了一个 blk_1073741825 ,在编辑器中打开时,它实际上显示文件的内容。
因此,所生成的文件块不是逻辑的而是真实的 partition 发生了什么?
请澄清一下

pcrecxhr

pcrecxhr1#

除了前面的答案,您还可以使用javaapi获得有关块的信息。e、 你可以用 FilterFileSystem 类和 FilterFileSystem 方法。所以,您可以看到文件如何分割成块并存储在集群中。指向javaapi的链接:http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/filterfilesystem.html

vmjh9lq9

vmjh9lq92#

块实际上只是数据节点上的文件。当你 cat 在hdfs中的一个文件中,您的计算机直接从它们各自的数据节点流式传输这些块,并在本地重建整个文件。

yqhsw0fo

yqhsw0fo3#

据我所知,从你的问题,我的答案是这样的,根据我的理解。。。
首先,您需要了解b/w hdfs块大小和inputsplit大小的区别。
block size—hdfs的块大小(64/128/256 mb)实际上包含原始(1 gb)文件的数据。在内部/最终,这些数据存储在文件系统(ext等)上的块(4/8kb)中。因此,hdfs的块大小是原始文件的物理分区。
inputsplit—一个文件被分为inputsplit,inputsplit是文件的逻辑分区。逻辑分区意味着——它只包含块地址/位置的信息。hadoop使用存储在文件块中的数据(输入分割)的这种逻辑表示。当mapreduce作业客户端计算输入拆分时,它会计算出块中第一个完整记录的开始位置和块中最后一个记录的结束位置。
在块中最后一条记录不完整的情况下,输入分割包括下一块的位置信息和完成记录所需数据的字节偏移量。
希望,上面阐明了b/w块大小和输入拆分大小的差异。
现在来回答关于“hadoop fs-cat/”工作的问题---->
所有关于块位置的信息都作为元数据存储在namenode中。如果一个节点在记录级别被拆分,那么datanode将块的地址/位置信息发送给namenode。
因此,当客户端向hadoop发出“cat”命令时,基本上客户端会向namenode发送一个请求--“我想读取filea.txt,请提供存储在不同位置的该文件的所有块的位置”。namenode的职责是提供存储在各种datanode上的块的位置。
基于这些位置,客户机直接与这些块的数据节点联系。最后,客户机以相同的顺序/方式读取所有这些块,这些块存储在hdfs中(这里namenode将文件中所有块的地址返回给客户机),从而向客户机生成完整的文件。
希望我能澄清你的疑问。

相关问题