hdfs客户机在hdfs集群之外。当hdfs客户机将文件写入hadoop时,hdfs客户机将文件分成块,然后将块写入datanode。这里的问题是hdfs客户机如何知道块大小?块大小在名称节点中配置,而hdfs客户机不知道块大小,那么它将如何将文件拆分为块?
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集群上配置的块大小。希望这有帮助
8ehkhllq2#
简单地说,当您部署客户端uri时,它会将服务器uri放入客户端,或者您在客户端下载并手动替换。因此,每当客户机请求信息时,它都会转到namenode并获取所需的信息或在datanodes上放置新信息。p、 s:客户端=边缘节点
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对数据一无所知,让客户机决定最佳分割,并定义文件块的复制因子。
3条答案
按热度按时间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最终指南)
}
如果您查看filesystem类中的create()方法实现,它将getdefaultblocksize()作为其参数之一,inturn从namenode提供的配置中获取值。这就是客户机如何知道hadoop集群上配置的块大小。
希望这有帮助
8ehkhllq2#
简单地说,当您部署客户端uri时,它会将服务器uri放入客户端,或者您在客户端下载并手动替换。因此,每当客户机请求信息时,它都会转到namenode并获取所需的信息或在datanodes上放置新信息。
p、 s:客户端=边缘节点
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对数据一无所知,让客户机决定最佳分割,并定义文件块的复制因子。