为什么 HDFS 不适合需要低延迟的应用程序?

Why HDFS not preferred with applications that require low latency?

我是 Hadoop 和 HDFS 的新手,这让我很困惑为什么 HDFS 不适合需要低延迟的应用程序。在大数据场景中,我们会将数据分布在不同的社区硬件上,因此访问数据应该更快。

Hadoop 完全是一个批处理系统,旨在存储和分析结构化、非结构化和半结构化数据。

Hadoop的map/reduce框架相对较慢,因为它是为支持不同格式、结构和海量数据而设计的。

我们不应该说 HDFS 更慢,因为 HBase 没有-sql 数据库和基于 MPP 的数据源,例如 Impala,Hawq 位于 HDFS 上.这些数据源运行速度更快,因为它们不遵循 mapreduce 执行进行数据检索和处理。

缓慢的发生只是因为基于 map/reduce 的执行的性质,它会产生大量中间数据,节点之间交换大量数据,从而导致巨大的磁盘 IO 延迟。此外,它必须在磁盘中保留大量数据以实现阶段之间的同步,以便它可以支持作业从故障中恢复。 mapreduce 也没有办法在内存中缓存数据的all/subset。

Apache Spark 是另一个批处理系统,但它比 Hadoop mapreduce 相对更快,因为它通过 RDD 将大部分输入数据缓存在内存中,并将中间数据保存在内存中本身,最终在完成时或需要时将数据写入磁盘。

还有一个事实是,作为文件系统,HDFS 针对大块数据进行了优化。例如,单个块通常为 64-128 MB,而不是更常见的 0.5 - 4 KB。因此,即使是小操作,读取或写入磁盘也会有明显的延迟。再加上它的分布式特性,与传统文件系统相比,您会看到显着的开销(间接、同步、复制等)。

这是从 HDFS 的角度来看的,我认为这是您的主要问题。 Hadoop 作为数据处理框架有其自身的一系列权衡和低效(在@hserus 的回答中有更好的解释),但它们基本上针对相同的利基市场:可靠的批量处理。

低延迟或实时应用程序通常需要特定数据。他们需要快速提供最终用户或应用程序正在等待的少量数据。

HDFS 是通过在提供容错和高可用性的分布式环境中存储大数据而设计的。只有 Namenode 知道数据的实际位置。它几乎随机地将数据存储在任何 Datanode 上。它再次将数据文件拆分为固定大小的较小块。由于网络延迟和数据的分发以及特定数据的过滤,因此数据可以快速传输到实时应用程序。它对 运行 MapReduce 或数据密集型作业有帮助,因为可执行程序被传输到本地保存数据的机器(数据局部性原则)。