马立平,张海燕
(1.西南科技大学计算机科学与技术学院,四川 绵阳 621010;2.武汉三江航天远方科技有限公司)
计算机体系结构实验课程是面向计算机科学与技术、电子信息类、自动化类专业的一门专业基础课,学生通过实验,能较好地理解并掌握目前先进的计算机体系结构,提升对软硬件设计的系统认识,为进一步设计具有实用价值的计算机系统打下良好的基础。实验项目在提高学生分析、设计和开发计算机领域复杂工程问题的能力上发挥着重要作用[1]。传统基于模拟仿真软件和基于FPGA 的计算机体系结构课程实验系统没有涉及机群系统的实验,并不能满足实际工程中分析、设计和开发具有机群系统需求。近年来,随着大数据技术的快速发展,尤其是海量复杂数据分析和应用,计算机体系结构正从“数据紧跟处理器”转向“处理器围着数据转”,多处理机系统的设计从多核发展到了众核,万兆级的以太网络逐渐成熟,新型存储设备层出不穷,并伴有功能日益强大的大数据处理软件(如Hadoop)和日益丰富的软件开发语言,使这一问题可以得到基本解决。在大数据时代背景下,针对计算机体系结构课程教学也提出了挑战,主要表现为:应完善现有课程教学内容,增加计算机系统结构和应用的最新成果,并加大开发课程相关内容的创新性、设计型和应用型实验项目,这也是“新工科”背景下探索计算机体系结构实验课程教学改革的必然趋势[2]。
Hadoop 是一种采用分布式并行的大数据处理平台,后台通过Hadoop 分布式文件系统HDFS 将大型文件划分成多个片段,并分布存储于多台计算节点中[3],并且具有可靠性高和部署成本低的优点,是可以运行在一般计算机机群上的开源系统,支持相对较高吞吐量的大数据访问,因此常用作处理大数据集。
传统的计算机体系结构课程实验,例如流水线冲突与性能分析、指令调度、缓存性能分析、多Cache 一致性、处理器的FPGA 实现等较单一,也没有涉及机群系统内容,对于学生设计、开发计算机系统能力的提升有限。因此,迫切需要开发一个综合实验项目,以培养学生解决计算机领域复杂工程问题的能力,符合实际工程的需要。有目共睹,现代社会离不开大数据,大数据处理技术也得到了研究发展,并助推经济发展、提升政府服务、完善社会治理等各个领域[4]。本文以大数据处理为切入点,开发设计了一个基于Hadoop的机群系统综合性实验项目,为计算机体系结构课程实验改革提供了新思路。
传统的计算机体系结构验证性实验课程旨在使学生熟悉计算机体系结构的基本原理和处理器设计流程和方法,学生在指导老师的指引下完成输入、调试、仿真,或者进行CPU 设计输入、仿真、下载和硬件调试等过程。这种方式在教学内容和方法上虽然缺乏一定的创新型,但对于大部分专业学生来说是可以满足他们需求的,这也是验证性实验的优势所在。
本文在设计开发基于机群系统的大数据技术处理综合性实验项目时,将借鉴验证性实验课程的优势,并充分考虑大数据处理技术模块可移植的特点,设计为“验证性实验+创新性实验”两大部分,从而构建“计算机体系结构基础→提高→创新”和“计算思维—工程思维—创新思维”的递进式、多层次实践教学体系[5]。
具体而言,本文所开发设计的综合性实验项目,把基于Hadoop的机群环境搭建、MapReduce各个执行阶段、Shuffle 过程的工作原理、HDFS 的分布式存储和工作原理、以及编写实现基于机群系统的MapReduce和HDFS 应用实例功能模块等,作为本次所开发综合性实验项目的验证性实验内容;把对大数据的处理技术,例如实现具有局部迭代大数据处理算法、增量式分区负载均衡策略等功能模块的编写,作为本次所开发综合性实验项目的创新性(提高)实验内容。通过这种具有工程应用、创新性及可展示实验结果,增加学生学习的成就感,更进一步增强学生的学习兴趣,提高学生动手能力,培养学生创新思维能力和工程思维能力,真正实现课程目标达成的目的。
基于Hadoop 的机群系统大数据处理综合性实验项目整体框架如图1所示。
图1 基于Hadoop的机群系统综合性实验项目整体框架图
验证性实验内容分为三大模块:机群系统部署模块、HDFS 编程实践模块、MapReduce 分布式计算模块。这部分的功能模块实验资源比较丰富,技术较成熟,但是后续创新性实验内容的基础,学生在进行实验时可参考或移植已有的资源或技术进行编程实现,对机群系统的部署、HDFS 分布式存储和MapReduce 分布式计算进行基本验证。这种验证过程旨在加深学生对设计机群系统的流程和技术方法的识记和深入理解。创新性实验内容主要是指大数据处理模块,可根据实验或工程需要选择不同的大数据处理技术以及软件的体系结构,本文以实现具有局部迭代大数据处理算法和增量式分区负载均衡策略为例加以介绍,通过分析MapReduce 并行处理体系结构,并对其体系结构进行创新性优化调整以适应不同业务类型的大数据存储以及处理要求。这种创新过程旨在提高学生的工程应用和创新能力,也能够拓展学生计算机体系结构的知识面。
3.1.1 Hadoop机群部署模块
本实验采用六个节点的小规模Hadoop 机群。Hadoop 机群的节点类型主要有负责协调机群中数据存储的NameNode 节点、存储被拆分数据块的DataNode节点、协调数据计算任务的JobTracker节点、负责执行由JobTracker 节点指派任务的TaskTracker节点、帮助NameNode 节点收集文件系统运行状态信息的SecondaryNameNode 节点等共五类[6],每类节点采用普通个人计算机,有些节点可处于同一台计算机,其计算机的配置均为8核CPU、2.1GHz主频、16GB内存和1TB 硬盘容量,采用千兆以太网互联。Hadoop机群部署模块除了硬件配置之外,还需要安装并运行Ubuntu、JDK 和Hadoop 软件,在安装和配置时可以直接参照Hadoop 的安装应用指南,并对Hadoop 的体系结构、工作机制及简单的操作命令等也需要了解[6]。怎么样判断一个Hadoop机群是否已经正确安装,还需要运行基准测试程序。Hadoop 软件有一些自带的基准测试程序,其中用来测试HDFS 的IO 性能可用TestDFSIO 基准测试程序,用来测试MapReduce 性能的可用Wordcount测试程序,基准测试程序操作简单,无需过多了解。测试程序运行正确,说明整个Hadoop机群部署正确,可以进行后续的实验。
3.1.2 HDFS编程实践模块
本实验需使用HDFS 分布式存储模块,这些模块具有高可用性、高容错性等优点,可以将源数据集分布式存储在HDFS分布式文件系统中[6,7]。实验主要通过HDFS 编程实践模块实现文件的过滤与合并,实验除了上述在3.1.1节中安装部署的软硬件之外,还需要在Ubuntu 系统中安装Eclipse 开发工具来完成实验。实验内容是假设在HDFS 文件系统中分布存放testfile1.txt、testfile2.txt、testfile3.txt、testfile4.txt、testfile5.xyz、testfile6.xyz等几个文件,先过滤出所有的后缀名不为“.xyz”的文件,然后对过滤后的这些文件进行读取并合,生成一个新文件,最后将新文件保存到HDFS文件系统。
完成实验过程为:在Eclipse 中创建项目→为项目添加需要用到的JAR 包→编写一个Java 应用程序用来实现过滤和合并任务→在确保Hadoop已经启动,并且上面提到的六个文件已经编辑完成并存入HDFS 系统后,开始编译运行程序→在Eclipse 中实现应用程序的部署→实验完成。实验完成后,可以通过“可视化”模块提供的功能查看实验结果,其中“可视化”模块功能的完成可以是HDFS 命令、浏览器和专用的可视化工具。
3.1.3 MapReduce分布式计算模块
MapReduce分布式计算模块主要让学生理解分布式并行编程,怎么样让分布式程序运行在机群系统并完成大规模并行处理任务。模块使用一种并行编程模型MapReduce 来实现并行运算,MapReduce 模型使分布式编程工作得到极大地方便,它将运行于大规模机群上的复杂的并行计算过程高度抽象为两个函数:Map 和Reduce,它将一个存储在分布式文件系统中的数据集切分成独立的分片(split)交予多个Map任务并行处理,编程人员在不熟悉分布式并行编程情景下也能将自己编写的程序运行在分布式系统上[6,8]。
本实验的内容是统计给定两个用英文撰写的文本文件中各个英语单词的个数。实验按照上述3.1.2节中安装部署的软硬件及编程工具。假设在HDFS 文件系统中分布存放testfile1.txt、testfile2.txt 两个文件,实验前先编写Map 函数处理逻辑和Reduce 函数处理逻辑,其两个函数的处理逻辑可参考可得成就资源[6]。
完成实验过程为:在Eclipse 中创建项目→为项目添加需要用到的JAR 包→利用已准备好的Map 处理逻辑和Reduce 处理逻辑编写一个Java 应用程序用来统计两个文件中各个英语单词的个数→在确保Hadoop已经启动,并且上面提到的两个文件已经编辑完成并存入HDFS 系统后,开始编译运行程序→在Eclipse 中编译并打包代码→实验完成。实验完成后,可以通过“可视化”模块提供的功能查看实验结果,其中“可视化”模块功能和3.1.2节中相同。由于MapReduce分布式计算比较复杂,熟练运用它并不一时之事,在实验教学过程中,此模块可以参考可得的成熟资源,要求学生通过利用现有资源能够熟练应用较为合理。
3.2.1 具有局部迭代性的大数据处理算法
MapReduce分布式计算模型在处理具有数据局部性特征的高维数据和图数据时,需要进行多次迭代计算,这会导致MapReduce 分布式计算模型中大量数据迁移,从而增加数据节点之间的网络通信使系统性能下降。为了使得MapReduce 分布式计算模型能够更好地支持这类数据的数据挖掘功能,本实验通过合理的方式利用数据内部本身所具有的紧密连续性,将原数据合理划分成相关联的不同子图,之后将其作为Map 映射函数的计算处理单位,使得本地Map 函数能完成大部分本地各个子图的计算,再由Reduce归约函数协调和各个子图之间的全局计算[9]。
完成实验过程为:按照上述3.1.2节中安装部署的软硬件、编程工具和HBase 数据库→在Eclipse 中创建项目→为项目添加需要用到的JAR 包→将PageRank算法应用于具有局部迭代性的MapReduce 分布式计算模型,使所有内部节点在Map 函数内完成迭代计算,剩余的外部节点在Reduce 函数内完成计算,编写相应的Map 处理逻辑和Reduce 处理逻辑,并编写Java应用程序用于完成对给定图数据集或高维数据集进行计算→在确保Hadoop已经启动,并且HBase数据库已启动,开始编译运行程序→实验完成。实验完成后,可以再将PageRank 算法应用于传统的Hadoop 平台,并利用相同的数据集和硬件平台进行实验,对比两次实验的结果,分析其性能优劣。由于MapReduce 分布式计算比较复杂,在实验教学过程中,此模块可参考一些成熟资源,要求学生利用现有资源实现一个新的基于并行处理框架的大数据处理系统。
3.2.2 基于增量式分区负载均衡策略
MapReduce分布式计算模型在对数据进行划分时采用的是一次分区机制,就是仅对每个元组进行一次并统一时间的划分方式,同时,还要严格按照Reducer与分区1 对1 的方式进行元组分配,当处理密集数据时,导致Reduce端常会出现数据倾斜的问题。要解决这种数据划分的不均衡,有多种方法[10,11],本实验采用基于增量式分区负载均衡策略[10]。
首先,在Map 段产生比Reducer 个数多的细粒度分区,并在Mapper运行时,由Counter功能模块统计各细粒度分区的数据量,将统计结果汇总并写入本地Buffer 中,通过Hadoop 的心跳机制,将各Mapper 统计汇总信息发送给Master 节点,Master 节点就能获取全局的分区分布信息。其次,Master 节点再根据获取到的全局的分区分布信息,由JobTracker 筛选出一部分还未分配的细粒度分区分配到Reducer端。当“第一次分配”时,要先筛选出最合适的分区分配到Reducer端,“第一次分配”完成后,经过一定的时间间隔,第二次分区分配被触发,由于第一次分配后可能已经出现了数据倾斜现象,因此第二次分区分配应考虑被“第一次分配”已分配分区的情况,此时,利用已准备好的代价评估模型分析当前系统的数据均衡程度并进行调整,对本次筛选出的细粒度分区分配到各Reducer上并,使本次分配后实现整体数据的均衡性。按此方法,每经过一定时间间隔后,再按照这种先筛选、再分配的方式进行多个轮回。最后,所有细粒度分区在执行Reduce 函数前都被分配到了Reduce 端,从而使各个Reducer 接收数据总量达到均衡。模型实现过程如图2所示。
图2 增量式分区负载均衡MapReduce分布式计算模型
本实验的内容是在原生Hadoop 系统实现增量式分区负载均衡策略,具体实现的技术细节如下。①在原架构基础上增加三个功能模块,即负责统计结果收集的Counter 模块、分配微分区的Decisions Model 模块、负责多微分区合并为细粒度分区的Add NewPartition 模块,并且Counter 模块在原系统的MapTask 类中实现、Decisions Model 模块在原系统的JobTracker 类中实现、Add NewPartition 模块在原系统的Reduce Task 类中实现。同时增加Assign Plan 和Counter Table 两类结构体,用于分区分配向量和分区统计向量的实现。②将Counter 模块添加至各Mapper的运行线程中,将微分区的统计结果以一维数组的形式放到Local Counter Table 中并驻留内存,同时通过将Local Counter Table 加入至Heartbeat 中来减少JobTracker 和Task 之间的通信开销。③在JobTracker类中添加了负责微分区筛选和分配的Decisions Model模块,用于实现增量式分区分配过程,所有Task的Local Counter Table 的汇总由Global Counter Table 负责,并将分配计划添加至Global Assign Plan,在每次决策完成后将更新的Global Assign Plan 增加至下次的Heartbeat通信。④Reduce Task解析Heartbeat,获得属于自身的分区信息,Reduce Task 类中的Add NewPartition 模块渐进地将分区信息增加至Local Partition,然后将分区信息再转换成分区的存储路径并存放至MapOutput Location。Add NewPartition 模块能够完成Reducer 初始化时的多分区分配,也能够实现在Reducer 读数据时的增量式分配,从而实现渐进式分配过程。⑤在整个作业输入完成后,Reduce()函数开始执行,将执行结果写入HDFS。
为验证在原生Hadoop 系统实现增量式分区负载均衡策略的有效性,可通过经典的WordCount 算法应用于原生Hadoop 系统和此系统,完成实验过程与3.2.1类似。
本文充分利用Hadoop 分布式系统能够进行分布式高速处理大数据这一优势,设计了机群系统教学综合性实验项目。该实验项目由验证性实验和创新性实验两部分组成,兼顾学生对于计算机体系结构的基础掌握和能力提升。该实验项目可以更好地让学生从理论和实践上掌握机群系统设计及实现过程,可以让学生在实验中获得完整的工程应用性项目设计的理念、流程及方法,增强学生的学习兴趣和创新思维能力,既符合计算机体系结构实验课程培养目标,也符合“新工科”工程教育理念。
具有并行处理和分布式计算体系结构的大数据系统(Hadoop、MapReduce 等)是进行教学研究和工程训练较为理想平台[6],将其应用于《计算机体系结构》课程的并行和分布式处理系统实验教学,从而科学合理的设计、组建实验项目,通过编程影响实验结果,学生可以发挥自己的想象,实现实验的创新性目标,使其达到最佳效果。同时,激发学生学习兴趣,锻炼其解决实际工程问题的能力,这也是“新工科”背景下高校教学改革的一个重要方面。