hdfs客户机在编写时如何知道块大小?

zbdgwd5y  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(372)

hdfs客户机在hdfs集群之外。当hdfs客户机将文件写入hadoop时,hdfs客户机将文件分成块,然后将块写入datanode。
这里的问题是hdfs客户机如何知道块大小?块大小在名称节点中配置,而hdfs客户机不知道块大小,那么它将如何将文件拆分为块?

nbewdwxp

nbewdwxp1#

下面是更多细节(摘自hadoop权威指南第4版)

“客户端通过调用distributedfilesystem上的create()来创建文件(图3-4中的步骤1)。distributedfilesystem对namenode进行rpc调用,以便在文件系统的命名空间中创建一个新文件,并且没有与之关联的块(步骤2)。namenode执行各种检查,以确保该文件不存在,并且客户端具有创建该文件的正确权限。如果这些检查通过,namenode将记录新文件;否则,文件创建失败,客户端将抛出ioexception。distributedfilesystem返回一个fsdataoutputstream,供客户端开始向其写入数据。就像在read案例中一样,fsdataoutputstream Package 了dfsoutputstream,它处理与datanodes和namenode的通信。当客户端写入数据(步骤3)时,dfsoutputstream会将其拆分为数据包,然后将数据包写入称为数据队列的内部队列
添加更多信息以回应此帖子的评论:
下面是一个将文件复制到hdfs的示例客户端程序(源代码hadoop最终指南)

public class FileCopyWithProgress {
public static void main(String[] args) throws Exception {
    String localSrc = args[0];
    String dst = args[1];

    InputStream in = new BufferedInputStream(new FileInputStream(localSrc));

    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(URI.create(dst), conf);
    OutputStream out = fs.create(new Path(dst), new Progressable() {
        public void progress() {
            System.out.print(".");
        }
    });

    IOUtils.copyBytes(in, out, 4096, true);
}

}
如果您查看filesystem类中的create()方法实现,它将getdefaultblocksize()作为其参数之一,inturn从namenode提供的配置中获取值。这就是客户机如何知道hadoop集群上配置的块大小。
希望这有帮助

8ehkhllq

8ehkhllq2#

简单地说,当您部署客户端uri时,它会将服务器uri放入客户端,或者您在客户端下载并手动替换。因此,每当客户机请求信息时,它都会转到namenode并获取所需的信息或在datanodes上放置新信息。
p、 s:客户端=边缘节点

gc0ot86w

gc0ot86w3#

hdfs的设计方式是,特定文件的块大小是元数据的一部分。
让我们看看这是什么意思?
客户机可以告诉namenode它将把数据放入具有特定块大小的hdfs。客户机有自己的hdfs-site.xml,它可以包含这个值,并且可以使用-ddfs.blocksize参数按请求指定它。
如果客户端配置未定义此参数,则默认为org.apache.hadoop.hdfs.dfsconfigkeys.dfs\u block\u size\u默认值,即128mb。
如果namenode指定的块大小小于dfs.namenode.fs-limits.min-block-size(默认情况下为1mb),则它可能会为客户端引发错误。
这并没有什么神奇之处,namenode对数据一无所知,让客户机决定最佳分割,并定义文件块的复制因子。

相关问题