MapReduce性能优化系统及优化方法与流程

文档序号:12469739阅读:345来源:国知局
MapReduce性能优化系统及优化方法与流程

本发明涉及分布式计算技术领域,特别涉及一种MapReduce性能优化系统及优化方法。



背景技术:

互联网和万维网的快速增长,导致了大量的信息在网上传播。此外,企业和政府机构产生了大量的结构化和非结构化信息,这些信息需要进行处理,分析和链接。数据密集型应用程序,如系统生物学,气候建模,数据挖掘和高性能计算所产生的的数据量一路飙升,从GB到TB乃至PB级。

MapReduce是一个处理大规模数据的编程模型和分布式计算模型,具有广泛的应用,例如分布式的基于模式的搜索、分布式排序、网页链接图反转、Web访问日志统计、倒排索引结构、文档聚类、机器学习等等。此外,MapReduce模型已经成功应用于多核系统、网格式桌面系统、分布式计算环境、动态云环境以及移动计算环境。由于MapReduce的高可编程性,许多企业和组织都自己实现了MapReduce模型,比如Google公司的MapReduce、Yahoo公司的Hadoop、微软的Dryad以及Facebook的Hive等等。

MapReduce在设计之初假设输入数据是均匀分布的,因此默认使用对Key进行哈希的方法,通过保证分配给每个Reduce子任务的Key的数量基本相同来达到负载均衡的目的。但是,当输入数据存在较大倾斜时,每个Key对应的Value数量差异较大,Key的数量相同并不意味着数据量相同,因此使用该方法并不能做到很好的负载均衡,那些分配了过多数据的Reduce子任务势必会运行非常长的时间,从而导致MapReduce性能的严重下降。如图1所示,图1显示了Ranked-Inverted-Index测试用例的运行结果(该实验环境配置为24个处理容器(containers,子任务处理单元)来处理495个Map子任务和40个Reduce子任务,不同的块代表不同的子任务,由于Hadoop MapReduce默认提前进行Shuffle—当5%的Map子任务完成时就已经开始了Shuffle,所以部分Shuffle时间和Map子任务重合,没有在图中显示出来),从图中可以看出最慢的Reduce子任务的运行时间是平均Reduce子任务运行时间的4.57倍,而在MapReduce模型中,整个任务的执行过程是由最慢子任务决定的,因此整个任务的执行时间都被显著拖慢。

另外,在现实应用中,数据倾斜现象非常普遍,在科学计算中倾斜尤为普遍,因此优化MapReduce在倾斜数据上的性能显得非常重要。



技术实现要素:

本发明旨在至少在一定程度上解决相关技术中的技术问题之一。

为此,本发明的一个目的在于提出一种MapReduce性能优化系统,该系统可以优化MapReduce在倾斜数据上的性能。

本发明的另一个目的在于提出一种MapReduce性能优化方法。

为达到上述目的,本发明一方面实施例提出了一种MapReduce性能优化系统,包括:Skew--主节点,用于作为主协调器全局地对Reduce子任务间的Key分布进行管理,并且将所述Reduce子任务调度到合适的执行节点上,其中,所述Skew--主节点包括:Key分配器,用于根据Reduce任务的复杂度将Keys均匀地分配到每一个Reduce子任务上;Reducer选择器,用于根据Key的位置信息把所述Reduce子任务调度到所述合适的执行节点上;多个Skew--从节点,所述多个Skew--从节点位于Hadoop YARN的节点管理器上,所述多个Skew--从节点中每个Skew--从节点包括:Key监控器与IO监控器,用于收集Key相关的信息,所述Key相关的信息包括group大小、所述Key的位置信息以及每个节点的IO占用信息,并将所述Key相关的信息发送至所述Skew--主节点。

本发明实施例的MapReduce性能优化系统,可以使用一种称之为复杂度感知的Key分配方法,以及与之对应的局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制来保证MapReduce的性能。复杂度感知的Key分配方法不仅考虑Key记录的大小,也考虑Reduce函数的复杂度,从而能够更好地在各个Reduce子任务间平衡计算开销。局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制则通过利用数据局部性来减少数据传输和提升资源利用率来减少复杂度感知的Key分配带来的额外开销,实现优化MapReduce在倾斜数据上的性能的目的,简单易实现。

另外,根据本发明上述实施例的MapReduce性能优化系统还可以具有以下附加的技术特征:

进一步地,在本发明的一个实施例中,分配给所述Reduce子任务的partition包含多个group,其中,每个group由Reduce函数一次处理。

进一步地,在本发明的一个实施例中,通过相应的装箱问题使所述Reduce子任务间的计算量均衡。

进一步地,在本发明的一个实施例中,通过本地感知的Reducer选择算法使数据本地化。

进一步地,在本发明的一个实施例中,通过自动识别Shuffle的类型判断是否提前调度Reduce子任务开始数据Shuffle,以将所述Reduce子任务的数据从Map完成的Map节点传输到Reduce节点。

为达到上述目的,本发明另一方面实施例提出了一种MapReduce性能优化方法,包括以下步骤:S1,所述Skew--主节点对所述Reduce子任务间的Key分布进行管理,并且将所述Reduce子任务调度到所述合适的执行节点上;S2,Key分配器根据所述Reduce任务的复杂度将所述Keys均匀地分配到所述每一个Reduce子任务上,并且所述Reducer选择器根据所述Key的位置信息把所述Reduce子任务调度到所述合适的执行节点上;S3,所述Key监控器与所述IO监控器收集所述Key相关的信息,并将所述Key相关的信息发送至所述Skew--主节点。

本发明实施例的MapReduce性能优化方法,可以使用一种称之为复杂度感知的Key分配方法,以及与之对应的局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制来保证MapReduce的性能。复杂度感知的Key分配方法不仅考虑Key记录的大小,也考虑Reduce函数的复杂度,从而能够更好地在各个Reduce子任务间平衡计算开销。局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制则通过利用数据局部性来减少数据传输和提升资源利用率来减少复杂度感知的Key分配带来的额外开销,实现优化MapReduce在倾斜数据上的性能的目的,简单易实现。

另外,根据本发明上述实施例的MapReduce性能优化方法还可以具有以下附加的技术特征:

进一步地,在本发明的一个实施例中,分配给所述Reduce子任务的partition包含多个group,其中,每个group由Reduce函数一次处理。

进一步地,在本发明的一个实施例中,通过相应的装箱问题使所述Reduce子任务间的计算量均衡。

进一步地,在本发明的一个实施例中,通过本地感知的Reducer选择算法使数据本地化。

进一步地,在本发明的一个实施例中,通过自动识别Shuffle的类型判断是否提前调度Reduce子任务开始数据Shuffle,以将所述Reduce子任务的数据从Map完成的Map节点传输到Reduce节点。

本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1为相关技术中Ranked-Inverted-Index作业执行各个子任务的运行时间示意图;

图2为根据本发明一个实施例的MapReduce性能优化系统的结构示意图;

图3为根据本发明一个实施例的Skew--与Hadoop任务执行时间对比示意图;

图4为根据本发明一个实施例的Reduce执行复杂度测定法与统一线性复杂度法和“真实复杂度”法性能对比结果示意图;

图5为根据本发明一个实施例的不同倾斜分布对Skew--的影响示意图;

图6为根据本发明一个实施例的提前Shuffle和只是全Mapper执行运行时间对比图示意图;以及

图7为根据本发明一个实施例的MapReduce性能优化方法的流程图。

具体实施方式

下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。

下面参照附图描述根据本发明实施例提出的MapReduce性能优化系统及优化方法,首先将参照附图描述根据本发明实施例提出的MapReduce性能优化系统。

图2是本发明一个实施例的MapReduce性能优化系统的结构示意图。

如图2所示,该MapReduce性能优化系统包括:Skew--主节点100和多个Skew--从节点(如Skew--从节点201、Skew--从节点202、Skew--从节点203所示)。

其中,Skew--主节点100用于作为主协调器全局地对Reduce子任务间的Key分布进行管理,并且将Reduce子任务调度到合适的执行节点上,其中,Skew--主节点100包括:Key分配器101和Reducer选择器102,Key分配器101用于根据Reduce任务的复杂度将Keys均匀地分配到每一个Reduce子任务上;Reducer选择器102用于根据Key的位置信息把Reduce子任务调度到合适的执行节点上。多个Skew--从节点位于Hadoop YARN的节点管理器(如节点管理器301、节点管理器302、节点管理器303所示)上,多个Skew--从节点中每个Skew--从节点包括:Key监控器(如Key监控器2011、Key监控器2021、Key监控器2031所示)与IO监控器(IO监控器2012、IO监控器2022、IO监控器2032所示),用于收集Key相关的信息,Key相关的信息包括group大小、Key的位置信息以及每个节点的IO占用信息,并将Key相关的信息发送至Skew--主节点100。本发明实施例的优化系统可以优化MapReduce在倾斜数据上的性能,简单易实现。

其中,在本发明的一个实施例中,分配给Reduce子任务的partition包含多个group,其中,每个group由Reduce函数一次处理。

进一步地,在本发明的一个实施例中,通过相应的装箱问题使Reduce子任务间的计算量均衡。

进一步地,在本发明的一个实施例中,通过本地感知的Reducer选择算法使数据本地化。

进一步地,在本发明的一个实施例中,通过自动识别Shuffle的类型判断是否提前调度Reduce子任务开始数据Shuffle,以将Reduce子任务的数据从Map完成的Map节点传输到Reduce节点。

需要说明的是,在自动识别出作业的Shuffle类型之后,所执行的操作是确定的:对于非Shuffle-heavy类型(也就是文中的Shuffle-light和Shuffle-medium)的作业,则启用提前Shuffle,这也是Hadoop MapReduce框架的缺省做法;对于Shuffle-heavy类型的作业,按照所提出的方法处理,不启用提前Shuffle,而是等到所有Map任务均完成之后再调度Reduce任务,然后传输数据。

综上所述,可以理解的是,本发明实施例的目的在于解决由Reduce子任务输入数据的随机分配以及Reduce子任务随机调度到执行节点导致的Reduce子任务非均衡的计算量而造成的MapReduce在倾斜数据的性能下降的问题,本发明实施例通过使用一种称之为基于复杂度Key分布的离线数据划分方法,并且使用三个称之为本地感知Reducer选择、全Mapper执行和Shuffle感知调控的组件进行智能调度。

在本发明的实施例中,相对于现有的支持MapReduce模型的分布式文件系统相比,本发明提出的技术方案具有如下优点:

1、提出了一种称之为基于复杂度分布Key的方法来划分中间数据并且把它们分配到各个Reduce工作节点,第一次既考虑Key群组的大小,同时也考虑Reduce函数的复杂度来在Reduce阶段进行负载均衡;

2、提出了另外三种策略,称之为本地感知Reducer选择、全Mapper执行和Shuffle感知调控,来更好地利用计算资源以确保基于复杂度Key分布的性能提升;以及

3、将Skew--集成到了Hadoop YARN。

本发明实施例可以适用于通用场景下支持MapReduce计算模型的分布式计算系统,能够大大提高在多任务,大数据背景下MapReduce计算任务的执行效率,显著加快任务的执行速度。

具体而言,在本发明的实施例中,复杂度感知的Key分布方法,目的是缓和Reduce子任务间负载不均衡的问题。该方法的核心是基于采样的Reduce执行复杂度探测方法和多个Reduce子任务间考虑计算复杂度的Key均衡分布方法,包括以下步骤:

S1、分配给每一个Reduce子任务的partition包含多个group,每一个group都是由用户提供的Reduce函数一次处理。由于每Reduce函数由各种各样的应用提供,函数的复杂度也是大不一样。而且,需要特意指出的是,所定义的Reduce执行复杂度与通常算法中提到的计算复杂度是有本质区别的,比如某个Reduce任务,虽然其计算复杂度是O(n2),但是当该任务的大部分时间花在IO上,也就是该任务的瓶颈为IO时,该Reduce执行复杂度应该是O(n)而不是O(n2)。对于MapReduce框架来说,用户提供的任务是一个黑盒子,关于黑盒子探测问题目前已经有很多研究工作了,然而,这些探测方法要么耗时比较长要么探测的准确度与应用有关。另一个方法是让用户在向框架提交任务时来指定Reduce执行复杂度,然而这样做的话很显然违背了框架透明性的原则,再者,即使是任务提交者也不一定能够很准确的知道Reduce执行复杂度(在大多数情况下任务提交者最多知道函数的计算复杂度)。

各种各样的任务执行复杂度大致可以分为四种:常数、logN、多项式和指数。而在根据Reduce执行复杂度进行Key分配时,根据每一个group的开销比率进行分配,因此只需要测定执行复杂度的最高指数项即可,而无需测定系数值以及低阶项的指数和系数值。在Skew--中,使用一种基于采样的方法来决定任务的Reduce执行复杂度。使用不同的输入数据集大小来运行Reduce任务并获取相应的执行时间。使用这个方法也许会耗费一定的时间完成,然而,在MapReduce任务的执行过程一旦有一部分Map子任务完成,就可以取得Reduce子任务的输入数据来开始复杂度的测定,也就是说可以把该测定过程与Map阶段重叠起来,这样也就对整个任务来说不会有额外的时间开销。

S2、Reduce子任务分配Keys的目的是使Reduce子任务间的计算量尽可能的均衡,这一类型的最优分配方法可以通过相应的装箱问题(bin packing problem)解决,然而不幸的是,根据计算复杂理论装箱问题是一个NP难问题,因此使用0-1背包问题作为该问题的近似解决方案。将未分配的Key的计算开销(根据Reduce执行复杂度及该Key对应的values的数量得出该Key的计算开销,比如,当Reduce执行复杂度为O(n2),values数量为100时,该Key对应的计算开销为1002=10000)作为背包重量,每一个Key组的开销作为货物价值和重量,在for循环的每一步中调用GetKnapSack函数去得到选择的货物来作为每一个Reduce子任务的Key组。

S3、数据本地化是MapReduce优化时所遵循的重要准则,因此提出了基于本地感知的Reducer选择算法。在Hadoop中,每一个Map子任务和Reduce子任务都是由单独的计算资源(在Hadoop YARN被称之为container,在Hadoop MapReduce v1中称之为slot)执行的,然而,IO资源比如硬盘资源和网络资源是由每一个计算节点上的所有子任务之间共享的。因此,当调度Reduce子任务到计算节点上时,不但要考虑数据的分布情况同时也应该考虑每一个节点的IO负载情况。1)首先按照每一个Reduce子任务的输入数据集大小来对这些节点进行逆序排序,然后2)挑选前1=3(选择这一参数是因为在实验中发现该参数是IO利用率以及数据传输量间一个很好的均衡点)的节点作为任务调度的候选节点,最后3)选择具有最小下行网络占用百分比和硬盘读取带宽占用百分比的节点作为Reduce子任务的调度节点。

S4、在许多MapReduce框架中,比如Hadoop,当一小部分Map子任务完成后,就会提前调度Reduce子任务开始数据Shuffle—将Reduce子任务的数据从Map完成的Map节点传输到Reduce节点。提前Shuffle的优点是当网络状况不是很好时,将数据传输和计算重叠起来可以节省大量的数据传输时间。然而,这些优点也会带来开销:Map子任务和Reduce子任务共享MapReduce集群中的计算资源(比如,CPU资源,内存资源),比如说,在Hadoop中Map子任务和Reduce子任务都是以container的形式分配计算资源。提前调度的Reduce子任务不可避免的会占用一些containers,从而分配给Map子任务的containers会减少,因此会降低Map子任务的并行度并拖长整个Map阶段。随着网络硬件的发展,比如千兆、百G网络以及RDMA-enabled InfiniBand,网络带宽变得越来越大,使得提前Shuffle的优点变得微不足道。

在认识到提前Shuffle会拖慢Map阶段,禁止了提前Shuffle并且把所有的containers都分配给Map子任务以使其能够全速执行。这种方法同样使得Skew--在获取到全局Key分布信息后再进行基于复杂度Key分布和本地感知Reducer选择,从而做出更加优化的决策。

S5、由于MapReduce广泛应用到各种领域,各种类型的应用都运行在MapReduce上。从Shuffle数据量(换句话说,从Reduce子任务的输入数据量)的角度来看,MapReduce应用可以大致分为三类:Shuffle-light(轻Shuffle型)、Shuffle-medium(中Shuffle型)和Shuffle-heavy(重Shuffle型)。对于Shuffle-light和Shuffle-medium类型的应用,Reduce子任务的输入数据量比较少,Reduce阶段的执行时间占整个任务时间的一小部分(在测试用例中Reduce阶段的运行时间不到整个任务执行时间的5%),基于复杂度Key分布组件在这些应用中只有很少的性能改善,有时该改善比基于复杂度Key分布的额外开销还大,因此针对这两类应用,Skew--只是使用全Mapper执行组件进行优化,而不进行Key分配。对于Shuffle-heavy应用,Reduce阶段的执行时间一般占整个任务很大的一部分,基于复杂度Key分布可以带来很大的时间节省,虽然该组件也有一定的额外开销,但是与节省的时间相比该开销就非常小。

下面以一个具体实施例对本发明实施例的优化系统进行详细赘述。

本发明基于MapReduce模型,提出了Skew--,用来改善输入数据倾斜情况下的MapReduce性能。Skew--使用一种称之为复杂度感知的Key分布方法,并且使用三个称之为本地感知Reducer选择、全Mapper执行和Shuffle感知调控的组件进行智能调度。基于复杂度Key分布不仅考虑Key记录的大小也考虑Reduce函数的复杂度,以更好地在各个Reduce子任务间平衡计算开销。本地感知Reducer选择、全Mapper执行和Shuffle感知调控分别利用数据本地性来减少数据传输,更加有效利用资源来减少离线Key分配带来的额外开销。结合使用这四个组件来确保MapReduce应用在倾斜数据上的性能。

为了验证本发明实施例对MapReduce模型的支持效果,设计了具有7个节点的实验环境,分别在传统YARN和基于YARN修改的Skew--下运行13个测试用例。统计各个测试用例的执行时间进行比较。

各任务执行时间如图3所示,图中Hadoop表示传统Hadoop的Yarn,Skew--表示采用本发明提出的MapReduce倾斜消除方法,并且以传统Hadoop中用例的时间为基准进行了归一化,Skew--取得了相对于HadoopYarnx1.98倍的加速比。

图4显示了对Reduce执行复杂度测定精确度对MapReduce性能影响也进行了的评测结果。将Skew--与线性复杂度(在进行Key分配是,把所有任务的Reduce执行复杂度均当作线性)、“真实复杂度”(Skew--使用“真实复杂度”进行Key分配)性能分布进行了对比。结果显示Reduce执行复杂度测定法性能趋近于“真实复杂度”法性能。

图5显示了Skew--相对于Hadoop在不同Zipf参数下的加速比情况。由于Skew--对于Shuffle-light和Shuffle-medium任务,只使用全Mapper执行进行优化,因此这两类任务的加速比不受参数s的影响。而当s越大时,在各个key groups之间的倾斜就越大,Skew--在Shuffle-heavy任务上的加速比也就越大。

在标准的Hadoop MapReduce中,Shuffle过程在部分(默认5%)Map子任务完成时机已经开始以重叠数据传输和计算来以期减少整个任务的完成时间。然而,这一方法不可避免地拖慢Map阶段。同样也进行了一个实验来对比提前Shuffle和只是全Mapper执行,其结果如图6所示。从图中可以看出,提前Shuffle所节省的时间与只是全Mapper执行节省的时间相比是非常有限的—提前Shuffle节省最多时间是在self-join任务中最多节省36s,而在该任务中全Mapper执行节省了116s。

根据本发明实施例的MapReduce性能优化系统,可以使用一种称之为复杂度感知的Key分配方法,以及与之对应的局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制来保证MapReduce的性能。复杂度感知的Key分配方法不仅考虑Key记录的大小,也考虑Reduce函数的复杂度,从而能够更好地在各个Reduce子任务间平衡计算开销。局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制则通过利用数据局部性来减少数据传输和提升资源利用率来减少复杂度感知的Key分配带来的额外开销,实现优化MapReduce在倾斜数据上的性能的目的,简单易实现。

其次参照附图描述根据本发明实施例提出的MapReduce性能优化。

图7是本发明一个实施例的MapReduce性能优化的流程图。

如图7所示,该MapReduce性能优化包括以下步骤:

步骤S1,Skew--主节点对Reduce子任务间的Key分布进行管理,并且将Reduce子任务调度到合适的执行节点上。

步骤S2,Key分配器根据Reduce任务的复杂度将Keys均匀地分配到每一个Reduce子任务上,并且Reducer选择器根据Key的位置信息把Reduce子任务调度到合适的执行节点上。

步骤S3,Key监控器与IO监控器收集Key相关的信息,并将Key相关的信息发送至Skew--主节点。

进一步地,在本发明的一个实施例中,分配给Reduce子任务的partition包含多个group,其中,每个group由Reduce函数一次处理。

进一步地,在本发明的一个实施例中,通过相应的装箱问题使Reduce子任务间的计算量均衡。

进一步地,在本发明的一个实施例中,通过本地感知的Reducer选择算法使数据本地化。

进一步地,在本发明的一个实施例中,通过自动识别Shuffle的类型判断是否提前调度Reduce子任务开始数据Shuffle,以将Reduce子任务的数据从Map完成的Map节点传输到Reduce节点。

需要说明的是,前述对MapReduce性能系统实施例的解释说明也适用于该实施例的MapReduce性能方法,此处不再赘述。

根据本发明实施例的MapReduce性能优化方法,可以使用一种称之为复杂度感知的Key分配方法,以及与之对应的局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制来保证MapReduce的性能。复杂度感知的Key分配方法不仅考虑Key记录的大小,也考虑Reduce函数的复杂度,从而能够更好地在各个Reduce子任务间平衡计算开销。局部性感知的Reducer选择、全Mapper执行和Shuffle类型感知的调控等机制则通过利用数据局部性来减少数据传输和提升资源利用率来减少复杂度感知的Key分配带来的额外开销,实现优化MapReduce在倾斜数据上的性能的目的,简单易实现。

在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“长度”、“宽度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”、“顺时针”、“逆时针”、“轴向”、“径向”、“周向”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。

此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。

在本发明中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”、“固定”等术语应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系,除非另有明确的限定。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。

在本发明中,除非另有明确的规定和限定,第一特征在第二特征“上”或“下”可以是第一和第二特征直接接触,或第一和第二特征通过中间媒介间接接触。而且,第一特征在第二特征“之上”、“上方”和“上面”可是第一特征在第二特征正上方或斜上方,或仅仅表示第一特征水平高度高于第二特征。第一特征在第二特征“之下”、“下方”和“下面”可以是第一特征在第二特征正下方或斜下方,或仅仅表示第一特征水平高度小于第二特征。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。

尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1