据我所知,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
的数据发生了吗?
请帮助澄清一下
到目前为止,我从你的问题中了解到,根据我的理解,我的回答是这样的......
首先,您需要了解b/w 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将文件的所有块的地址返回给客户端) - 从而为客户端生成完整的文件.
希望,我可以澄清一下你的疑问.