资源预览内容
第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
第9页 / 共39页
第10页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
厦门大学数据库实验室MapReduce连接优化ppt课件Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望连接技术简介连接技术简介基于传统基于传统 MapReduce 的连接的连接基于数据索引的连接基于数据索引的连接基于改进基于改进 MapReduce 的连接的连接连接技术比较连接技术比较 连接操作广泛应用于日志分析、联机分析处理及数据分析处理等方面。如果提高大数据连接计算速度,则可提高数据分析效率和用户体验度。下表对现有的MapReduce连接技术进行了分类与对比。连接技术简介连接技术简介基于传统基于传统 MapReduce 的连接的连接基于数据索引的连接基于数据索引的连接基于改进基于改进 MapReduce 的连接的连接基于传统基于传统 MapReduce 的连接的连接 这类算法主要通过实现map函数、reduce函数及之间的数据流传递,来完成数据连接运算。对于这方面的研究主要集中于两表等值连接、两表非等值连接(又称连接)、两表相似度连接、多表等值连接(星型连接、链式连接)、多表非等值连接等问题。标准重分区算法标准重分区算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法回顾算法回顾 标准重分区算法由一个标准重分区算法由一个MapReduce作业来完成连接运算。两个表的数作业来完成连接运算。两个表的数据都由据都由 Mapper 读入,根据查询条件进行过滤读入,根据查询条件进行过滤intermediate,生成,生成keyintermediate/valueintermediate对,其中对,其中 key是待连接列的数值,是待连接列的数值,valueintermediate则由用于标记数据来自哪个表的标签和记录值组成。在混洗则由用于标记数据来自哪个表的标签和记录值组成。在混洗过程中,具有相同连接值的数据会被分到同一个过程中,具有相同连接值的数据会被分到同一个Reducer上。上。Reducer根据标签将数据分为两个集合,再完成连接运算。标准重分区算法在根据标签将数据分为两个集合,再完成连接运算。标准重分区算法在Reducer上需要将数据全部装载到内存中,可能会造成内存溢出。另外,上需要将数据全部装载到内存中,可能会造成内存溢出。另外,当存在数据倾斜时,标准重分区算法容易造成数据分布不均,以及连接当存在数据倾斜时,标准重分区算法容易造成数据分布不均,以及连接速度缓慢和计算资源分布不均等问题。速度缓慢和计算资源分布不均等问题。改进的标准重分区算法改进的标准重分区算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法回顾算法回顾 为了解决标准重分区算法需要占用较大内存的问题,改进的标准为了解决标准重分区算法需要占用较大内存的问题,改进的标准重分区算法进行了以下优化:生成重分区算法进行了以下优化:生成 keyintermediate/valueintermediate对时,对时,keyintermediate值由待连接列的数值与表的标签共同构成,这样可以使值由待连接列的数值与表的标签共同构成,这样可以使一个表的数据都排在另一个表的前面。在混洗阶段,通过自定义的一个表的数据都排在另一个表的前面。在混洗阶段,通过自定义的partition函数来使含有同一连接值的数据仍然分到同一个函数来使含有同一连接值的数据仍然分到同一个Reducer上。在上。在Reduce阶段,在内存中缓存较小的表,另一表以流式方式读阶段,在内存中缓存较小的表,另一表以流式方式读入并进行连接操作。入并进行连接操作。广播算法广播算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法回顾算法回顾 广播算法将待连接的两个表中较小的表以广播的方式传输广播算法将待连接的两个表中较小的表以广播的方式传输到另一个表所在节点上,然后在该节点上进行连接操作。广到另一个表所在节点上,然后在该节点上进行连接操作。广播算法只需要一个无播算法只需要一个无Reduce的的MapReduce作业就可以完成,作业就可以完成,省去了数据混洗与排序的过程。当两表数据量相差很大时,省去了数据混洗与排序的过程。当两表数据量相差很大时,广播算法具有很高的效率。然而当待连接的两个表都很大时,广播算法具有很高的效率。然而当待连接的两个表都很大时,广播算法效率很低。广播算法效率很低。半连接算法半连接算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法回顾算法回顾 半连接算法使用三个半连接算法使用三个 MapReduce作业来完成运算,第一作业来完成运算,第一个个MapReduce 作业生成第一个表作业生成第一个表S的连接值文件。第二个的连接值文件。第二个MapReduce作业利用前一步生成的连接值文件,采用类似作业利用前一步生成的连接值文件,采用类似广播算法的方法对第二个表广播算法的方法对第二个表R的数据进行过滤。第三个的数据进行过滤。第三个MapReduce作业利用过滤后的作业利用过滤后的R表数据,采用广播算法进行表数据,采用广播算法进行连接。连接。分片半连接算法分片半连接算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法简介算法简介 分片半连接算法需要三个分片半连接算法需要三个MapReduce作业来完成连接运作业来完成连接运算。第一个算。第一个MapReduce作业对于表作业对于表S的每一分片生成该分片的每一分片生成该分片的连接值文件。第二个的连接值文件。第二个MapReduce作业根据表作业根据表S的每一分片的每一分片的连接值与表的连接值与表R进行半连接,生成每一分片的连接文件。第进行半连接,生成每一分片的连接文件。第三个三个MapReduce作业读入前一步生成的每一分片的连接文作业读入前一步生成的每一分片的连接文件,进行连接运算,生成最终结果。件,进行连接运算,生成最终结果。分片半连接算法分片半连接算法 半连接存在的一个问题是半连接存在的一个问题是:并不是过滤后的并不是过滤后的R中的每条记录都中的每条记录都要和要和L(S)中的某分区做连接。分片半连接解决了这个问题。)中的某分区做连接。分片半连接解决了这个问题。等值连接等值连接 前面所介绍的标准重分区算法、改进标准重分区算法、前面所介绍的标准重分区算法、改进标准重分区算法、广播算法、半连接算法、分片半连接算法均属于等值连接广播算法、半连接算法、分片半连接算法均属于等值连接的算法,相对简单一些。的算法,相对简单一些。非等值连接非等值连接 处理非等值连接时,由于不能预先知道两表值的分布情处理非等值连接时,由于不能预先知道两表值的分布情况,需要处理比等值连接更加复杂的问题。下面介绍一个况,需要处理比等值连接更加复杂的问题。下面介绍一个利用一个利用一个MapReduce 作业处理非等值连接操作的算法。作业处理非等值连接操作的算法。非等值连接举例非等值连接举例 Consider a join between data sets S and T with an inequality condition like S.A = T.A. Such joins seem inherently difficult for MapReduce, because each T-tuple has to be joined not only with S-tuples that have the same A value,but also those with different (smaller) A values. It is not obvious how to map the inequality join condition to a key-equality based computing paradigm.两个待连接数据集:两个待连接数据集:S、T连接条件:连接条件: S.A = T.AMapReduce连接遇到的问题:一个连接遇到的问题:一个T元组可能和一个或多个元组可能和一个或多个S元元组做连接。组做连接。非等值连接算法非等值连接算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法简介算法简介 该算法利用一个二维矩阵来表示两表的笛卡儿积,通过对矩阵中满足运算该算法利用一个二维矩阵来表示两表的笛卡儿积,通过对矩阵中满足运算结果的范围进行标记的方法表示各运算所需要的数据。为了减少任务执行时间,结果的范围进行标记的方法表示各运算所需要的数据。为了减少任务执行时间,并减小数据倾斜带来的影响,该算法对并减小数据倾斜带来的影响,该算法对Reducer的输入量及输出量进行了均衡,的输入量及输出量进行了均衡,将矩阵分成面积相等的将矩阵分成面积相等的R个区域(个区域(region),每个区域都有一个),每个区域都有一个RegionID。在在 map 函数中,对每一个记录可能参与运算的区域都生成一个函数中,对每一个记录可能参与运算的区域都生成一个RegionID,的键值对,在的键值对,在Reduce阶段,每一个阶段,每一个Reducer处理该处理该区域内的非等值连接,并生成最终结果。该算法很好地解决了区域内的非等值连接,并生成最终结果。该算法很好地解决了MapReduce在在处理非等值连接中的数据倾斜与计算平衡问题,但在数据混洗过程中需要很大处理非等值连接中的数据倾斜与计算平衡问题,但在数据混洗过程中需要很大的数据传输量。的数据传输量。非等值连接算法非等值连接算法S=5,7,7,8,9,9T=5,7,7,7,8,9标记的二维矩阵标记的二维矩阵均衡均衡Reducer的输入量及输出的输入量及输出量量相似度连接举例相似度连接举例 For example,in master-data-management applications, a system has to identify that names “John W. Smith”, “Smith, John”, and“John William Smith” are potentially referring to the same person. As another example, when mining social networking sites where users preferences are stored as bit vectors (where a “1” bit means interest in a certain domain), applications want to use the fact that a user with preference bit vector“1,0,0,1,1,0,1,0,0,1” possibly has similar interests to a user with preferences “1,0,0,0,1,0,1,0,1,1”.相似度连接算法相似度连接算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法简介算法简介 该算法首先利用两个该算法首先利用两个MapReduce作业进行数据统计与全局词项作业进行数据统计与全局词项排序。接着利用一个排序。接着利用一个MapReduce 作业,通过前缀过滤的方法减少作业,通过前缀过滤的方法减少需要参加相似连接运算的数据,并生成连接结果的键值对。最后通需要参加相似连接运算的数据,并生成连接结果的键值对。最后通过一个过一个MapReduce作业,根据前一步生成的键值对生成最后的相似作业,根据前一步生成的键值对生成最后的相似性连接结果。该算法充分利用了相似性连接的特点,过滤掉不可能性连接结果。该算法充分利用了相似性连接的特点,过滤掉不可能成为最终结果的数据,提高了查询效率,但应用范围只限于文本字成为最终结果的数据,提高了查询效率,但应用范围只限于文本字符串的相似性连接。符串的相似性连接。相似度连接算法相似度连接算法数据统计与全局数据统计与全局词项排序词项排序b第二阶段用第二阶段用tear-down function在内存中排序在内存中排序相似度连接算法相似度连接算法前缀过滤前缀过滤A属于属于X组,组,B、G属于属于Y组,组,C、D属于属于Z组组相似度连接算法相似度连接算法前缀过滤前缀过滤A属于属于X组,组,B、G属于属于Y组,组,C、D属于属于Z组组根据前一步根据前一步生成的键值生成的键值对生成最后对生成最后的相似性连的相似性连接结果接结果把第一阶把第一阶段产生的段产生的结果广播结果广播给每个给每个map多表连接多表连接 在数据库应用领域中,经常需要对多个表进行连接操作,比较有代表性的是星型连接与链式连接。星型连接:在数据仓库应用中,星型模式是最常用的数据表示模型,包括一个事实表和多个维表.链式连接:星型连接星型连接事实表LINEORDER和4个维表CUSTOMER、SUPPLIER、PART和DATE.在基于星型模式的OLAP查询中,涉及最多的操作就是维表和事实表的连接,又被称为星型连接.星型连接返回连接的全部结果,是OLAP查询中代价最高的操作之一.例1.SELECT*FROM LineorderF,CustomerC,SupplierS,PartP,DateDWHERE F.custkey = C.custkey and F.suppkey=S.suppkey and F.partkey= P.partkey and F.orderdate = D.datekeyORDER BY F.squantity+C.scredit+S.saddress+P.sbrand1+D.stimeSTOP AFTER k;多表等值连接算法多表等值连接算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法简介算法简介 该算法的基本思想是,对于每一个连接属性,都有一个对应的共该算法的基本思想是,对于每一个连接属性,都有一个对应的共享值表示这个属性进行享值表示这个属性进行 Hash 后的桶数,后的桶数,Map 输出的输出的 keyintermediate/valueintermediate对需要传到该表没有包含的属性对应的对需要传到该表没有包含的属性对应的每个每个Hash值中,因此复制的数量由该表没有包含的连接属性所对应值中,因此复制的数量由该表没有包含的连接属性所对应的共享值之积所决定。在的共享值之积所决定。在Reduce阶段,每个阶段,每个Reducer将传到该节点将传到该节点的各表的数据进行连接,形成最终结果。随着表数的增加,应用这的各表的数据进行连接,形成最终结果。随着表数的增加,应用这种算法产生的中间传输数据量将急剧增加,因此比较适合用于星型种算法产生的中间传输数据量将急剧增加,因此比较适合用于星型连接与表数不太多的链式连接。连接与表数不太多的链式连接。多表等值连接算法多表等值连接算法Suppose that the target number of map-keys is k. That is, we shall use k Reduce processes to join tuples from the three relations. Each of the three attributes A, B, and C will have a share of the key, which we denote a, b, and c, respectively.We assume there are hash functions that map values of attribute A to a different buckets, values of B to b buckets,and values of C to c buckets.Consider tuples (x,y) in relation R. Which Reduce processes need to know about this tuple? Recall that each Reduce process is associated with a map-key (u, v,w), where u is a hash value in the range 1 to a, representing a bucket into which A-values are hashed. Similarly, v is a bucket in the range 1 to b representing a B-value, and w is a bucket in the range 1 to c representing a C-value. Tuple ex; yT from Rcan only be useful to this reducer if hexT ?u and heyT ?v. However, it could be useful to any reducer that has these first two key components, regardless of the value of w. We conclude that (x,y) must be replicated and sent to the c different reducers corresponding to key values (h(x),h(y),w), where 1 =w =c.多表链式连接算法多表链式连接算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法简介算法简介 针对多表的链式连接,结合了列存储的思想,提出了基于二部图针对多表的链式连接,结合了列存储的思想,提出了基于二部图的连接算法。设参加链式连接计算的表的个数为的连接算法。设参加链式连接计算的表的个数为 n,该算法首先利,该算法首先利用用 n 个个MapReduce作业为每个表建立一个二部图,接着执行作业为每个表建立一个二部图,接着执行 2(n-1) 个个MapReduce作业,根据上一步骤生成的二部图以链式连接相反的作业,根据上一步骤生成的二部图以链式连接相反的顺序减少每个表中参数连接计算的记录个数,最后利用浓密树来提顺序减少每个表中参数连接计算的记录个数,最后利用浓密树来提高连接的并行度,这至少需要再执行高连接的并行度,这至少需要再执行 n-1个作业进行连接。该算法最个作业进行连接。该算法最大程度地减少了参与连接计算的数据传输量,但需要比较多的大程度地减少了参与连接计算的数据传输量,但需要比较多的MapReduce 作业数。作业数。多表链式连接算法多表链式连接算法多表非等值连接算法多表非等值连接算法welcome to use these PowerPoint templates, New Content design, 10 years experience算法简介算法简介 该算法首先生成一个超立方体来表示多个表的笛卡儿积。接着利该算法首先生成一个超立方体来表示多个表的笛卡儿积。接着利用希尔伯特填充曲线对超立方体进行填充,利用希尔伯特填充曲线用希尔伯特填充曲线对超立方体进行填充,利用希尔伯特填充曲线产生连接值,对待连接的数据进行分区,并且生成合适的产生连接值,对待连接的数据进行分区,并且生成合适的R。在。在Map任务中,对每个记录所满足非等值条件的分区都生成一个任务中,对每个记录所满足非等值条件的分区都生成一个 keyintermediate/valueintermediate对。在对。在Reduce阶段,完成连接运算并阶段,完成连接运算并产生最终结果。产生最终结果。希尔伯特曲线希尔伯特曲线 希尔伯特曲线是一种能填充满一个平面正方形的分形曲线(空间填充曲线),由大卫希尔伯特在1891年提出。由于它能填满平面,它的豪斯多夫维是2。取它填充的正方形的边长为1,第n步的希尔伯特曲线的长度是2n - 2-n。基于传统基于传统 MapReduce 的连接总结的连接总结 总体来说,基于传统总体来说,基于传统MapReduce框框架的连接算法比较简单,不需要对数据架的连接算法比较简单,不需要对数据进行组织。然而,该类算法可能需要多进行组织。然而,该类算法可能需要多个个MapReduce作业,需要传输的中间作业,需要传输的中间结果也较多,影响了连接操作的性能结果也较多,影响了连接操作的性能连接技术简介连接技术简介基于传统基于传统 MapReduce 的连接的连接基于数据索引的连接基于数据索引的连接基于改进基于改进 MapReduce 的连接的连接基于数据索引的连接基于数据索引的连接 该类算法的思想是利用合适的索引对数据进行过滤,以优化查询的性能。 Hadoop+和HadoopDB都可以利用索引提高连接操作的性能。Hadoop+主要利用寄宿索引技术来提高数据查询、连接的性能。寄宿索引将索引加入到Block信息中,并添加了Footer部分用以分隔各个分片Hadoop+利用MapReduce作业来完成索引的构建。在进行数据查询时,split函数从文件末尾根据Footer信息解析出每个分片的位置,itemize函数根据数据查询的范围定位满足条件的数据。在此基础上,Hadoop+还对数据连接、数据布局方面进行了优化。HadoopDB 在Hadoop 和 Hive上进行了修改,完成了由SQL语句生成MapReduce作业和作业中每个任务执行的SQL语句的过程。在查询时,HadoopDB将数据导入到数据库中,利用数据库中的索引及查询优化机制提高查询性能。基于数据索引的连接基于数据索引的连接CoHadoop通过改变Hadoop的副本放置策略来提高 MapReduce 框架处理数据连接性能。CoHadoop 为每个文件增加 Locator 字段来标识其他存储位置,具有相同Locator信息的文件将被尽量组织在相同的数据节点上。在Master节点上维护一个Locator的Hash表,用来存储每个文件的存储位置,这样在进行两表连接运算时,需要连接的两表数据在同一节点上的概率非常高,可以有效减少数据混洗的代价。然而,CoHadoop需要预先得到需要连接运算的各个表大致的相关分布情况,不具有普遍适应性。Tenzing系统可以用来进行数据连接的优化。Tenzing 是一个异构的系统,其后台融合了ColumnIO、BigTable、GFS、MySQL 数据库等系统。Tenzing 可以在这些系统上进行 SQL 操作,并且可以对底层数据进行数据过滤和数据索引,以提高查询效率。多表连接系统Llama是基于垂直分组的。Llama导入数据表时会建立包含所有列并按主键排序的基本垂直分组。在连接操作时,Llama根据需要建立包含部分列并按某一列排序的辅助垂直分组,以及为每个外键建立包含该外键与主键并按外键排序的PF垂直分组。Llama将多表连接查询分解为无数据耦合的多个子查询,在Map阶段利用排序好的垂直分组进行子查询的连接操作,在Reduce阶段对子查询结果进行合并完成连接操作。Llama利用类似于 Map-Join-Reduce框架的技术以减少MapReduce 作业数。连接技术简介连接技术简介基于传统基于传统 MapReduce 的连接的连接基于数据索引的连接基于数据索引的连接基于改进基于改进 MapReduce 的连接的连接基于改进基于改进 MapReduce 的连接的连接 使用传统MapReduce处理连接查询时,经常需要多个MapReduce作业,并且需要产生大量的中间结果。另外,待连接的数据源往往是异构的,在使用MapReduce 进行连接操作时,需要进行同构化的处理。为了解决这些问题,一些学者对MapReduce框架进行了扩展,具有代表性的有Map-Reduce-Merge、Map-Join-Reduce 与 ComMapReduce 框架。Map-Reduce-Merge框架框架welcome to use these PowerPoint templates, New Content design, 10 years experience简介简介 Map-Reduce-Merge框架是在框架是在MapReduce框架上增加框架上增加Merge阶段。当两组阶段。当两组MapReduce任务完成时,协调者节点会利用一个任务完成时,协调者节点会利用一个merge 函数将两组函数将两组 MapReduce 结果进行合并。利用结果进行合并。利用Map-Reduce-Merge 这种新的编程框架,可以方便地实现关系这种新的编程框架,可以方便地实现关系数据库中的连接及笛卡儿积操作。对于数据库中的连接及笛卡儿积操作。对于map、reduce、merge 操作,用户都可以操作,用户都可以实现自定义的逻辑,因此实现自定义的逻辑,因此Map-Reduce-Merge框架比框架比MapReduce框架更具表达力。框架更具表达力。为了进一步提高为了进一步提高Map-Reduce-Merge连接查询效率,可以使用连接查询效率,可以使用MapReduce作业建作业建立索引的方法,可以有效地在立索引的方法,可以有效地在Map-Reduce-Merge框架上进行数据剪枝。针对半连框架上进行数据剪枝。针对半连接中对数据倾斜处理的不足,以及分布式处理方法中数据传输量较大等问题,在接中对数据倾斜处理的不足,以及分布式处理方法中数据传输量较大等问题,在Map-Reduce-Merge架构的基础上,进一步提出了半连接的处理方案,并通过使用架构的基础上,进一步提出了半连接的处理方案,并通过使用分布式直方图等技术来协助处理,从而降低了分布式直方图等技术来协助处理,从而降低了I/O消耗和网络传输负担,提高了框架消耗和网络传输负担,提高了框架的可扩展性和可用性。的可扩展性和可用性。Map-Join-Merge框架框架welcome to use these PowerPoint templates, New Content design, 10 years experience简介简介 Map-Join-Reduce编程框架,对原有的编程框架,对原有的MapReduce框框架进行扩展,来提高处理连接的能力。架进行扩展,来提高处理连接的能力。join函数可以从多个函数可以从多个数据源读取数据来进行连接,连接函数的操作及连接顺序数据源读取数据来进行连接,连接函数的操作及连接顺序都可以由用户指定。另外,在都可以由用户指定。另外,在Map-Join-Reduce框架中,框架中,一个一个map函数的输出可以传给多个函数的输出可以传给多个join函数,这样就可以利函数,这样就可以利用一个用一个MapReduce作业完成多表之间的连接操作。作业完成多表之间的连接操作。ComMapReduce框架框架welcome to use these PowerPoint templates, New Content design, 10 years experience简介简介 在使用在使用MapReduce框架进行连接计算时,混洗中需要传输的数据很多,且部分框架进行连接计算时,混洗中需要传输的数据很多,且部分数据在数据在Reduce阶段并没有被利用。阶段并没有被利用。 ComMapReduce框架是对这种情况的优化。框架是对这种情况的优化。ComMapReduce在在MapReduce框架上加入了一个协调者节点,负责接收、存储框架上加入了一个协调者节点,负责接收、存储与更新少量的全局共享信息,将共享信息发送到各个与更新少量的全局共享信息,将共享信息发送到各个Mapper 上。当每个上。当每个 Map 任任务结束时,务结束时,Map 任务与协调者进行通信,将本地的一些关键信息传输到协调者上,任务与协调者进行通信,将本地的一些关键信息传输到协调者上,协调者利用各个协调者利用各个Map任务发送的信息,更新全局信息,并将结果发送至各个任务发送的信息,更新全局信息,并将结果发送至各个Mapper上,接着每个上,接着每个Mapper 使用接收到的全局信息对该使用接收到的全局信息对该 Mapper 生成的结果进生成的结果进行过滤。在进行连接运算时,行过滤。在进行连接运算时,ComMapReduce框架用框架用Bloom Filter存储全局信息存储全局信息来标识有哪些连接属性的值会参与最终结果的运算。当来标识有哪些连接属性的值会参与最终结果的运算。当Mapper接收到接收到这个全局信息时,就可过滤不会参与最终结果运算的记录,减少混洗的代价。这个全局信息时,就可过滤不会参与最终结果运算的记录,减少混洗的代价。基于改进基于改进 MapReduce 的连接总结的连接总结 与传统与传统MapReduce框架下的连接算法相比,框架下的连接算法相比,基于改进基于改进MapReduce的框架可以减少作业个数的框架可以减少作业个数及中间数据的传输量。然而,这些框架都是通过及中间数据的传输量。然而,这些框架都是通过增加数据处理函数或扩展传统框架的某一部分的增加数据处理函数或扩展传统框架的某一部分的流程来实现的,这将比较简单的流程来实现的,这将比较简单的MapReduce框框架复杂化了,增加了使用框架的难度。架复杂化了,增加了使用框架的难度。Thank you!
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号