为什么HDFS是写一次读多次?

9
我是Hadoop的新学习者。
在阅读Apache HDFS相关的资料时,我了解到HDFS是一个只写文件系统。一些其他发行版(如Cloudera)提供追加功能。很不错能够了解这种设计决策背后的理由。依我之见,这种设计会给Hadoop带来很多限制,使其适用于一组有限的问题(类似于日志分析问题)。
专家们的评论将有助于我更好地理解HDFS。
4个回答

7
HDFS的设计有三个主要原因:
1. HDFS的设计是通过照搬Google的GFS而来,GFS旨在仅支持批处理计算。 2. HDFS最初并不打算用于除批处理之外的任何操作。 3. 设计一个真正的分布式文件系统,既可以支持高性能批量操作,又可以支持实时文件修改,这很困难,并且超出了HDFS初始实现者的预算和经验水平。
事实上,Hadoop本可以构建为完全读/写文件系统。MapR FS就是证明。但是,实现这样的功能远远超出了原始Hadoop项目的范围和能力,HDFS原始设计中的架构决策基本上排除了改变这种限制。关键因素是NameNode的存在,因为HDFS要求所有元数据操作(如文件创建、删除或文件长度扩展)都要通过NameNode进行往返传输。MapR FS通过完全消除NameNode并将元数据分布到整个集群中来避免这种情况。
随着与Hadoop相关的系统(如Spark和Flink)的工作负载越来越向操作型、接近实时或实时操作转移,没有真正的可变文件系统变得越来越令人恼火。对此问题的应对措施包括:
1. MapR FS。正如上面提到的...MapR实现了一个完全功能齐备、高性能的HDFS重新实现,包括POSIX功能以及noSQL表和流API。这个系统在一些最大的大数据系统中已经运行多年。 2. Kudu。Cloudera基本上放弃了在HDFS之上实现可行的变异,并宣布了Kudu,没有一般可用性的时间表。Kudu实现了类似表格的结构,而不是完全的通用可变文件。 3. Apache Nifi和商业版本的HDF。Hortonworks也基本上放弃了HDFS,并宣布他们的策略是将应用程序分为批处理(由HDFS支持)和流式处理(由HDF支持)存储。 4. Isilon。EMC作为其Isilon产品线的一部分实现了HDFS的传输协议。这使得Hadoop集群可以拥有两个存储存储区,一个是基于HDFS的大规模、高性能、成本效益的批处理存储区,另一个是通过Isilon进行中等规模可变文件访问的存储区。 5. 其他。有一些基本上废弃的努力来解决HDFS只能写入一次的问题。这些包括KFS(Kosmix文件系统)等。这些都没有被广泛采用。

7
HDFS遵循写一次,多次读取的方法来处理文件和应用程序。它假设在HDFS中写入的文件不会被修改,尽管可以访问无数次(虽然未来的Hadoop版本可能也支持此功能)!目前,在HDFS中严格只有一个写入者。这种假设使数据访问吞吐量高,并简化了数据一致性问题。网络爬虫或MapReduce应用程序最适合使用HDFS。
由于HDFS基于“写一次,多次读取”的原则,流式数据访问功能在HDFS中非常重要。由于HDFS更多地设计用于批处理而不是交互式用户使用,因此强调的是数据访问的高吞吐量,而不是低延迟的数据访问。HDFS的重点不在于存储数据,而在于如何以最快的速度检索数据,特别是在分析日志时。在HDFS中,读取完整数据比从数据中获取单个记录所需的时间更为重要。为了实现流式数据访问,HDFS忽略了一些POSIX要求。

http://www.edureka.co/blog/introduction-to-apache-hadoop-hdfs/


3
这种技术的优势在于您不必担心同步问题。由于只需写入一次,读者可以确保在阅读时数据不会被篡改。

1
尽管这种设计决策确实会带来一些限制,但 HDFS 构建时考虑了高效的流式数据访问。 引用自《Hadoop权威指南》: “HDFS 的构建基于这样一个思想:最高效的数据处理模式是一种写一次,多次读取的模式。通常情况下,数据集会从源生成或复制,然后随着时间的推移对该数据集进行各种分析。每个分析将涉及大部分,如果不是全部数据集,因此读取整个数据集的时间比读取第一条记录的延迟更重要。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接