HDFS为获得可扩展性和高性能而进行的的设计也是有代价的。 HDFS只适用于特定类型的应用— — 它不是通用的分布式文件系统。大量额外的决策和取舍主导了HDFS的架构和实现, 它们包括以下方面:
? HDFS 针对高速流式读取性能做了优化, 随之而来的代价是降低了随机查找性能。这意味着, 如果应用程序需要从 HDFS 读取数据, 那么应该避免查找, 或者至少最小化查找的次数。 顺序读取是访问 HDFS 文件的首选方式。
? HDFS 仅支持一组有限的文件操作— — 写入、 删除、 追加和读取, 不支持更新。 它假定数据一次性写入 HDFS, 然后多次读取。
? HDFS 不提供本地数据缓存机制。 缓存的开销非常大, 以至于应该单纯地从源文件重新读取数据, 而这对于通常顺序读取大数据文件的应用程序来说并不是个问题。
HDFS 被实现为一种块结构的文件系统。 如图 2-1 所示, 单个文件被拆分成固定大小的块, 而这些块保存在 Hadoop 集群上。 一个文件可以由多个块组成, 这些块存储在不同的 DataNode(集群中的单独一台机器)上; 对于每个块来说, 保存在哪个 DataNode 上是随机选取的。 其结果是, 访问某个文件通常需要访问多个 DataNode, 这意味着 HDFS 支持的文件大小远远超过单机的磁盘容量。