Sur*_*ian 5 hadoop hdfs hadoop-partitioning hadoop2
HDFS 客户端位于 HDFS 集群之外。当 HDFS 客户端将文件写入 hadoop 时,HDFS 客户端将文件拆分为块,然后将块写入数据节点。
这里的问题是 HDFS 客户端如何知道 Blocksize ?块大小在 Name 节点中配置,而 HDFS 客户端不知道块大小,那么它将如何将文件拆分为块?
下面有更多详细信息(来自 Hadoop Definitive Guide 第 4 版)
\n\n\n\n“客户端通过调用 DistributedFileSystem 上的 create() 创建文件(图 3-4 中的步骤 1)。DistributedFileSystem 对名称节点进行 RPC 调用,以在文件系统\xe2\x80\x99s 命名空间中创建一个新\n文件,其中没有与之关联的块(步骤 2)。\nnamenode 执行各种检查以确保该文件\xe2\x80\x99 不存在,并且\n客户端具有创建该文件的正确权限。如果这些检查通过,则namenode\n记录新文件;否则,文件创建失败,客户端会抛出一个\nIOException。DistributedFileSystem 返回一个 FSDataOutputStream 供客户端\n开始写入数据。与读取情况一样,FSDataOutputStream 包装一个\n nDFSOutputStream,处理与数据节点和名称节点的通信。\n当客户端写入数据(步骤 3)时,DFSOutputStream 将其拆分为数据包,并将其写入称为数据队列的内部队列。 ”
\n\n添加更多信息以回应这篇文章的评论:
\n\n这是一个将文件复制到 HDFS 的示例客户端程序(来源-Hadoop 权威指南)
\n\npublic class FileCopyWithProgress {\npublic static void main(String[] args) throws Exception {\n String localSrc = args[0];\n String dst = args[1];\n\n InputStream in = new BufferedInputStream(new FileInputStream(localSrc));\n\n Configuration conf = new Configuration();\n FileSystem fs = FileSystem.get(URI.create(dst), conf);\n OutputStream out = fs.create(new Path(dst), new Progressable() {\n public void progress() {\n System.out.print(".");\n }\n });\n\n IOUtils.copyBytes(in, out, 4096, true);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n}
\n\n如果您查看 FileSystem 类中的 create() 方法实现,它会将 getDefaultBlockSize() 作为其参数之一,该参数又从名称节点提供的配置中获取值。\n这就是客户端了解块的方式在 hadoop 集群上配置的大小。
\n\n希望这可以帮助
\n| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |