论文部分内容阅读
近年来,大数据以数据量大、数据类型多样、产生与处理速度要求快、价值高的4V特性成为工业界和学术界的研究热点。由于传统软件系统难以在可接受的时间范围内处理大数据,工业界和学术界设计了具有高扩展性的分布式数据并行处理框架,如MapReduce,Apache Hadoop,Apache Spark等。目前,这些框架被广泛应用于数据密集型应用的开发和执行,如Web索引的建立、日志挖掘、机器学习、大规模图分析等。 分布式数据并行框架为用户提供了简单的编程模型,并能自动完成数据的并行与分布处理。这种设计方式可以让用户更关注于数据处理逻辑本身,而无需了解应用的物理执行过程。然而,如果应用在运行时出现性能问题或者运行时错误,用户难以诊断出问题原因,更难以修复错误。由于应用需要在内存中处理大量数据,内存溢出错误成为分布式数据并行应用中一种常见的运行时错误,而且该错误不能被框架的错误容忍机制修复。除了内存溢出问题,用户在正常使用框架时也面临不了解应用内存消耗,不知道该为应用配置多大内存空间的问题。 本文旨在分析和解决分布式数据并行应用中的两个内存使用问题:(1)如何分析并估算应用的内存使用量?(2)如何理解、诊断与修复应用内存溢出错误?针对这两个研究问题,本文从以下三个方面开展了研究: (1)内存溢出错误的实证分析:研究目的是分析应用内存溢出错误的常见原因,常见修复方法,并探索可以提高框架错误容忍能力的方案。我们研究了123个真实Hadoop和Spark应用的内存溢出错误,发现了内存溢出错误的三大原因:框架暂存的数据量过大,数据流异常以及内存使用密集的用户代码。我们也从42个包含修复信息的错误中总结出了常用的修复方法。另外,我们也提出了可以提升框架错误容忍能力和错误诊断能力的三种方法。 (2)内存用量模型构建与用量估算:研究目的是构建应用的内存用量模型,量化应用的静态因素(数据、配置、用户代码)与动态内存用量的关系,并估算出新应用的内存用量。我们以数据流为中心构建了应用内存用量模型,模型包含数据流模型、框架内存用量模型和用户代码内存用量模型。为了解决如何在用户代码未知的情况下构建用户代码内存用量与其输入数据之间关系的问题,我们在用户代码模型中设计了生命周期敏感的内存用量监控方法。在内存用量模型的基础上,我们通过在小数据上运行应用来估算该应用在大数据集上的内存用量。 (3)内存溢出错误的诊断方法:研究目的是设计出内存溢出错误诊断方法及工具。本文基于内存用量模型设计了一个内存分析器Mprof。Mprof可以自动建立应用静态因素与动态内存用量之间的关系,方法是重建应用数据流,重建用户代码内存使用历史信息,并对两者进行关联分析。Mprof也包含定量诊断规则,这些规则根据应用静态因素与动态内存用量之间的关系自底向上定位内存溢出错误相关的代码段,错误相关的数据,以及不恰当的配置参数。 本文的研究成果对于分布式数据并行框架用户和框架设计者均有实际参考意义,也对后续研究工作(比如研究其他框架或应用的内存溢出问题)有借鉴意义。