Hadoop小文件解决方案-Hadoop小文件的前因后果 - 个人文章 - SegmentFault 思否
拥有大量小文件会降低MapReduce处理的性能,无论是Hive,Pig,Cascading,Pentaho MapReduce还是Java MapReduce。第一个原因是大量的小文件意味着大量的随机磁盘IO。磁盘IO通常是MapReduce性能的最大限制因素之一。一次大的顺序读取总是胜过通过几次随机读取相同数量的数据。如果您可以将数据存储在更少,更大的块中,则可以减轻磁盘IO的性能影响。
性能下降的第二个原因有点复杂,需要了解MapReduce如何处理文件和调度资源。我将在此解释中使用MapReduce版本1术语,因为它比使用Yarn更容易解释,但相同的概念适用于Yarn。当MapReduce作业启动时,它会为每个正在处理的数据块计划一个映射任务。存储在Hadoop中的每个文件至少有一个块。如果您有10,000个文件,每个文件包含10 MB的数据,则MapReduce作业将安排10,000个map任务。通常配置Hadoop,以便每个map任务在其自己的JVM中运行。
您的Hadoop集群只有这么多资源。在MapReduce v1中,为避免节点过载,请指定节点可以处理的最大并发map数。通常,map的最大数量在5到20范围内。因此,要同时运行10,000个map,您必须拥有500到2000个节点。大多数Hadoop集群都小于此,导致JobTracker在等待打开的插槽时对map任务进行排队。如果您有一个包含总共100个插槽的20个节点群集,则您的队列将变得非常大,并且您的过程将花费很长时间。不要忘记,您的工作可能不是竞争集群资源的唯一工作。
如果您拥有800个128 MB的文件而不是10,000个10MB文件,那么您只需要800个map任务。这将需要一个数量级减少JVM维护时间,并将导致更好的磁盘IO。即使处理128 MB的单个map任务将花费比处理10 MB的map任务处理更长的时间,但是当处理800个更大的文件时,所有处理时间的总和几乎总是要快几个数量级。
Read full article from Hadoop小文件解决方案-Hadoop小文件的前因后果 - 个人文章 - SegmentFault 思否
No comments:
Post a Comment