3

从以下几段文字——(http://developer.yahoo.com/hadoop/tutorial/module2.html),提到顺序可读的大文件不适合本地缓存。但我不明白这里的本地是什么意思......

我认为有两种假设:一种是Client缓存来自HDFS的数据,另一种是datanode将hdfs数据缓存在其本地文件系统或内存中以供Client快速访问。有没有人可以解释更多?非常感谢。


但是,虽然 HDFS 具有很强的可扩展性,但其高性能设计也将其限制在特定类别的应用程序中;它不像 NFS 那样通用。使用 HDFS 做出了大量额外的决定和权衡。尤其:

假设使用 HDFS 的应用程序从文件中执行长的顺序流式读取。HDFS 进行了优化以提供流式读取性能;这是以文件中任意位置的随机寻道时间为代价的。

数据会一次写入HDFS,然后多次读取;不支持在文件关闭后更新文件。(Hadoop 的扩展将支持将新数据附加到文件的末尾;它计划包含在 Hadoop 0.19 中,但尚不可用。)

由于文件的大小和读取的顺序性,系统不提供本地缓存数据的机制。缓存的开销足够大,数据应该简单地从 HDFS 源重新读取。

假设单个机器经常发生故障,无论是永久性的还是间歇性的。集群必须能够承受多台机器的完全故障,可能同时发生许多故障(例如,如果一个机架一起发生故障)。虽然性能可能会与丢失的机器数量成比例地下降,但整个系统不应变得过于缓慢,也不应丢失信息。数据复制
策略可以解决这个问题。


4

1 回答 1

4

任何真正的 Mapreduce 作业都可能会处理来自 HDFS 的 GB(10/100/1000 秒)数据。

因此,任何一个映射器实例很可能会以顺序方式处理大量数据(典型的块大小为 64/128/256 MB,具体取决于您的配置)(它将从一开始就完整读取文件/块结束。

在同一台机器上运行的另一个映射器实例也不太可能在不久的将来随时再次处理该数据块,因此多个映射器实例也将在任何一个 TaskTracker 中与该映射器一起处理数据(希望具有很少有人是“本地”到数据的实际物理位置,即数据块的副本也存在于映射器实例正在运行的同一台机器上)。

考虑到这一切,缓存从 HDFS 读取的数据可能不会给您带来太多好处——在查询另一个块之前,您很可能不会对该数据进行缓存命中,并最终将其替换到缓存中。

于 2012-04-11T10:28:19.453 回答