Hadoop生态系统的详细介绍
hadoop生態(tài)系統(tǒng)的詳細(xì)介紹
簡介
Hadoop是一個(gè)開發(fā)和運(yùn)行處理大規(guī)模數(shù)據(jù)的軟件平臺(tái),是Appach的一個(gè)用java語言實(shí)現(xiàn)開源軟件框架,實(shí)現(xiàn)在大量計(jì)算機(jī)組成的集群中對海量數(shù)據(jù)進(jìn)行分布式計(jì)算。今天我們來詳細(xì)介紹下hadoop的生態(tài)系統(tǒng)。
Hadoop生態(tài)系統(tǒng)概況
Hadoop是一個(gè)能夠?qū)Υ罅繑?shù)據(jù)進(jìn)行分布式處理的軟件框架。具有可靠、高效、可伸縮的特點(diǎn)。
Hadoop的核心是HDFS和MapReduce,hadoop2.0還包括YARN。
下圖為hadoop的生態(tài)系統(tǒng):
HDFS(Hadoop分布式文件系統(tǒng))
源自于Google的GFS論文,發(fā)表于2003年10月,HDFS是GFS克隆版。
是Hadoop體系中數(shù)據(jù)存儲(chǔ)管理的基礎(chǔ)。它是一個(gè)高度容錯(cuò)的系統(tǒng),能檢測和應(yīng)對硬件故障,用于在低成本的通用硬件上運(yùn)行。HDFS簡化了文件的一致性模型,通過流式數(shù)據(jù)訪問,提供高吞吐量應(yīng)用程序數(shù)據(jù)訪問功能,適合帶有大型數(shù)據(jù)集的應(yīng)用程序。
HDFS主要有以下幾個(gè)部分組成:
1.對于大型的集群,namenode的內(nèi)存成為瓶頸,namenode的擴(kuò)展性的問題;
2.namenode的單點(diǎn)故障問題。
3.針對以上的兩個(gè)缺陷,Hadoop2.x以后分別對這兩個(gè)問題進(jìn)行了解決。
4.對于缺陷1)提出了Federation namenode來解決,該方案主要是通過多個(gè)namenode來實(shí)現(xiàn)多個(gè)命名空間來實(shí)現(xiàn)namenode的橫向擴(kuò)張。從而減輕單個(gè)namenode內(nèi)存問題。
5.針對缺陷2),hadoop2.X提出了實(shí)現(xiàn)兩個(gè)namenode實(shí)現(xiàn)熱備HA的方案來解決。其中一個(gè)是處于standby狀態(tài),一個(gè)處于active狀態(tài)。
目前,在硬盤不壞的情況,我們可以通過secondarynamenode來實(shí)現(xiàn)namenode的恢復(fù)。
Mapreduce(分布式計(jì)算框架)
源自于google的MapReduce論文,發(fā)表于2004年12月,Hadoop MapReduce是google MapReduce 克隆版。MapReduce是一種計(jì)算模型,用以進(jìn)行大數(shù)據(jù)量的計(jì)算。其中Map對數(shù)據(jù)集上的獨(dú)立元素進(jìn)行指定的操作,生成鍵-值對形式中間結(jié)果。Reduce則對中間結(jié)果中相同“鍵”的所有“值”進(jìn)行規(guī)約,以得到最終結(jié)果。MapReduce這樣的功能劃分,非常適合在大量計(jì)算機(jī)組成的分布式并行環(huán)境里進(jìn)行數(shù)據(jù)處理。
MapReduce計(jì)算框架發(fā)展到現(xiàn)在有兩個(gè)版本的MapReduce的API,針對MR1主要組件有以下幾個(gè)部分組成:
(1)JobTracker:Master節(jié)點(diǎn),只有一個(gè),主要任務(wù)是資源的分配和作業(yè)的調(diào)度及監(jiān)督管理,管理所有作業(yè),作業(yè)/任務(wù)的監(jiān)控、錯(cuò)誤處理等;將任務(wù)分解成一系列任務(wù),并分派給TaskTracker。
(2)TaskTracker:Slave節(jié)點(diǎn),運(yùn)行Map Task和Reduce Task;并與JobTracker交互,匯報(bào)任務(wù)狀態(tài)。
(3)Map Task:解析每條數(shù)據(jù)記錄,傳遞給用戶編寫的map(),并執(zhí)行,將輸出結(jié)果寫入本地磁盤。
(4)Reducer Task:從Map Task的執(zhí)行結(jié)果中,遠(yuǎn)程讀取輸入數(shù)據(jù),對數(shù)據(jù)進(jìn)行排序,將數(shù)據(jù)按照分組傳遞給用戶編寫的reduce函數(shù)執(zhí)行。
在這個(gè)過程中,有一個(gè)shuffle過程,對于該過程是理解MapReduce計(jì)算框架是關(guān)鍵。該過程包含map函數(shù)輸出結(jié)果到reduce函數(shù)輸入這一個(gè)中間過程中所有的操作,稱之為shuffle過程。在這個(gè)過程中,可以分為map端和reduce端。
Map端:
1) 輸入數(shù)據(jù)進(jìn)行分片之后,分片的大小跟原始的文件大小、文件塊的大小有關(guān)。每一個(gè)分片對應(yīng)的一個(gè)map任務(wù)。
2) map任務(wù)在執(zhí)行的過程中,會(huì)將結(jié)果存放到內(nèi)存當(dāng)中,當(dāng)內(nèi)存占用達(dá)到一定的閾值(這個(gè)閾值是可以設(shè)置的)時(shí),map會(huì)將中間的結(jié)果寫入到本地磁盤上,形成臨時(shí)文件這個(gè)過程叫做溢寫。
3) map在溢寫的過程中,會(huì)根據(jù)指定reduce任務(wù)個(gè)數(shù)分別寫到對應(yīng)的分區(qū)當(dāng)中,這就是partition過程。每一個(gè)分區(qū)對應(yīng)的是一個(gè)reduce任務(wù)。并且在寫的過程中,進(jìn)行相應(yīng)的排序。在溢寫的過程中還可以設(shè)置conbiner過程,該過程跟reduce產(chǎn)生的結(jié)果應(yīng)該是一致的,因此該過程應(yīng)用存在一定的限制,需要慎用。
4) 每一個(gè)map端最后都只存在一個(gè)臨時(shí)文件作為reduce的輸入,因此會(huì)對中間溢寫到磁盤的多個(gè)臨時(shí)文件進(jìn)行合并Merge操作。最后形成一個(gè)內(nèi)部分區(qū)的一個(gè)臨時(shí)文件。
Reduce端:
1) 首先要實(shí)現(xiàn)數(shù)據(jù)本地化,需要將遠(yuǎn)程節(jié)點(diǎn)上的map輸出復(fù)制到本地。
2) Merge過程,這個(gè)合并過程主要是對不同的節(jié)點(diǎn)上的map輸出結(jié)果進(jìn)行合并。
3) 不斷的復(fù)制和合并之后,最終形成一個(gè)輸入文件。Reduce將最終的計(jì)算結(jié)果存放在HDFS上。
針對MR2是新一代的MR的API。其主要是運(yùn)行在Yarn的資源管理框架上。
Yarn(資源管理框架)
YARN (Yet Another Resource Negotiator,另一種資源協(xié)調(diào)者)是一種新的 Hadoop 資源管理器,它是一個(gè)通用資源管理系統(tǒng),可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了巨大好處。
YARN的基本思想是將JobTracker的兩個(gè)主要功能(資源管理和作業(yè)調(diào)度/監(jiān)控)分離,主要方法是創(chuàng)建一個(gè)全局的ResourceManager(RM)和若干個(gè)針對應(yīng)用程序的ApplicationMaster(AM)。這里的應(yīng)用程序是指傳統(tǒng)的MapReduce作業(yè)或作業(yè)的DAG(有向無環(huán)圖)。
該框架是hadoop2.x以后對hadoop1.x之前JobTracker和TaskTracker模型的優(yōu)化,而產(chǎn)生出來的,將JobTracker的資源分配和作業(yè)調(diào)度及監(jiān)督分開。該框架主要有ResourceManager,Applicationmatser,nodemanager。其主要工作過程如下:
ResourceManager主要負(fù)責(zé)所有的應(yīng)用程序的資源分配,
ApplicationMaster主要負(fù)責(zé)每個(gè)作業(yè)的任務(wù)調(diào)度,也就是說每一個(gè)作業(yè)對應(yīng)一個(gè)ApplicationMaster。
Nodemanager是接收Resourcemanager 和ApplicationMaster的命令來實(shí)現(xiàn)資源的分配執(zhí)行體。
ResourceManager在接收到client的作業(yè)提交請求之后,會(huì)分配一個(gè)Container,這里需要說明一下的是Resoucemanager分配資源是以Container為單位分配的。第一個(gè)被分配的Container會(huì)啟動(dòng)Applicationmaster,它主要負(fù)責(zé)作業(yè)的調(diào)度。Applicationmanager啟動(dòng)之后則會(huì)直接跟NodeManager通信。
在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調(diào)度器負(fù)責(zé)資源的分配,而NodeManager則負(fù)責(zé)資源的供給和隔離。ResourceManager將某個(gè)NodeManager上資源分配給任務(wù)(這就是所謂的“資源調(diào)度”)后,NodeManager需按照要求為任務(wù)提供相應(yīng)的資源,甚至保證這些資源應(yīng)具有獨(dú)占性,為任務(wù)運(yùn)行提供基礎(chǔ)的保證,這就是所謂的資源隔離。
在Yarn平臺(tái)上可以運(yùn)行多個(gè)計(jì)算框架,如:MR,Tez,Storm,Spark等計(jì)算,框架。
Sqoop(數(shù)據(jù)同步工具)
Sqoop是SQL-to-Hadoop的縮寫,主要用于傳統(tǒng)數(shù)據(jù)庫和Hadoop之間傳輸數(shù)據(jù)。數(shù)據(jù)的導(dǎo)入和導(dǎo)出本質(zhì)上是Mapreduce程序,充分利用了MR的并行化和容錯(cuò)性。其中主要利用的是MP中的Map任務(wù)來實(shí)現(xiàn)并行導(dǎo)入,導(dǎo)出。Sqoop發(fā)展到現(xiàn)在已經(jīng)出現(xiàn)了兩個(gè)版本,一個(gè)是sqoop1.x.x系列,一個(gè)是sqoop1.99.X系列。對于sqoop1系列中,主要是通過命令行的方式來操作。
sqoop1 import原理:從傳統(tǒng)數(shù)據(jù)庫獲取元數(shù)據(jù)信息(schema、table、field、field type),把導(dǎo)入功能轉(zhuǎn)換為只有Map的Mapreduce作業(yè),在mapreduce中有很多map,每個(gè)map讀一片數(shù)據(jù),進(jìn)而并行的完成數(shù)據(jù)的拷貝。
sqoop1 export原理:獲取導(dǎo)出表的schema、meta信息,和Hadoop中的字段match;多個(gè)map only作業(yè)同時(shí)運(yùn)行,完成hdfs中數(shù)據(jù)導(dǎo)出到關(guān)系型數(shù)據(jù)庫中。
Sqoop1.99.x是屬于sqoop2的產(chǎn)品,該款產(chǎn)品目前功能還不是很完善,處于一個(gè)測試階段,一般并不會(huì)應(yīng)用于商業(yè)化產(chǎn)品當(dāng)中。
Mahout(數(shù)據(jù)挖掘算法庫)
Mahout起源于2008年,最初是Apache Lucent的子項(xiàng)目,它在極短的時(shí)間內(nèi)取得了長足的發(fā)展,現(xiàn)在是Apache的頂級項(xiàng)目。相對于傳統(tǒng)的MapReduce編程方式來實(shí)現(xiàn)機(jī)器學(xué)習(xí)的算法時(shí),往往需要話費(fèi)大量的開發(fā)時(shí)間,并且周期較長,而Mahout的主要目標(biāo)是創(chuàng)建一些可擴(kuò)展的機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)典算法的實(shí)現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。
Mahout現(xiàn)在已經(jīng)包含了聚類、分類、推薦引擎(協(xié)同過濾)和頻繁集挖掘等廣泛使用的數(shù)據(jù)挖掘方法。除了算法,Mahout還包含數(shù)據(jù)的輸入/輸出工具、與其他存儲(chǔ)系統(tǒng)(如數(shù)據(jù)庫、MongoDB 或Cassandra)集成等數(shù)據(jù)挖掘支持架構(gòu)。
mahout的各個(gè)組件下面都會(huì)生成相應(yīng)的jar包。此時(shí)我們需要明白一個(gè)問題:到底如何使用mahout呢?
實(shí)際上,mahout只是一個(gè)機(jī)器學(xué)習(xí)的算法庫,在這個(gè)庫當(dāng)中是想了相應(yīng)的機(jī)器學(xué)習(xí)的算法,如:推薦系統(tǒng)(包括基于用戶和基于物品的推薦),聚類和分類算法。并且這些算法有些實(shí)現(xiàn)了MapReduce,spark從而可以在hadoop平臺(tái)上運(yùn)行,在實(shí)際的開發(fā)過程中,只需要將相應(yīng)的jar包即可。
Hbase(分布式列存數(shù)據(jù)庫)
源自Google的Bigtable論文,發(fā)表于2006年11月,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫是對面向行的數(shù)據(jù)庫。HBase是Google Bigtable克隆版,HBase是一個(gè)針對結(jié)構(gòu)化數(shù)據(jù)的可伸縮、高可靠、高性能、分布式和面向列的動(dòng)態(tài)模式數(shù)據(jù)庫。和傳統(tǒng)關(guān)系數(shù)據(jù)庫不同,HBase采用了BigTable的數(shù)據(jù)模型:增強(qiáng)的稀疏排序映射表(Key/Value),其中,鍵由行關(guān)鍵字、列關(guān)鍵字和時(shí)間戳構(gòu)成。HBase提供了對大規(guī)模數(shù)據(jù)的隨機(jī)、實(shí)時(shí)讀寫訪問,同時(shí),HBase中保存的數(shù)據(jù)可以使用MapReduce來處理,它將數(shù)據(jù)存儲(chǔ)和并行計(jì)算完美地結(jié)合在一起。
Hbase表的特點(diǎn)
-
大:一個(gè)表可以有數(shù)十億行,上百萬列;
-
無模式:每行都有一個(gè)可排序的主鍵和任意多的列,列可以根據(jù)需要?jiǎng)討B(tài)的增加,同一張表中不同的行可以有截然不同的列;
-
面向列:面向列(族)的存儲(chǔ)和權(quán)限控制,列(族)獨(dú)立檢索; 稀疏:空(null)列并不占用存儲(chǔ)空間,表可以設(shè)計(jì)的非常稀疏;
-
數(shù)據(jù)多版本:每個(gè)單元中的數(shù)據(jù)可以有多個(gè)版本,默認(rèn)情況下版本號自動(dòng)分配,是單元格插入時(shí)的時(shí)間戳;
-
數(shù)據(jù)類型單一:Hbase中的數(shù)據(jù)都是字符串,沒有類型。 Hbase物理模型
每個(gè)column family存儲(chǔ)在HDFS上的一個(gè)單獨(dú)文件中,空值不會(huì)被保存。
Key 和 Version number在每個(gè) column family中均有一份;
HBase 為每個(gè)值維護(hù)了多級索引,即:”key, column family, column name, timestamp”,其物理存儲(chǔ):
??1.Table中所有行都按照row key的字典序排列;
??2. Table在行的方向上分割為多個(gè)Region;
??3.Region按大小分割的,每個(gè)表開始只有一個(gè)region,隨著數(shù)據(jù)增多,region不斷增大,當(dāng)增大到一個(gè)閥值的時(shí)候,region就會(huì)等分會(huì)兩個(gè)新的region,之后會(huì)有越來越多的region;
??4.Region是Hbase中分布式存儲(chǔ)和負(fù)載均衡的最小單元,不同Region分布到不同RegionServer上。、
??5.Region雖然是分布式存儲(chǔ)的最小單元,但并不是存儲(chǔ)的最小單元。Region由一個(gè)或者多個(gè)Store組成,每個(gè)store保存一個(gè)columns family;每個(gè)Strore又由一個(gè)memStore和0至多個(gè)StoreFile組成,StoreFile包含HFile;memStore存儲(chǔ)在內(nèi)存中,StoreFile存儲(chǔ)在HDFS上。
Zookeeper(分布式協(xié)作服務(wù))
源自Google的Chubby論文,發(fā)表于2006年11月,Zookeeper是Chubby克隆版,主要解決分布式環(huán)境下的數(shù)據(jù)管理問題:統(tǒng)一命名,狀態(tài)同步,集群管理,配置同步等。
Zookeeper的主要實(shí)現(xiàn)兩步:
- 選舉Leader
- 同步數(shù)據(jù)。這個(gè)組件在實(shí)現(xiàn)namenode的HA高可用性的時(shí)候,需要用到。
Pig(基于Hadoop的數(shù)據(jù)流系統(tǒng))
由yahoo!開源,設(shè)計(jì)動(dòng)機(jī)是提供一種基于MapReduce的ad-hoc(計(jì)算在query時(shí)發(fā)生)數(shù)據(jù)分析工具
定義了一種數(shù)據(jù)流語言—Pig Latin,將腳本轉(zhuǎn)換為MapReduce任務(wù)在Hadoop上執(zhí)行。通常用于進(jìn)行離線分析。
Hive(基于Hadoop的數(shù)據(jù)倉庫)
由facebook開源,最初用于解決海量結(jié)構(gòu)化的日志數(shù)據(jù)統(tǒng)計(jì)問題。
Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉(zhuǎn)化為MapReduce任務(wù)在Hadoop上執(zhí)行。通常用于離線分析。
Flume(日志收集工具)
Cloudera開源的日志收集系統(tǒng),具有分布式、高可靠、高容錯(cuò)、易于定制和擴(kuò)展的特點(diǎn)。
它將數(shù)據(jù)從產(chǎn)生、傳輸、處理并最終寫入目標(biāo)的路徑的過程抽象為數(shù)據(jù)流,在具體的數(shù)據(jù)流中,數(shù)據(jù)源支持在Flume中定制數(shù)據(jù)發(fā)送方,從而支持收集各種不同協(xié)議數(shù)據(jù)。同時(shí),Flume數(shù)據(jù)流提供對日志數(shù)據(jù)進(jìn)行簡單處理的能力,如過濾、格式轉(zhuǎn)換等。此外,Flume還具有能夠?qū)⑷罩緦懲鞣N數(shù)據(jù)目標(biāo)(可定制)的能力。總的來說,Flume是一個(gè)可擴(kuò)展、適合復(fù)雜環(huán)境的海量日志收集系統(tǒng)。
Oozie
在Hadoop中執(zhí)行的任務(wù)有時(shí)候需要把多個(gè)Map/Reduce作業(yè)連接到一起,這樣才能夠達(dá)到目的。在Hadoop生態(tài)圈中,有一種相對比較新的組件叫做Oozie,它讓我們可以把多個(gè)Map/Reduce作業(yè)組合到一個(gè)邏輯工作單元中,從而完成更大型的任務(wù)。
Oozie是一種Java Web應(yīng)用程序,它運(yùn)行在Java servlet容器——即Tomcat——中,并使用數(shù)據(jù)庫來存儲(chǔ)以下內(nèi)容:
1、工作流定義
2、當(dāng)前運(yùn)行的工作流實(shí)例,包括實(shí)例的狀態(tài)和變量
Oozie工作流是放置在控制依賴DAG(有向無環(huán)圖 Direct Acyclic Graph)中的一組動(dòng)作(例如,Hadoop的Map/Reduce作業(yè)、Pig作業(yè)等),其中指定了動(dòng)作執(zhí)行的順序。我們會(huì)使用hPDL(一種XML流程定義語言)來描述這個(gè)圖。
Spark
Spark 是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎。Spark是UC Berkeley AMP lab (加州大學(xué)伯克利分校的AMP實(shí)驗(yàn)室)所開源的類Hadoop MapReduce的通用并行框架,Spark,擁有Hadoop MapReduce所具有的優(yōu)點(diǎn);但不同于MapReduce的是——Job中間輸出結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)等需要迭代的MapReduce的算法。
Spark 是一種與 Hadoop 相似的開源集群計(jì)算環(huán)境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負(fù)載方面表現(xiàn)得更加優(yōu)越,換句話說,Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負(fù)載。
Spark 是在 Scala 語言中實(shí)現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數(shù)據(jù)集。
盡管創(chuàng)建 Spark 是為了支持分布式數(shù)據(jù)集上的迭代作業(yè),但是實(shí)際上它是對 Hadoop 的補(bǔ)充,可以在 Hadoop 文件系統(tǒng)中并行運(yùn)行。通過名為 Mesos 的第三方集群框架可以支持此行為。Spark 由加州大學(xué)伯克利分校 AMP 實(shí)驗(yàn)室 (Algorithms, Machines, and People Lab) 開發(fā),可用來構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。
Tez
Tez是一個(gè)針對Hadoop數(shù)據(jù)處理應(yīng)用程序的新分布式執(zhí)行框架。Tez是Apache最新的支持DAG作業(yè)的開源計(jì)算框架,它可以將多個(gè)有依賴的作業(yè)轉(zhuǎn)換為一個(gè)作業(yè)從而大幅提升DAG作業(yè)的性能。Tez并不直接面向最終用戶——事實(shí)上它允許開發(fā)者為最終用戶構(gòu)建性能更快、擴(kuò)展性更好的應(yīng)用程序。Hadoop傳統(tǒng)上是一個(gè)大量數(shù)據(jù)批處理平臺(tái)。但是,有很多用例需要近乎實(shí)時(shí)的查詢處理性能。還有一些工作則不太適合MapReduce,例如機(jī)器學(xué)習(xí)。Tez的目的就是幫助Hadoop處理這些用例場景。
Tez項(xiàng)目的目標(biāo)是支持高度定制化,這樣它就能夠滿足各種用例的需要,讓人們不必借助其他的外部方式就能完成自己的工作,如果 Hive和 Pig 這樣的項(xiàng)目使用Tez而不是MapReduce作為其數(shù)據(jù)處理的骨干,那么將會(huì)顯著提升它們的響應(yīng)時(shí)間。Tez構(gòu)建在YARN之上,后者是Hadoop所使用的新資源管理框架。
Storm
Storm為分布式實(shí)時(shí)計(jì)算提供了一組通用原語,可被用于“流處理”之中,實(shí)時(shí)處理消息并更新數(shù)據(jù)庫。這是管理隊(duì)列及工作者集群的另一種方式。 Storm也可被用于“連續(xù)計(jì)算”(continuous computation),對數(shù)據(jù)流做連續(xù)查詢,在計(jì)算時(shí)就將結(jié)果以流的形式輸出給用戶。它還可被用于“分布式RPC”,以并行的方式運(yùn)行昂貴的運(yùn)算。
Storm可以方便地在一個(gè)計(jì)算機(jī)集群中編寫與擴(kuò)展復(fù)雜的實(shí)時(shí)計(jì)算,Storm用于實(shí)時(shí)處理,就好比 Hadoop 用于批處理。Storm保證每個(gè)消息都會(huì)得到處理,而且它很快——在一個(gè)小集群中,每秒可以處理數(shù)以百萬計(jì)的消息。更棒的是你可以使用任意編程語言來做開發(fā)。
總結(jié)
以上是生活随笔為你收集整理的Hadoop生态系统的详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 焊门员稳了!3000多位米粉还不知道Re
- 下一篇: 修改C盘里windows\system3