hadoop - HDFS - 一个大文件或几个块大小的小文件
问题描述
所以我在理解应该以哪种方式存储大文件时遇到了一些问题。例如,我的 HDFS 中的块大小是 128MB,而我有一个 1GB 的文件。
我知道保存小于块大小的文件不是最佳做法,我理解为什么。
但是我应该如何处理大文件,对于我的 1GB 文件,我应该保存 1 个文件还是 8 个文件,每个文件 128MB,为什么?
解决方案
您可以使用 1GB 存储 1 个文件。Hadoop 会自动将该文件存储在 8 个块中。Hadoop 是为更大的文件而不是更小的文件设计的。请注意,Block 是 hadoop 中的物理存储。
由于您没有提到集群中的拆分大小,所以我假设它是 128 MB。拆分是您并行性所依赖的东西。因此,如果您在 128 个拆分大小上处理 1 GB 文件,将调用 8 个映射器(每个拆分 1 个映射器)。如果您存储 8 个文件,每个文件 128 mb。您的 Namenode 将有不必要的开销来维护有关这 8 个文件的信息。在 8 个文件的情况下,与 1 GB 文件相比,性能可能或多或少相似,但在 1 GB 文件有 8 个块的情况下肯定会更好。
不要与 hadoop 中的块混淆,它们只是像其他文件系统一样的存储单元。无论文件有多大,Hadoop 都会自动处理存储,并将文件分成块。在 i/o 操作中存储小文件将是不必要的。
推荐阅读
- numeric - 求解后如何更改 ODE 的数值解?
- typescript - 我可以将类型限制为接口的值吗?
- flutter - 将设备模型放置在文本小部件中
- javascript - 如何将 json 数据从我的 jsp 页面发送到 spring rest 控制器
- python - 使用 matplotlib 的直方图
- image - 如何从文件字符串中分辨出什么样的文件
- python - 计算嵌套列表中重复项的出现次数
- node.js - 为什么我的命令没有输出到 NodeJS 的典型标准输出?
- javascript - 如何使用 Cognito 和 AWS Amplify 在社交登录中获取和传递 deviceKey?
- javascript - ReferenceError: t is not defined - 不存在 JS 错误