虽然我已经理解了hadoop的体系结构,但是在理解数据的确切位置方面我有一些空白。
我的问题是“假设我有一些随机书籍的大量数据..是以前使用HDFS存储在多个节点中的书籍的数据,我们在每个节点上执行MapReduce并在我们的系统中得到结果?
'OR'
我们是否将数据存储在大型数据库中的某些位置,每当我们想要执行MapReduce操作时,我们会将这些块存储在多个节点中以执行操作?
答案 0 :(得分:2)
要么可能,这实际上取决于您的使用案例和需求。但是,通常Hadoop MapReduce会针对存储在HDFS中的数据运行。该系统是围绕数据位置设计的,该数据需要数据为HDFS。这就是Map任务在存储数据的同一块硬件上运行,以提高性能。
如果出于某种原因,如果你的数据必须存储在HDFS之外然后使用MapReduce进行处理,那么它可以完成但是工作量更大,并且不如在本地处理HDFS中的数据那么高效。
所以我们来看两个用例。从日志文件开始。日志文件不是特别容易访问的。它们只需要卡在某处并存储起来供以后分析。 HDFS非常适合这种情况。如果你真的需要一个日志退出,你可以得到它,但通常人们会寻找分析的输出。因此,将日志存储在HDFS中并正常处理。
但是,HDFS和Hadoop Map Reduce理想格式的数据(单个大型平面文件中的许多记录)并不是我认为高度可访问的。 Hadoop Map Reduce希望输入文件的大小为兆字节,每个文件有许多记录。你越是偏离这种情况,你的表现就会下降得越多。有时您的数据始终在线,而HDFS并不适合这种情况。例如,我们将使用您的书籍示例。如果这些书籍用于需要以在线方式访问的内容的应用程序,请参阅I.E.编辑和注释,您可以选择将它们存储在数据库中。然后,当您需要运行批量分析时,可以使用自定义InputFormat从数据库中检索记录并在MapReduce中处理它们。
我目前正在使用网络抓取工具执行此操作,该网页抓取工具将网页单独存储在Amazon S3中。网页太小,无法作为MapReduce的单一有效输入,因此我有一个自定义的InputFormat,可以为每个映射器提供多个文件。这个MapReduce作业的输出最终被写回S3,因为我使用的是Amazon EMR,Hadoop集群就会消失。