以下文字段落 - (http://developer.yahoo.com/hadoop/tutorial/module2.html),提到顺序可读的大文件不适合本地缓存。但我不明白这里的地方是什么意思......
我认为有两个假设:一个是Client缓存来自HDFS的数据,另一个是datanode缓存hdfs数据在其本地文件系统或Memory for Client中快速访问。有没有人可以解释更多?非常感谢。
虽然HDFS具有很高的可扩展性,但它的高性能设计也将其限制为一个 特殊类别的应用;它不像NFS那样通用。有一个很大的 使用HDFS做出的额外决定和权衡的数量。特别是:
假设使用HDFS的应用程序执行长连续流式读取 文件。 HDFS经过优化,可提供流式读取性能;这是以牺牲为代价的 随机搜索文件中任意位置的时间。
数据将被写入HDFS一次,然后多次读取;更新文件 他们已经关闭后不受支持。 (Hadoop的扩展将提供 支持将新数据附加到文件末尾;它计划包括在内 Hadoop 0.19但尚不可用。)
由于文件的大小和读取的顺序性,系统会这样做 不提供本地缓存数据的机制。缓存的开销很大 该数据应该只是从HDFS源重新读取。
假设个别机器经常失效,无论是永久性的还是永久性的
间歇。集群必须能够承受几个完全失败
机器,可能很多同时发生(例如,如果机架一起发生故障)。
虽然性能可能会与机器丢失的数量成比例地降低,但系统却是如此
整体不应该变得过慢,信息也不应该丢失。数据复制
战略打击这个问题。
答案 0 :(得分:3)
任何真正的Mapreduce作业都可能会处理来自HDFS的GB(10/100/1000s)数据。
因此,任何一个映射器实例最有可能在顺序性质上处理大量数据(典型的块大小为64/128/256 MB,具体取决于您的配置)(它将读取其中的文件/块)整个从头到尾。
在同一台机器上运行的另一个映射器实例也不太可能在不久的将来再次处理该数据块,更多的是,多个映射器实例也将在任何一个TaskTracker中与该映射器一起处理数据(希望有少数几个是“本地”实际物理位置的数据,即数据块的副本也存在于映射器实例正在运行的同一台机器上。
考虑到所有这一切,缓存从HDFS读取的数据可能不会带来太多收益 - 在查询另一个块之前,您很可能不会在该数据上获得缓存命中,并最终将其替换为缓存。