APP下载

基于微操作的Hadoop参数自动调优方法

2019-08-27李耘书滕飞李天瑞

计算机应用 2019年6期
关键词:重构

李耘书 滕飞 李天瑞

摘 要:Hadoop作为大规模分布式数据处理框架已经在工业界得到广泛的应用,针对手动和经验调优方法中参数空间庞大和运行流程复杂的问题,提出了一种Hadoop参数自动优化的方法和分析框架。首先,对作业运行流程进行解耦,从可变参数直接影响的更细粒度的角度定义微操作,从而分析参数和单次微操作执行时间的关系;然后,利用微操作对作业运行流程进行重构,建立参数和作业运行时间关系的模型;最后,在此模型上应用各类搜索优化算法高效快速得出优化后的系统参数。在terasort和wordcount两个作业类型上进行了实验,实验结果表明,相对于默认参数情况,该方法使作业执行时间分别缩短了至少41%和30%。该方法能够有效提高Hadoop作业执行效率,缩短作业执行时间。

关键词:Hadoop;参数调优;微操作;重构;搜索算法

中图分类号: TP311.13

文献标志码:A

Abstract: As a large-scale distributed data processing framework, Hadoop has been widely used in industry during the past few years. Currently manual parameter optimization and experience-based parameter optimization are ineffective due to complex running process and large parameter space. In order to solve this problem, a method and an analytical framework for Hadoop parameter auto-optimization were proposed. Firstly, the operation process of a job was broken down into several microoperations and the microoperations were determined from the angle of finer granularity directly affected by variable parameters, so that the relationship between parameters and the execution time of a single microoperation was able to be analyzed. Then, by reconstructing the job operation process based on microoperations, a model of the relationship between parameters and the execution time of whole job was established. Finally, various searching optimization algorithms were applied on this model to efficiently and quickly obtain the optimized system parameters. Experiments were conducted with two types of jobs, terasort and wordcount. The experimental results show that, compared with the default parameters condition, the proposed method reduce the job execution time by at least 41% and 30% respectively. The proposed method can effectively improve the job execution efficiency of Hadoop and shorten the job execution time.

Key words: Hadoop; parameter optimization; microoperation; reconstitution; search algorithm

0 引言

Google在早年提出了最原始的用于大規模数据并行处理的分布式架构模型MapReduce[1-2],在帮助企业解决大数据处理效率的问题上迈出了很大的一步。随着处理数据的规模越来越大,提升优化Hadoop的性能和数据处理的时效性成为研究重点。Hadoop系统拥有200多个可配置参数,虽然默认参数配置经过精心设计,但是由于多种多样的任务类型使得大多数情况的任务执行效率并不高。Hadoop中对性能有影响的参数繁多,虽然Hadoop2.0对少量参数进行了修改和删除,但面对复杂的作业类型,依靠人工对Hadoop系统进行调优依然是一个充满挑战的任务[3-4]。

本文提出一种基于微操作重构的Hadoop参数自动调优方法,该方法通过建立比阶段更细粒度的微操作模型来刻画参数变化和单次微操作执行时间的关系,再基于运行原理对微操作模型进行组合得到阶段(phase)执行时间和参数的关系,在此基础上可以应用不同算法搜索找出优化参数。综上所述,本文的主要工作如下:

1)提出了微操作模型的概念。该模型能够直观准确地描述系统参数变化对执行时间带来的影响,从数据流的角度使得对多参数同时变化时作业执行时间变化的分析变得方便且准确,同时建立了单次微操作执行时间与配置参数之间的函数关系。

2)提出了微操作模型求解方法,通过基准测试运行简单的实际作业来建模求解模型参数,得到微操作模型。

3)提出了一种利用微操作对运行过程进行解构重构的策略。该方法不随作业类型和集群配置变化而变化,同时查找最优参数具有耗时短、效率高、可移植性好的优点。该方法可视为一种优化问题的描述方法和分析框架,从更细粒度的角度刻画参数变化原理,建立模型寻找最优参数组合。

1 相关工作

近年来,关于Hadoop参数自动调优的研究吸引了众多研究者的参与。基于成本分析的(cost-based)方法通过预测未知任务各类资源的利用情况,最大化资源利用率使得作业运行时间更短。文献[5]利用动态作业分析来捕获Map阶段和Reduce阶段的运行行为帮助用户微调Hadoop作业参数;文献[6]通过改变MapReduce的执行策略来提高shuffling和sorting操作的执行效率来提升整个MapReduce过程的性能。cost-based性能建模是一种较成熟的方法,但是它是一种白盒建模方法,需要研究者对非常复杂的系统内部组件有很好的了解,包括软件系统和硬件系统,这一点给用户带来了巨大挑战。基于机器学习(Machine Learning-based, ML-based)的性能建模是一种基于机器学习的调优模型 [7-13]。文献[7]主要应用各类回归算法来分析建模;文献[9]通过神经网络来预测作业时间再进行调优。ML-based方法在庞大的参数空间内收集训练样本,选择机器学习模型用于训练自动调优,在给定任务类型的情况下自动给出最优参数集。它是一个黑盒模型,建立在对特定任务类型和系统实际性能表现的观察基础上,不需要详细的系统内部信息;但它在收集训练数据非常困难,需耗费大量时间,实际应用效率并不高。基于搜索(Search-based)调优模型是一种利用搜索算法的自动调优模型[14-16]。Search-based调优模型将所有会影响Hadoop性能的关键参数构成一个参数空间,利用搜索算法如文献[14]采用遗传算法、文献[16]采用递归随机抽样,通过在实际集群中迭代执行作业任务,在参数空间中自动迭代搜索优化的参数组合。该方法和ML-based方法相比,不用构造完整参数空间的训练样本,在获取样本的时间上会有所减少。但是,針对不同的任务类型,参数的影响方式不同,搜索策略也会随之改变;同时,在收集样本时需要执行大量的实际作业,优化过程耗费时间长也是其主要缺点。

2 建模策略

本章主要介绍微操作模型的相关概念和微操作模型的建立方法。

2.1 MapReduce运行原理

一个MapReduce Job可以分为Map stage 和 Reduce stage两个主要过程,一个stage由多个task组成,例如map task和reduce task,而一个task可以分为多个按顺序执行的phase。如图1所示,对MapReduce任务按照运行流程进行解构。MapReduce任务可以分为两个主要过程:

1)Map stage。Map stage中多轮map task组依次执行,每轮中多个map task并行处理数据,map task运行过程分为三个阶段:read phase,map phase和collection phase。其中参数对性能有较大影响的是collection phase,其余两个阶段中参数对性能的影响并不明显,所以本文方法在map task中主要对collection phase进行分析,得到参数和collection phase运行时间的关系。

2)Reduce stage。Reduce stage中同样存在多轮reduce task,每轮多个reduce task组并行处理数据,每个reduce task从多个map输出中获取所需数据,最终将处理结果输出磁盘。reduce task的运行过程分为三个阶段:shuffle phase,reduce phase和sort_write phase。其中参数对性能由较大影响的是shuffle phase,所以本文方法在reduce task中只对shuffle phase从微操作的角度进行分析,得到参数和shuffle phase运行时间的关系。在sort_write phase中,虽然没有参数对其性能有直接影响,但是shuffle phase中的某些参数对sort_write phase的性能有间接的影响,所以后面章节也会对sort_write phase阶段进行分析介绍。

在众多参数中,关于决定map task并行个数的参数map.cpu.vcores和map.memory.mb、决定map task输入数据块大小的参数dfs.blocksize、决定reduce task并行个数的参数reduce.cpu.vcores和reduce.memory.mb,以及决定reduce task个数的参数mapred.reduce.task等参数的经验调优已有大量研究 [4],本文的调优目标主要针对那些依靠经验调优较具挑战的参数。map task输入数据块的大小一般视实际作业执行需求和并行个数而定,通常为128MB和256MB。map task并行个数参数通常和输入数据块大小配合设置,小数据量作业时所有数据在一轮处理完,数据量较大时根据实际内存在每一轮中分配尽量多的并行map task个数使得性能最大化。reduce task并行个数通常设置为使得性能最大化的个数,根据实际内存分配尽量多的并行个数,所有reduce task尽量在一轮中处理完。在某些业务中,这些参数的值根据业务需求已经确定,不属于可变参数,所以本文主要针对map task和reduce task个数都确定的情况进行调优,对如表1所示的本文涉及的参数空间内的参数进行调节。

2.2 微操作定义

一个map task分为三个阶段:read phase、map phase和collection phase。其中参数对性能有较大影响的是collection phase,在该阶段中,定义两种类型的微操作:

1)将输入数据写入到内存,内存大小由参数io.sort.mb决定,定义内存写微操作cm_mic_op。

2)当内存数据写入量到达阈值时触发磁盘写操作,将内存中所有数据写入磁盘,阈值由参数sort.spill.percent决定,定义磁盘写微操作cd_mic_op。

微操作的意义在通过参数可以定量分析某次微操作处理的数据量,从而得到微操作时间。

同样,一个reduce task分为三个阶段:shuffle phase、reduce phase和sort_write phase。其中参数对性能有较大影响的是shuffle phase,在该阶段中定义三种类型的微操作:

1)从map端拉取输入数据存入内存,内存空间大小由参数reduce.java.opts和参数shuffle.input.buffer.percent决定,定义单次内存写操作为微操作sm_mic_op。

2)当内存写达到阈值时,将内存中的数据按照阈值大小写入磁盘存为本地文件。阈值由参数shuffle.merge.percent决定,定义单次磁盘写微操作sd_mic_op。

3)当写入磁盘的本地文件个数到达阈值时,在磁盘中进行文件合并,将阈值个数的文件合并为一个大文件,阈值由io.sort.factor决定,定义单次merge操作为磁盘合并微操作merge_mic_op。

参数对shuffle phase阶段性能的影响直接体现在这三种类型的微操作中,通过分析参数变化对微操作处理数据量的影响,可以得到参数变化对阶段运行时间所造成的影响。

本节在参数对性能有较大影响的阶段中定义了几种微操作方式,在其余阶段,参数对其性能影响较小,本文不予讨论,仅通过优化上述阶段中的参数即可达到优化整个作业的目的。

2.3 微操作基准测试

在2.2节中定义了几种不同阶段的微操作,在本节将介绍如何建立微操作模型,得到微操作执行时间与参数的关系。

Hadoop中参数影响性能的本质在于,参数值不同时单次微操作处理的数据量不同,而内存写和磁盘写微操作在处理不同大小的数据时速率不同,同时总数据量一定时微操作执行的总次数会因为单次微操作处理的数据量不同而变化,所以参数通过影响内存写和磁盘写微操作的总执行次数和单次微操作速率影响作业总执行时间。通过确定单次微操作在不同参数值下处理数据的速率,再完成所有数据处理流程得到微操作执行次数,即可得到阶段总时间。接下来介绍如何建立微操作速率模型。

与Map task的collection phase中两种微操作相关的系统参数是io.sort.mb和sort.spill.percent,这两个参数决定了内存写入时的空间大小和触发磁盘写操作的阈值。将这两个参数值设为不同的离散值,并使用相应参数值在实际集群中执行实际的单map task任务,在系统执行日志中收集内存写和磁盘写在不同数据量下的速率表现,通过拟合速率和数据量大小的关系建立微操作速率模型,通过速率和数据量即可得到执行时间。该基准测試的目的在于测试出cm_mic_op和cd_mic_op处理不同大小数据时的速率表现,只需执行简单的单map task任务,执行时间短,建模效率高,这里高效率的建模方式也是本方法可移植性好的根本体现。基准测试时任务类型须和目标作业类型相同,因为不同作业的数据结构不同,微操作的速率也就可能不同,需要建立不同的微操作模型。

与Reduce task的shuffle phase中三种微操作相关的系统参数是reduce.java.opts、shuffle.input.buffer.percent、shuffle.merge.percent和io.sort.factor,这四个参数是reduce task中影响性能的主要参数,其决定了内存写入时的空间大小和触发磁盘写操作的阈值,以及在磁盘进行文件合并时的阈值。同样,这些参数对时间性能的影响主要体现在影响微操作处理的数据量大小。为了建立sm_mic_op、sd_mic_op和merge_mic_op的速率模型,将这几个参数值设为不同的离散值,并使用相应参数值在集群中执行实际的单reduce任务,然后在系统日志中收集不同操作在不同数据量下的速率表现,通过拟合微操作执行速率和数据量大小的关系建立模型,通过速率和数据量便可得到执行时间。这里建立的内存写微操作sm_mic_op可以看作是网络传输速率模型。通过定义微操作的方式定量地分析网络传输速率和数据量大小的关系,在对reduce端的微操作进行基准测试时,map端的task需能完整体现网络结构的性能,即在每一个nodemanager中都需要执行map task,存储中间数据供reduce task拉取。由于只是测试单reduce task作业,所以数据量无需过大,以测试效率为主。

在集群和作业类型固定的情况下,本文假设微操作速率符合以下线性模型:

3 作业重构与优化

3.1 作业重构

在本节中,将详细介绍如何根据建立好的微操作模型重构得到阶段(phase)的原始运行过程,从而得到阶段运行时间和参数的关系。

在第2章中,对两个阶段进行了解构,针对不同的阶段,利用该阶段定义的微操作对该阶段的运行流程进行重构。Map task中的collection phase,作如下定义:

其中:记参数io.sort.mb的值为x,参数sort.spill.percent的值为y;Tc表示collection phase执行时间;cm_mic_op微操作时间模型表示为M(a),a表示输入数据量大小,返回处理时间;cd_mic_op微操作时间模型表示为D(a),a表示输入数据量大小;Din表示collection phase处理数据的总大小。

当第一次内存写达到阈值时,触发磁盘写操作并将写入了数据的内存空间锁定(内存空间被锁定后,不再有数据写入),与此同时,内存写操作会继续在剩余空闲的内存空间内写入数据直到当次磁盘写操作结束,此时解锁之前被锁定的内存空间,若:

1)此次磁盘写操作过程中内存中被写入的数据量大于等于x*y,则再次触发磁盘写操作,将内存中的数据全部存入磁盘。

2)此次磁盘写操作过程中内存中被写入的数据量小于x*y,则在被解锁的内存空间中继续写入数据,直到内存中的数据量达到阈值x*y时,再次触发磁盘写操作。

如此交替执行内存写操作和磁盘写操作直至所有数据被写入磁盘。在式(2)中,y>0.5时对应上述情况1),y≤0.5时对应上述情况2)。

对于reduce task中的shuffle phase,有四个主要影响性能的参数:reduce.java.opts、shuffle.input.buffer.percent、shuffle.merge.percent和io.sort.factor。其中reduce.java.opts和shuffle.input.buffer.percent决定了sm_mic_op内存写入时的空间大小。参数shuffle.merge.percent决定了触发sd_mic_op磁盘写入时内存中存在数据的阈值,参数io.sort.factor决定了触发merge_mic_op文件合并时本地存在的文件个数,例如当io.sort.factor=n时,当本地存在的文件个数为2*n-1个时,触发merge_mic_op操作,合并大小最小的n个文件为一个文件。

对于shuffle phase运行过程的重构,首先sm_mic_op从起始位置开始查找内存中空余空间,往未被锁定的内存空间中写入数据,当第一次内存写达到阈值时触发磁盘写操作并将该部分内存空间锁定,直到本次磁盘写操作结束时对其解锁;与此触发磁盘写操作的同时,内存写操作继续在剩余空闲且未被锁定的空间内写入数据,达到阈值时再次触发磁盘写操作,如此往复,当本地文件个数达到触发merge_mic_op的阈值时,触发文件合并操作;当sm_mic_op查找到内存空间尾部位置时,开始等待,停止写入数据直到所有磁盘写操作结束即内存中所有空间被解锁时,再次从内存起始位置开始查找空余空间写入数据;当sm_mic_op处理过的数据量达到reduce task所需处理的数据总量时,重构过程完成。

基于微操作模型,可以在不同参数值的情况下对shuffle phase进行作业重构,得出参数和阶段执行时间的关系。

在reduce task中还有一个阶段是sort_write phase(sw_phase),该阶段利用多路归并算法将所有数据进行排序并输出到磁盘得到最终结果。该阶段的特殊性在于虽然没有直接影响该阶段性能的参数,但是在shuffle phase中产生的本地文件个数会间接影响该阶段的数据排序效率。为了提高整个job执行时间优化的准确性,需要对该阶段进行建模。将sort_write phase整个阶段定义为一个磁盘写微操作,影响该操作的参数是决定shuffle phase本地文件个数的参数和总数据量,所以在第2章的基準测试中,测试shuffle phase相关微操作的同时,在系统日志中提取出sort_write phase执行时间与shuffle phase的本地文件个数和数据量的关系。定义如下微操作模型:

(3)

其中:Tsw_phase表示sort_write phase的执行时间;Dsw_input表示sort_write phase处理的数据量大小;Nspill表示shuffle phase中sd_mic_op执行的次数; αsw_phase和βsw_phase表示模型参数,通过基准测试拟合可以得到模型参数。

3.2 基于微操作的参数调优

针对本文的Hadoop参数调优问题,优化目标是最小化mapreduce job的运行时间,将job解构为六个phase之后,优化目标从最小化job整体运行时间转换为最小化collection phase、shuffle phase和sort_write phase运行时间之和。基于微操作模型对各阶段运行时间进行最小化即可得到最小化的job运行时间。

本文方法可视为一种优化问题的描述方法和分析框架,在此模型基础上可以应用不同的参数搜索算法来优化作业运行时间。下面给出基于微操作模型的调优框架:

1)解构运行过程,分析参数影响方式,定义微操作类型。

2)基于定义的微操作进行基准测试,建立微操作执行时间和参数的关系。

3)基于微操作对运行过程进行重构,建立整体运行时间与参数的关系。

4)选择搜索算法在参数空间内进行搜索,迭代执行模型,得到在不同参数值情况下运行时间的情况选择运行时间达到要求的参数组合。

5)结束参数优化。

4 实验结果与分析

使用本文提出的方法构建了微操作模型和运行过程重构模型进行实验。实验环境配置为:型号为DELL PowerEdge R710的服务器6台,磁盘500GB/台,内存8GB/台,默认设置一个nodemanager上并行4个map task,并行2个reduce task。用terasort和wordcount两种作业测试了本文的方法。

4.1 度量标准

在实验结果中主要对作业默认配置的运行时间和调优后的运行时间进行对比,并对默认配置的运行时间归一化为1,调优后执行时间为与默认配置下执行时间的比率。

作业默认参数值如表2所示,在参数名后标记序号是为在后续参数表中表示对应参数名,不再写具体参数名。

4.2 数据集

实验在terasort和wordcount 2个作业类型上测试本文提出的方法,terasort和wordcount是常用的benchmark。针对collection phase分别测试50GB、100GB和200GB的输入数据量;针对shuffle phase分别测试100GB、200GB和300GB的输入数据量。针对job的运行时间分别测试100GB和200GB的输入数据量。

4.3 结果分析

如图2的实验结果所示,第一个实验是对terasort任务中的sd_mic_op微操作(tr_sd_mic_op)进行拟合建模,可以得到该微操作执行速率和数据量的关系。从图2可以看出,线性拟合程度很高,个别离群点是由集群的不稳定带来的系统随机误差。

第二个实验是在terasort任务和wordcount任务上对collection phase的优化效果进行对比,结果如表3所示。在terasort任务中,单map task处理的数据量大小是1GB,平均运行时间相对于默认参数可以优化43%左右;wordcount任务中,单map task处理的数据量大小也是1GB,平均运行時间相对于默认参数情况下可以优化33%左右。参数调优后的值如表4所示,因为该阶段只涉及三个参数,所以其余参数为默认值。terasort任务是一个排序任务,处理过程中数据量不会有太大的变化,而wordcount任务处理过程中数据量会减少,这是导致优化程度不一样的主要原因。

第三个实验是在terasort和wordcount任务上对shuffle phase的优化效果进行对比,结果如表5所示。相对于默认参数情况下,terasort的shuffle phase运行时间平均优化了45%左右,wordcount的shuffle phase运行时间平均优化了30%左右。shuffle phase参数调优后的值如表6所示,因为该阶段只设计四个参数,所以其余参数为默认值。究其原因与collection phase分析的原因类似,不同任务数据变化方式也不一样,调优效果也不一样。

5 结语

本文针对基于手动或者经验的Hadoop参数调优存在的问题,提出了一种基于微操作重构的Hadoop参数自动优化的方法。该方法通过将整体运行过程进行解构,定义参数直接影响的微操作模型,可以对参数的变化进行定量的分析,再基于微操作对运行过程进行重构,从而建立整体运行时间和参数的关系。实验结果表明,本文提出的方法在调节那些人工调优很有难度的参数上有较好的效果,表明了本文所提的方法是可行且高效的。接下来,我们会针对其他更复杂的参数,如单机并行的map task和reduce task个数等进行调优,这会涉及到运行流程和硬件设备的相关分析,将是未来进一步的研究方向。

参考文献 (References)

[1] DEAN J, GHEMAWAT S. MapReduce: simplified data processing on large clusters [C] // Proceedings of the 6th Conference on Symposium on Opearting Systems Design and Implementation. Berkeley, CA: USENIX Association, 2004: 137-149.

[2] CUTTING D. Apache Hadoop [EB/OL]. (2015-02-25)[2018-08-12]. http://hadoop.apache.org.

[3] BABU S. Towards automatic optimization of MapReduce programs [C]// Proceedings of the 1st ACM Symposium on Cloud Computing. New York: ACM, 2010: 137-142.

[4] TIPCON T. 7 tips for improving MapReduce performance [EB/OL]. (2009-12-17)[2018-08-12]. http://www.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performance/.

[5] HERODOTOU H, LIM H, LUO G, et al. Starfish: a self-tuning system for big data analytics [C]// Proceedings of the 2011 5th Biennial Conference on Innovative Data Systems Research. Asilomar, CA: [s.n.], 2011: 261-272.

[6] WANG J H, QIU M K, GUO B, et al. Phase-reconfigurable shuffle optimization for Hadoop MapReduce [EB/OL]. [2018-08-12]. IEEE Transactions on Cloud Computing, 2015, 3: 1-1.https://www.onacademic.com/detail/journal_1000038191224210_fd14.html.

[7] YIGITBASI N, WILLKE T L, LIAO G, et al. Towards machine learning-based auto-tuning of MapReduce [C]// Proceedings of the IEEE 21st International Symposium on Modeling, Analysis and Simulation of Computer and Telecommunication Systems. Piscataway, NJ: IEEE, 2013: 11-20.

[8] CHAUDHURI S, NARASAYYA V. Self-tuning database systems: a decade of progress [C]// Proceedings of the 2007 International Conference on Very Large Data Bases. Framingham, MA: VLDB Endowment, 2007: 3-14.

[9] IPEK E, de SUPINSKI B R, SCHULZ M, et al. An approach to performance prediction for parallel applications [C]// Proceedings of the 2005 European Conference on Parallel Processing, LNCS 3648. Berlin: Springer, 2005: 196-205.

[10] SINGER J, KOVOOR G, BROWN G, et al. Garbage collection auto-tuning for Java MapReduce on multi-cores [C]// Proceedings of the 2011 International Symposium on Memory Management. New York: ACM, 2011: 109-118.

[11] CHENG D Z, RAO J, GUO Y F, et al. Improving performance of heterogeneous MapReduce clusters with adaptive task tuning [J]. IEEE Transactions on Parallel & Distributed Systems, 2017, 28(3): 774-786.

[12] WASI-UR-RAHMAN M, ISLAM N S, LU X, et al. MR-Advisor: a comprehensive tuning tool for advising HPC users to accelerate MapReduce applications on supercomputers [C]// Proceedings of the 28th International Symposium on Computer Architecture and High Performance Computing. Piscataway, NJ: IEEE, 2016: 198-205.

[13] 童穎.基于机器学习的Hadoop参数调优方法[D].武汉:华中科技大学,2016:1-52.(TONG Y. Hadoop parameters tuning method based on machine learning [D]. Wuhan: Huazhong University of Science and Technology, 2016: 1-52.)

[14] LIAO G, DATTA K, WILLKE T L. Gunther: search-based auto-tuning of MapReduce [C]// Proceedings of the 2013 European Conference on Parallel Processing, LNCS 8097. Berlin: Springer, 2013: 406-419.

[15] DEB K. An introduction to genetic algorithms [J]. Sadhana, 1999, 24(4/5): 293-315.

[16] 祝春祥,陈世平,陈敏刚.基于递归随机抽样的Hadoop配置优化[J].计算机工程,2016,42(2):26-32.(ZHU C X, CHEN S P, CHEN M G. Configuration optimization of Hadoop based on recursive random sampling [J]. Computer Engineering, 2016, 42(2): 26-32.)

猜你喜欢

重构
长城叙事的重构
重构
农产品供应链重构赋时层次有色Petri网建模与仿真研究
学科哲学导向的高中历史教学重构
重读《重构》,呼唤匠艺
基于FPGA的动态可重构系统设计与实现