第2章 大数据处理架构Hadoop
概述
Hadoop是一個(gè)開(kāi)源的、可運(yùn)行于大規(guī)模集群上的分布式計(jì)算平臺(tái),它實(shí)現(xiàn)了MapReduce計(jì)算模型和分布式文件系統(tǒng)HDFS等功能。
它被公認(rèn)為行業(yè)大數(shù)據(jù)標(biāo)準(zhǔn)開(kāi)源軟件。
名字的是由小孩子取的“一頭吃飽了的大象”。
由來(lái)
1997年年末,Doug Cutting道格·卡丁因工作不穩(wěn)定,自己用Java編寫(xiě)了Lucene;(Doug Cutting是Lucene、Nutch、Hadoop、Avro的作者)Lucene其實(shí)是一個(gè)提供全文文本搜索的函數(shù)庫(kù),它不是一個(gè)應(yīng)用軟件;
2000年3月,Lucene被放到了SourceForge上
2001年10月,Lucene被捐獻(xiàn)給Apache,作為Jakarta的一個(gè)子項(xiàng)目。
2002年8月, Doug Cutting創(chuàng)建了Nutch并托管于SourceForge上;
???????? Nutch項(xiàng)目遇到了棘手的難題,該搜索引擎框架無(wú)法擴(kuò)展到擁有數(shù)十億網(wǎng)頁(yè)的網(wǎng)絡(luò)。
2003年10月,谷歌發(fā)布分布式文件系統(tǒng)GFS(The Google File System)Google論文《Google File System》
2004年,Nutch的開(kāi)源版本基于GFS開(kāi)發(fā)了NDFS(Nutch Distributed File System,NDFS)解決了存儲(chǔ)的問(wèn)題
2004年10月,谷歌發(fā)布《Google MapReduce》大數(shù)據(jù)分布式計(jì)算框架
2005年1月,Nutch加入Apache的孵化器
2005年,Nutch實(shí)現(xiàn)了谷歌的MpaReduce
2005年6月,Nutch孵化結(jié)束成為L(zhǎng)ucene的子項(xiàng)目
2006年2月,Nutch中的NDFS和MapReduce獨(dú)立出來(lái) ,成為Apache Lucene項(xiàng)目的子項(xiàng)目,稱(chēng)為Hadoop;創(chuàng)始人Dong Cutting道格·卡丁加盟雅虎公司。
特性
- 高可靠性
采用冗余數(shù)據(jù)存儲(chǔ)方式,即使一個(gè)副本發(fā)生故障,其他副本也可以保證正常對(duì)外提供服務(wù)。
- 高效性
作為并行分布式計(jì)算平臺(tái),采用分布式存儲(chǔ)和分布式計(jì)算兩大核心技術(shù),能夠高效地處理PB級(jí)數(shù)據(jù)。
- 高擴(kuò)展性
Hadoop的設(shè)計(jì)目標(biāo)是可以高效穩(wěn)定地運(yùn)行在廉價(jià)的計(jì)算機(jī)集群上,可以擴(kuò)展到以千計(jì)的計(jì)算機(jī)節(jié)點(diǎn)上。
- 高容錯(cuò)性
采用冗余數(shù)據(jù)存儲(chǔ)方式,自動(dòng)保存數(shù)據(jù)的多個(gè)副本,并且能夠自動(dòng)將失敗的任務(wù)進(jìn)行重新分配。
- 成本低
Hadoop采用廉價(jià)的計(jì)算機(jī)集群,成本比較低,普通用戶(hù)也很容易用自己的PC搭建Hadoop運(yùn)行環(huán)境。
- 運(yùn)行在Linux操作系統(tǒng)上
Hadoop基于Java開(kāi)發(fā)的,可以較好地運(yùn)行在Linux操作系統(tǒng)上。
- 支持多種編程語(yǔ)言
Hadoop上的應(yīng)用程序也可以使用其他語(yǔ)言編寫(xiě),如C++。
Hadoop的版本
Apache Hadoop版本分為三代,分別是Hadoop 1.0、Hadoop 2.0和Hadoop 3.0。
Hadoop 1.0
Hadoop 1.0包含0.20.x、0.21.x和0.22.x三個(gè)版本,其中,0.20.x最后演化成1.0.x,就了穩(wěn)定版,而0.21.x和0.22.x增加了HDFS HA等重要的新特性。
Hadoop1.0的核心組件(僅指MapReduce和HDFS,不包括Hadoop生態(tài)系統(tǒng)內(nèi)的Pig、Hive、HBase等其他組件)主要存在以下不足:
- 抽象層次低
功能實(shí)現(xiàn)需要手工編寫(xiě)代碼來(lái)完成,有時(shí)只是為了實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能,也需要編寫(xiě)大量的代碼
- 表達(dá)能力有限
MapReduce把復(fù)雜的分布式編程工作高度抽象為兩個(gè)函數(shù),即Map和Reduce,在降低開(kāi)發(fā)人員程序開(kāi)發(fā)復(fù)雜度的同時(shí),也帶來(lái)了表達(dá)能力有限的問(wèn)題,實(shí)際生產(chǎn)環(huán)境的一些應(yīng)用是無(wú)法用簡(jiǎn)單的Map和Reduce來(lái)完成的。
- 開(kāi)發(fā)者自己管理作業(yè)之間的依賴(lài)關(guān)系
一個(gè)作業(yè)(Job)只包含Map和Reduce兩個(gè)階段,通常的實(shí)際應(yīng)用問(wèn)題需要大量的作業(yè)進(jìn)行協(xié)作才能順利解決,這些作業(yè)之間往往存在復(fù)雜的依賴(lài)關(guān)系,但是MapReduce框架本身并沒(méi)有提供相關(guān)的機(jī)制對(duì)這些依賴(lài)關(guān)系進(jìn)行有效管理,只能由開(kāi)發(fā)者自己管理。
- 難以看到程序整體邏輯
用戶(hù)的處理邏輯都隱藏在代碼細(xì)節(jié)中,沒(méi)有更高層次的抽象機(jī)制對(duì)程序整體邏輯進(jìn)行設(shè)計(jì),這就給代碼理解和后期維護(hù)帶來(lái)了障礙。
- 執(zhí)行迭代操作效率低
對(duì)于一些大型的機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘任務(wù),往往需要多輪迭代才能得到結(jié)果。采用MapReduce實(shí)現(xiàn)這些算法時(shí),每次迭代都是一次執(zhí)行Map、Reduce任務(wù)的過(guò)程,這個(gè)過(guò)程的數(shù)據(jù)來(lái)自分布式文件系統(tǒng)HDFS,本次迭代的處理結(jié)果也被存放到HDFS中,繼續(xù)用于下一次迭代過(guò)程。反復(fù)讀寫(xiě)HDFS中的數(shù)據(jù),大大降低了迭代操作的效率。
- 資源浪費(fèi)
在MapReduce框架設(shè)計(jì)中,Reduce任務(wù)需要等待所有Map任務(wù)都完成后才可以開(kāi)始,造成了不必要的資源浪費(fèi)。
- 實(shí)時(shí)性差
只適用于離線(xiàn)批數(shù)據(jù)處理,無(wú)法支持交互式數(shù)據(jù)處理、實(shí)時(shí)數(shù)據(jù)處理。
Hadoop 2.0
Hadoop框架自身的改進(jìn):從1.0到2.0
| 組件 | Hadoop1.0的問(wèn)題 | Hadoop2.0的改進(jìn) |
| HDFS | 單一名稱(chēng)節(jié)點(diǎn),存在單點(diǎn)失效的問(wèn)題 | 設(shè)計(jì)了HDFS HA,提供名稱(chēng)節(jié)點(diǎn)熱備份機(jī)制 |
| 單一命名空間,無(wú)法實(shí)現(xiàn)資源隔離 | 設(shè)計(jì)了HDFS聯(lián)邦,管理多個(gè)命名空間 | |
| MapReduce | 資源管理效率低 | 設(shè)計(jì)了新的資源管理框架YARN |
不斷完善的Hadoop生態(tài)系統(tǒng)
| 組件 | 功能 | 解決Hadoop中存在的問(wèn)題 |
| Pig | 處理大規(guī)模數(shù)據(jù)的腳本語(yǔ)言,用戶(hù)只需要編寫(xiě)幾條簡(jiǎn)單的語(yǔ)句,系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)換為MapReduce作業(yè) | 抽象層次低,需要手工編寫(xiě)大量代碼 |
| Oozie | 工作流和協(xié)作服務(wù)引擎,協(xié)調(diào)Hadoop上運(yùn)行的不同任務(wù) | 沒(méi)有提供作業(yè)依賴(lài)關(guān)系管理機(jī)制,需要用戶(hù)自己處理作業(yè)之間的依賴(lài)關(guān)系 |
| Tez | 支持DAG作業(yè)的計(jì)算框架,對(duì)作業(yè)的操作進(jìn)行重新分解和組合,形成一個(gè)大的DAG作業(yè),減少不必要操作 | 不同的MapReduce任務(wù)之間存在重復(fù)操作,降低了效率 |
| Kafka | 分布式發(fā)布訂閱消息系統(tǒng),一般作為企業(yè)大數(shù)據(jù)分析平臺(tái)的數(shù)據(jù)交換樞紐,不同類(lèi)型的分布式系統(tǒng)可以統(tǒng)一接入Kafka,實(shí)現(xiàn)和Hadoop各個(gè)組件之間的不同類(lèi)型數(shù)據(jù)的實(shí)時(shí)高效交換 | Hadoop生態(tài)系統(tǒng)中各個(gè)組件和其他產(chǎn)品之間缺乏統(tǒng)一的、高效的數(shù)據(jù)交換中介 |
Hadoop 2.0包含0.23.x和2.x兩大版本,它們完全不同于Hadoop 1.0,是一套全新的架構(gòu),均包含HDFS Federationt [?fed?'re??n](聯(lián)邦、聯(lián)合) 和YARN(Yet Another Resource Negotiator)兩個(gè)系統(tǒng)。Hadoop 2.0是基于JDK 1.7開(kāi)發(fā)的,2015年4月JDK 1.7停止更新,Hadoop社區(qū)基于JDK 1.8發(fā)布了新的Hadoop版本,即Hadoop 3.0。
Federation HDFS與HDFS的區(qū)別
HDFS的局限性(HDFS只有一個(gè)active的namenode):
1. 在name中存儲(chǔ)所有的元數(shù)據(jù)(metadata),因此單個(gè)namenode所能存儲(chǔ)的對(duì)象(塊+文件)數(shù)據(jù)受到namenode所在JVM的heap size的限制。
2. 整個(gè)HDFS文件系統(tǒng)的吞吐量受限于單個(gè)namenode的吞吐量
3. 無(wú)法隔離namespace
Federation HDFS 與 HDFS的區(qū)別:
HDFS只有一個(gè)name space, 它使用全部的塊。而Federation HDFS 中有多個(gè)獨(dú)立的namespace,每個(gè)命名空間使用一個(gè)block Pool。
Bolck Pool : 維護(hù)單個(gè)命名空間的所有block。Data node是一個(gè)物理概念,而block pool是一個(gè)重新將block劃分的邏輯概念。同一個(gè)DataNode可以存儲(chǔ) 著屬于多個(gè)blocknode的多個(gè)塊。block允許一個(gè)命名空間在不通知其它命名空間的情況下為一個(gè)新的block創(chuàng)建blockID。同時(shí),一個(gè)namenode失效不會(huì)影響旗下的DataNode為其它namenode服務(wù)。
Federation HDFS 架構(gòu)圖:
?Federation HDFS HA架構(gòu)圖
?其中 NN1 NN3 屬于同一個(gè)namenode, NN2 NN4 屬于同一個(gè)namenode
Hadoop 3.0
Hadoop 3.0 JDK版本的最低依賴(lài)從1.7變成了1.8;Haddop3.0中引入 了一些重要的功能和優(yōu)化,包括HDFS可探險(xiǎn)編碼、多名稱(chēng)節(jié)點(diǎn)支持、任務(wù)級(jí)別的MapReduce本地優(yōu)化、基于cgroup的內(nèi)存和磁盤(pán)IO隔離等。
支持HDFS中的糾刪碼Erasure Encoding;(檢錯(cuò)碼、糾錯(cuò)碼、刪錯(cuò)碼)代替副本機(jī)制
基于HDFS路由器的聯(lián)合
支持多個(gè)NameNode
DataNode內(nèi)部添加了負(fù)載均衡Disk Balancer
Hadoop生態(tài)系統(tǒng)
Hadoop除了核心的HDFS和MapReduce外,Hadoop生態(tài)系統(tǒng)還包括ZooKeeper、HBase、Hive、Pig、Mahout、Flume、Sqoop、Ambari等功能組件。
HDFS
HDFS 是Hadoop的分布式文件系統(tǒng),是Hadoop的核心之一,是針對(duì)谷歌文件系統(tǒng)GFS的開(kāi)源實(shí)現(xiàn)。HDFS具有處理超大數(shù)據(jù)、流式處理、可以運(yùn)行在廉價(jià)的商用服務(wù)器上等優(yōu)點(diǎn)。因?yàn)镠DFS一開(kāi)始就定位運(yùn)行在廉價(jià)的商用服務(wù)器上,因此,在設(shè)計(jì)上把硬件故障作為一種常態(tài)來(lái)考慮,實(shí)現(xiàn)了在部分硬件發(fā)生故障的情況下仍然能保證文件系統(tǒng)的整體可用性和可靠性。HDFS放寬了一部分可移植操作系統(tǒng)接口(Portable Operating System Interface,POSIX)約束,從而實(shí)現(xiàn)以流的形式訪(fǎng)問(wèn)文件系統(tǒng)中的數(shù)據(jù)。HDFS在訪(fǎng)問(wèn)應(yīng)用程序數(shù)據(jù)時(shí),可以具有很高的吞吐率,因此選擇HDFS作為底層數(shù)據(jù)存儲(chǔ)系統(tǒng)是較好的選擇。
HBase
HBase是一個(gè)提供高可靠性、高性能、可伸縮、實(shí)時(shí)讀寫(xiě)、分布式的列式數(shù)據(jù)庫(kù),一般采用HDFS作為其底層數(shù)據(jù)存儲(chǔ)系統(tǒng)。HBase是針對(duì)谷歌的BigTable的開(kāi)源實(shí)現(xiàn),二者都采用了相同的數(shù)據(jù)模型,具有強(qiáng)大的非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)能力。HBase具有良好的橫向擴(kuò)展能力,可以通過(guò)不斷增加廉價(jià)的商用服務(wù)器來(lái)提高存儲(chǔ)能力。
MapReduce
Hadoop MapReduce是谷歌MapReduce的開(kāi)源實(shí)現(xiàn)。MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運(yùn)算,它將復(fù)雜的、運(yùn)行于大規(guī)模集群上的并行計(jì)算過(guò)程高度地抽象為兩個(gè)函數(shù)----Map和Reduce。
MapReduce的核心思想就是“分而治之”,它把輸入的數(shù)據(jù)集切分為若干個(gè)獨(dú)立的數(shù)據(jù)塊,分發(fā)給一個(gè)主節(jié)點(diǎn)管理下的各個(gè)分節(jié)點(diǎn)來(lái)共同并行完成;最后,通過(guò)整合各個(gè)節(jié)點(diǎn)的中間結(jié)果得到最終結(jié)果。
Hive
Hive是一個(gè)基礎(chǔ)Hadoop的數(shù)據(jù)倉(cāng)庫(kù)工具,可以用于對(duì)Hadoop文件中的數(shù)據(jù)集進(jìn)行整理、特殊查詢(xún)和分析存儲(chǔ)。它提供了類(lèi)似關(guān)系數(shù)據(jù)庫(kù)SQL的查詢(xún)語(yǔ)言 ---- HiveSQL,Hive自身可以將HiveSQL語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)運(yùn)行,而不必開(kāi)發(fā)專(zhuān)門(mén)的MapReduce應(yīng)用,因而十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。
Pig
Pig是Hadoop生態(tài)系統(tǒng)的一個(gè)組件,提供了類(lèi)似SQL的Pig Latin(包含F(xiàn)ilter、GroupBy、Join、OrderBy等操作,同時(shí)也支持用戶(hù)自定義函數(shù)),允許用戶(hù)通過(guò)編寫(xiě)簡(jiǎn)單的腳本來(lái)實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)分析,而不需要編寫(xiě)復(fù)雜的MapReduce應(yīng)用程序。Pig會(huì)自動(dòng)把用戶(hù)編寫(xiě)的腳本轉(zhuǎn)換成MapReduce作業(yè)在Hadoop集群上運(yùn)行,而且具備對(duì)生成的MapReduce程序進(jìn)行自動(dòng)優(yōu)化的功能。
Pig可以加載數(shù)據(jù)、表達(dá)轉(zhuǎn)換數(shù)據(jù)以及存儲(chǔ)最終結(jié)果。Pig通常用于數(shù)據(jù)提取、轉(zhuǎn)換和加載(Extraction、Transformation、Loading,ETL)過(guò)程,即來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)被收集過(guò)來(lái)后,使用Pig進(jìn)行統(tǒng)一加工處理,然后加載到數(shù)據(jù)倉(cāng)庫(kù)Hive中,由Hive實(shí)現(xiàn)對(duì)海量數(shù)據(jù)的分析。
Pig并不適合所有的數(shù)據(jù)處理任務(wù),特別是當(dāng)需要查詢(xún)大數(shù)據(jù)集中的一小部分?jǐn)?shù)據(jù)時(shí)。
當(dāng)數(shù)據(jù)查詢(xún)只面向相關(guān)技術(shù)人員,并且屬于即時(shí)性的數(shù)據(jù)處理需求時(shí),比較適合采用Pig編寫(xiě)一個(gè)腳本來(lái)完成快速運(yùn)行處理,從而避免創(chuàng)建表等相關(guān)操作。
Mahout
Mahout是Apache軟件基金會(huì)旗下的一個(gè)開(kāi)源項(xiàng)目,提供一些可擴(kuò)展的機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)典算法實(shí)現(xiàn),旨在幫助開(kāi)發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。
Zookeeper
Zookeeper是針對(duì)谷歌Chubby的一個(gè)開(kāi)源實(shí)現(xiàn),是高效和可靠的協(xié)同工作系統(tǒng),提供分布式鎖之類(lèi)的基本服務(wù)(如統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項(xiàng)的管理等),用于構(gòu)建分布式應(yīng)用,減輕分布式應(yīng)用程序所承擔(dān)的協(xié)調(diào)任務(wù)。
Flume
Flume是Cloudera提供的一個(gè)高可用的、高可靠的、分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng)。Flume支持在日志系統(tǒng)中定制各類(lèi)數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時(shí),Flume提供對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理并寫(xiě)到各種數(shù)據(jù)接收方的能力。
Sqoop
Sqoop是SQL-to-Hadoop的縮寫(xiě),主要用來(lái)在Hadoop和關(guān)系數(shù)據(jù)庫(kù)之間交換數(shù)據(jù),可以改善數(shù)據(jù)的互操作性。通過(guò)Sqoop可以方便地將數(shù)據(jù)從關(guān)系數(shù)據(jù)庫(kù)導(dǎo)入Hadoop,或者將數(shù)據(jù)從Hadoop導(dǎo)出到關(guān)系數(shù)據(jù)庫(kù)。Sqoop主要通過(guò)Java數(shù)據(jù)庫(kù)連接JDBC和關(guān)系數(shù)據(jù)庫(kù)進(jìn)行交互。Sqoop是專(zhuān)門(mén)為大數(shù)據(jù)集設(shè)計(jì)的,支持增量更新。
Ambari
Ambari是一種基于Web的工具,支持Hadoop集群的安裝、部署、配置和管理。
Tez
Tez是Apache開(kāi)源的支持DAG作業(yè)的計(jì)算框架,直接源于MapReduce框架。其核心思想是將Map和Reduce兩個(gè)操作進(jìn)一步進(jìn)行拆分,即將Map拆分成Input、Processor、Sort、Merge和Output等,將Reduce拆分成Input、Shuffle、Sort、Merge、Processor和Output等,經(jīng)過(guò)分解后的這些元操作可以進(jìn)行任意組合產(chǎn)生新的操作,經(jīng)過(guò)一些控制程序組裝后就可形成一個(gè)大的DAG作業(yè)。
通過(guò)DAG作業(yè)的方式運(yùn)行MapReduce作業(yè),提供了程序運(yùn)行的整體處理邏輯,可以去除工作流當(dāng)中多余的Map階段,減少不必要的操作,提升數(shù)據(jù)處理的性能。
在Hadoop 2.0生態(tài)系統(tǒng)中,MapReduce、Hive、Pig等計(jì)算框架都需要最終以MapReduce任務(wù)的形式執(zhí)行數(shù)據(jù)分析,因此Tez框架可以發(fā)揮重要的作用。可以讓Tez框架運(yùn)行在YARN框架之上,然后讓MapReduce、Pig、Hive等計(jì)算框架運(yùn)行在Tez框架之上,從而借助于Tez框架實(shí)現(xiàn)對(duì)Map、Pig和Hive等的性能優(yōu)化,更好地解決現(xiàn)有MapReduce框架在迭代計(jì)算和交互計(jì)算方面存在的問(wèn)題。
Tez在解決Hive、Pig延遲大、性能低等問(wèn)題的思路上,和那些支持實(shí)時(shí)交互式查詢(xún)分析的產(chǎn)品(如Impala、Dremel和Drill等)是不同的。Impala、Dremel和Drill解決問(wèn)題的思路是拋棄MapReduce計(jì)算框架,不再將類(lèi)似SQL語(yǔ)句的HiveSQL或者Pig語(yǔ)句翻譯成MapReduce程序,而是采用與商用 并行關(guān)系數(shù)據(jù)庫(kù)類(lèi)似的分布式查詢(xún)引擎,直接從HDFS或者HBase中用SQL語(yǔ)句查詢(xún)數(shù)據(jù),從而大大降低了延遲。Tez則不同,仍然采用MapReduce計(jì)算框架,但是對(duì)DAG的作業(yè)依賴(lài)關(guān)系進(jìn)行了裁剪,并將多個(gè)小作業(yè)合并成一個(gè)大作業(yè),這樣不僅計(jì)算量減少了,而且讀寫(xiě)HDFS次數(shù)也會(huì)大大減少。
Kafka
Kafka是由LinkedIn開(kāi)發(fā)的一種高吞吐量的分布式發(fā)布/訂閱消息系統(tǒng),用戶(hù)通過(guò)Kafka系統(tǒng)可以發(fā)布大量的消息,同時(shí)能實(shí)時(shí)訂閱消費(fèi)消息。Kafka設(shè)計(jì)的初衷是構(gòu)建一個(gè)可以處理海量日志、用戶(hù)行為和網(wǎng)站運(yùn)行統(tǒng)計(jì)等的數(shù)據(jù)處理框架。Kafka可以同時(shí)提供在線(xiàn)實(shí)時(shí)處理的低延遲和批量離線(xiàn)處理的高吞吐量。
在公司的大數(shù)據(jù)生態(tài)系統(tǒng)中,可以把Kafka作為數(shù)據(jù)交換樞紐,不同類(lèi)型的分布式系統(tǒng)(如關(guān)系數(shù)據(jù)庫(kù)、NoSQL數(shù)據(jù)庫(kù)、流處理系統(tǒng)、批處理系統(tǒng)等)可以統(tǒng)一接入Kafka,從而實(shí)現(xiàn)和Hadoop各個(gè)組件之間的不同類(lèi)型數(shù)據(jù)的實(shí)時(shí)高效交換,較好地滿(mǎn)足各種企業(yè)的應(yīng)用需求。
總結(jié)
以上是生活随笔為你收集整理的第2章 大数据处理架构Hadoop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [vue] vue怎么缓存当前的组件?缓
- 下一篇: [html] iframe框架都有哪些