當前位置:文書都 >

事務文書 >工作總結 >

大數據知識點總結

大數據知識點總結

導語:原始數據要經過一連串收集、提取、清洗、整理等等的預處理過程,才能形成高質量的數據;按照自己的需要,比如要對數據貼標籤分類,或者預測,或者想要從大量複雜的數據中提取有價值的且不易發現的信息,下面由小編為您整理出的大數據知識點總結內容,一起來看看吧。

大數據知識點總結

1、Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。

用户可以在不瞭解分佈式底層細節的情況下,開發分佈式程序。充分利用集羣的威力進行高速運算和存儲。

2、Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統中的數據。

3、Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數據提供了存儲,則MapReduce為海量的數據提供了計算。

4、Hadoop它主要有以下幾個優點:

(a)高可靠性。Hadoop按位存儲和處理數據的能力值得人們信賴。

(b)高擴展性。Hadoop是在可用的計算機集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以千計的節點中。

(c)高效性。Hadoop能夠在節點之間動態地移動數據,並保證各個節點的動態平衡,因此處理速度非常快。

(d)高容錯性。Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分配。

(e)低成本。與一體機、商用數據倉庫以及QlikView、Yonghong Z-Suite等數據集市相比,hadoop是開源的,項目的軟件成本因此會大大降低。

5、HDFS

對外部客户機而言,HDFS就像一個傳統的分級文件系統。可以創建、刪除、移動或重命名文件,等等。但是 HDFS 的架構是基於一組特定的節點構建的,這是由它自身的特點決定的。這些節點包括 NameNode(僅一個),它在 HDFS 內部提供元數據服務;DataNode,它為 HDFS 提供存儲塊。由於僅存在一個 NameNode,因此這是 HDFS 的一個缺點(單點失敗)。

存儲在 HDFS 中的文件被分成塊,然後將這些塊複製到多個計算機中(DataNode)。這與傳統的 RAID 架構大不相同。塊的大小(通常為 64MB)和複製的塊數量在創建文件時由客户機決定。NameNode 可以控制所有文件操作。HDFS 內部的所有通信都基於標準的 TCP/IP 協議。

6、NameNode

NameNode 是一個通常在 HDFS 實例中的單獨機器上運行的軟件。它負責管理文件系統名稱空間和控制外部客户機的訪問。NameNode 決定是否將文件映射到 DataNode 上的複製塊上。對於最常見的 3 個複製塊,第一個複製塊存儲在同一機架的不同節點上,最後一個複製塊存儲在不同機架的某個節點上。

NameNode本身不可避免地具有SPOF(Single Point Of Failure)單點失效的風險,主備模式並不能解決這個問題,通過Hadoop Non-stop namenode才能實現100% uptime可用時間。

7、DataNode

DataNode 也是一個通常在 HDFS實例中的單獨機器上運行的軟件。Hadoop 集羣包含一個 NameNode 和大量 DataNode。DataNode 通常以機架的形式組織,機架通過一個交換機將所有系統連接起來。Hadoop 的一個假設是:機架內部節點之間的傳輸速度快於機架間節點的傳輸速度。

DataNode 響應來自 HDFS 客户機的讀寫請求。它們還響應來自 NameNode 的創建、刪除和複製塊的命令。NameNode 依賴來自每個 DataNode 的定期心跳(heartbeat)消息。每條消息都包含一個塊報告,NameNode 可以根據這個報告驗證塊映射和其他文件系統元數據。如果 DataNode 不能發送心跳消息,NameNode 將採取修復措施,重新複製在該節點上丟失的塊。

8、集羣系統

Google的數據中心使用廉價的Linux PC機組成集羣,在上面運行各種應用。核心組件是3個:

(a)GFS(Google File System)。一個分佈式文件系統,隱藏下層負載均衡,宂餘複製等細節,對上層程序提供一個統一的文件系統API接口。Google根據自己的需求對它進行了特別優化,包括:超大文件的訪問,讀操作比例遠超過寫操作,PC機極易發生故障造成節點失效等。GFS把文件分成64MB的塊,分佈在集羣的機器上,使用Linux的文件系統存放。同時每塊文件至少有3份以上的宂餘。中心是一個Master節點,根據文件索引,找尋文件塊。詳見Google的工程師發佈的GFS論文

(b)MapReduce。Google發現大多數分佈式運算可以抽象為MapReduce操作。Map是把輸入Input分解成中間的Key/Value對,Reduce把Key/Value合成最終輸出Output。這兩個函數由程序員提供給系統,下層設施把Map和Reduce操作分佈在集羣上運行,並把結果存儲在GFS上。

(c)BigTable。一個大型的分佈式數據庫,這個數據庫不是關係式的數據庫。像它的名字一樣,就是一個巨大的表格,用來存儲結構化的數據。

9、子項目

(a)HDFS: Hadoop分佈式文件系統(Distributed File System)

(b)MapReduce:MapReduce是處理大量半結構化數據集合的編程模型

(c)HBase:類似Google BigTable的分佈式NoSQL列數據庫。

HBase是一個分佈式的,面向列的數據庫。它基於Hadoop之上提供了類似BigTable的功能。

(d)Hive:數據倉庫工具。

Hive是 一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供類似SQL一樣的查詢語言HiveQL來管理這些數據。

(e)Zookeeper:分佈式鎖設施,提供類似Google Chubby的功能。

ZooKeeper是一個針對大型分佈式系統的可靠協調系統,提供包括配置維護,名字服務,分佈式同步和組服務等功能。 Hadoop的管理就是用的ZooKeeper。

(f)Avro:新的數據序列化格式與傳輸工具,將逐步取代Hadoop原有的IPC機制。

(g)Pig: 大數據分析平台,為用户提供多種接口。

Pig是一個基於Hadoop的大數據分析平台,它提供了一個叫PigLatin的高級語言來表達大數據分析程序。

(h)Ambari:Hadoop管理工具,可以快捷的監控、部署、管理集羣。

對Hadoop集羣進行監控和管理的基於Web的系統。目前已經支持HDFS, MapReduce, Hive, HCatalog, HBase, ZooKeeper, Oozie, Pig和Sqoop等組件。

(i)Sqoop:在HADOOP與傳統的數據庫間進行數據的傳遞。

Sqoop是一個Hadoop和關係型數據庫之間的數據轉移工具。可將關係型數據庫中的數據導入到Hadoop的HDFS中,也可將HDFS中的數據導進到關係型數據庫中。

10、Hadoop1.x與Hadoop2.x的區別:

Hadoop2.x中有兩個重要的變更:

(a)HDFS的NameNode可以以集羣的方式部署,增強了NameNode的水平擴展能力和可用性

(b)MapReduce將JobTrack中的資源管理及任務生命週期管理(包括定時觸發及監控),拆分成兩個獨立的組件,並更名為YARN

11、Hadoop2.x解決了Hadoop1.x中的哪些問題

(a)2.x解決了1.x中的namenode單點故障問題

(b)解決了namenode內存壓力過大難以擴展問題

(c)解決了JobTrack單點故障問題

(d)解決了JobTrack訪問壓力過大問題

(e)解決了對MapReduce之外的框架支持問題

12、Zeppelin是一個基於web的可視化的大數據分析工具。主要用來進行交互式的數據分析,它可以跟多種大數據分析組件集成在一起,為這些大數據分析組件提供基於瀏覽器頁面的交互式訪問功能。

13、Zeppelin的主要用途

1、Data Ingestion(數據攝取)

2、Data Discovery(數據發現)

3、Data analytics(數據分析)

4、Data Visualization & Collaboration(數據可視化和協同開發)

14、Zeppelin的主要特點

a、支持多種程式語言

b、Zeppelin支持的語言取決於跟Zeppelin集成的interpreter. 比如Zeppelin跟Hive集成後,就可以支持HQL。

c、Zeppelin默認跟Spark,Spark shell支持的語法在Zeppelin都默認支持,並且ZeppelinNotebook對Scala,Python和Spark SQL還實現了語言高亮。

d、默認支持Spark

e、通過多種圖表的方式,對數據分析提供數據可視化的支持

f、通過簡單的拖拽操作,可以對圖表中展示的數據進行多種方式的聚合操作,如sum, count, average, min, max。

g、支持動態表單,可以在交互中動態修改過濾條件。

h、使用簡單的模板語言來創建form表單, 適用於Markdown, Shell, SparkSQL後台。

i、通過編程的方式創建form表單,適用於Scala,Python等,調用z(ZeppelinContext)來創建和訪問表單。

j、支持協同開發,Zeppelin的notebook,可以被多人同時使用,任何一個人的改動都會被實時的同步到其他協作者的頁面上。

k、Zeppelin notebook上產生的圖表,可以被獨立發佈,通過iframe,可以嵌入到別的網頁上。

l、100%開源的Apache項目。

15、Ambari是一個開源的分佈式Hadoop集羣安裝,部署,監控和管理的平台。

16、Ambari主要由三個部分組成, Ambari Server, Ambari Web和Ambari Agent。

Ambari Server: AmbariServer是整個Ambari的統一入口,只能運行在集羣中的一台機器上。負責管理所有的Ambari Agent。

Ambari Web: AmbariWeb和Ambari Server運行在同一台機器上,作為Ambari Server的一部分功能存在,提供Web和RestAPI的方式訪問AmbariServer。

AmbariAgent:AmbariAgent需要在集羣中的每個節點上都運行一個,負責監控宿主機器的狀態信息,執行從Ambari Server上發送過來的操作指令。

17、Spark是UCBerkeleyAMPlab所開源的類HadoopMapReduce的通用的並行計算框架,Spark基於mapreduce算法實現的分佈式計算,擁有HadoopMapReduce所具有的優點;但不同於MapReduce的是Job中間輸出和結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的map reduce的算法。

18、Spark與Hadoop的對比(Spark的優勢)

1、Spark的中間數據放到內存中,對於迭代運算效率更高

2、Spark比Hadoop更通用

3、Spark提供了統一的編程接口

4、容錯性– 在分佈式數據集計算時通過checkpoint來實現容錯

5、可用性– Spark通過提供豐富的Scala, Java,Python API及交互式Shell來提高可用性

19、Spark的組件

1、Spark Streaming:支持高吞吐量、支持容錯的實時流數據處理

2、Spark SQL, Data frames: 結構化數據查詢

3、MLLib:Spark 生態系統裏用來解決大數據機器學習問題的模塊

4、GraphX:是構建於Spark上的圖計算模型

5、SparkR:是一個R語言包,它提供了輕量級的方式使得可以在R語言中使用 Spark

20、DataFrame是一種以RDD為基礎的分佈式數據集,類似於傳統數據庫中的二維表格。

21、DataFrame與RDD的主要區別在於:

前者帶有schema元信息,即DataFrame所表示的二維表數據集的每一列都帶有名稱和類型。這使得SparkSQL得以洞察更多的結構信息,從而對藏於DataFrame背後的數據源以及作用於DataFrame之上的變換進行了針對性的優化,最終達到大幅提升運行時效率的目標。反觀RDD,由於無從得知所存數據元素的具體內部結構,Spark Core只能在stage層面進行簡單、通用的流水線優化。

22、MLlib是spark的可以擴展的機器學習庫,由以下部分組成:通用的學習算法和工具類,包括分類,迴歸,聚類,協同過濾,降維

23、SparkR實現了分佈式的data frame,支持類似查詢、過濾以及聚合的操作

24、RDD,全稱為Resilient Distributed Datasets,是個容錯的、並行的數據結構,可以讓用户顯式地將數據存儲到磁盤和內存中,並能控制數據的分區。同時,RDD還提供了一組豐富的操作來操作這些數據。

25、RDD的特點:

1. 它是在集羣節點上的不可變的、已分區的集合對象。

2. 通過並行轉換的方式來創建如(map, filter, join, etc )。

3. 失敗自動重建。

4. 可以控制存儲級別(內存、磁盤等)來進行重用。

5. 必須是可序列化的。

6. 是靜態類型的。

26、RDD核心概念

Client:客户端進程,負責提交作業到Master。

Master:Standalone模式中主控節點,負責接收Client提交的作業,管理Worker,並命令Worker啟動分配Driver的資源和啟動Executor的`資源。

Worker:Standalone模式中slave節點上的守護進程,負責管理本節點的資源,定期向Master彙報心跳,接收Master的命令,啟動Driver和Executor。

Driver: 一個Spark作業運行時包括一個Driver進程,也是作業的主進程,負責作業的解析、生成Stage並調度Task到Executor上。包括DAGScheduler,TaskScheduler。

Executor:即真正執行作業的地方,一個集羣一般包含多個Executor,每個Executor接收Driver的命令Launch Task,一個Executor可以執行一到多個Task。

27、RDD常見術語

DAGScheduler: 實現將Spark作業分解成一到多個Stage,每個Stage根據RDD的Partition個數決定Task的個數,然後生成相應的Task set放到TaskScheduler中。

TaskScheduler:實現Task分配到Executor上執行。

Task:運行在Executor上的工作單元

Job:SparkContext提交的具體Action操作,常和Action對應

Stage:每個Job會被拆分很多組任務(task),每組任務被稱為Stage,也稱TaskSet

RDD:Resilient Distributed Datasets的簡稱,彈性分佈式數據集,是Spark最核心的模塊和類

Transformation/Action:SparkAPI的兩種類型;Transformation返回值還是一個RDD,Action返回值不少一個RDD,而是一個Scala的集合;所有的Transformation都是採用的懶策略,如果只是將Transformation提交是不會執行計算的,計算只有在Action被提交時才會被觸發。

DataFrame: 帶有Schema信息的RDD,主要是對結構化數據的高度抽象。

DataSet:結合了DataFrame和RDD兩者的優勢,既允許用户很方便的操作領域對象,又具有SQL執行引擎的高效表現。

28、RDD提供了兩種類型的操作:transformation和action

1,transformation是得到一個新的RDD,方式很多,比如從數據源生成一個新的RDD,從RDD生成一個新的RDD

2,action是得到一個值,或者一個結果(直接將RDD cache到內存中)

3,所有的transformation都是採用的懶策略,就是如果只是將transformation提交是不會執行計算的,計算只有在action被提交的時候才被觸發

29、RDD中關於轉換(transformation)與動作(action)的區別

前者會生成新的RDD,而後者只是將RDD上某項操作的結果返回給程序,而不會生成新的RDD;無論執行了多少次transformation操作,RDD都不會真正執行運算(記錄lineage),只有當action操作被執行時,運算才會觸發。

30、RDD 與 DSM(distributed shared memory)的最大不同是:

RDD只能通過粗粒度轉換來創建,而DSM則允許對每個內存位置上數據的讀和寫。在這種定義下,DSM不僅包括了傳統的共享內存系統,也包括了像提供了共享 DHT(distributed hash table) 的 Piccolo 以及分佈式數據庫等。

31、RDD的優勢

1、高效的容錯機制

2、結點落後問題的緩和 (mitigate straggler) :

3、批量操作:

4、優雅降級 (degrade gracefully)

32、如何獲取RDD

1、從共享的文件系統獲取,(如:HDFS)

2、通過已存在的RDD轉換

3、將已存在scala集合(只要是Seq對象)並行化 ,通過調用SparkContext的parallelize方法實現

4、改變現有RDD的之久性;RDD是懶散,短暫的。

33、RDD都需要包含以下四個部分

a.源數據分割後的數據塊,源代碼中的splits變量

b.關於“血統”的信息,源碼中的dependencies變量

c.一個計算函數(該RDD如何通過父RDD計算得到),源碼中的iterator(split)和compute函數

d.一些關於如何分塊和數據存放位置的元信息,如源碼中的partitioner和preferredLocations

34、在RDD中將依賴劃分成了兩種類型:

窄依賴(narrowdependencies)和寬依賴(widedependencies)。窄依賴是指父RDD的每個分區都只被子RDD的一個分區所使用。相應的,那麼寬依賴就是指父RDD的分區被多個子RDD的分區所依賴。例如,map就是一種窄依賴,而join則會導致寬依賴

依賴關係分類的特性:

第一,窄依賴可以在某個計算節點上直接通過計算父RDD的某塊數據計算得到子RDD對應的某塊數據;

第二,數據丟失時,對於窄依賴只需要重新計算丟失的那一塊數據來恢復;

35、數據分析常見模式:

1、Iterative Algorithms,

2、Relational Queries,

3、MapReduce,

4、Stream Processing,

36、Spark Streaming的基本原理是將輸入數據流以時間片(秒級)為單位進行拆分,然後以類似批處理的方式處理每個時間片數據

37、Spark Streaming優劣

優勢:

1、統一的開發接口

2、吞吐和容錯

3、多種開發範式混用,Streaming + SQL, Streaming +MLlib

4、利用Spark內存pipeline計算

劣勢:

微批處理模式,準實時

38、Flume是一個分佈式的日誌收集系統,具有高可靠、高可用、事務管理、失敗重啟等功能。數據處理速度快,完全可以用於生產環境。

39、Flume的核心是agent。Agent是一個java進程,運行在日誌收集端,通過agent接收日誌,然後暫存起來,再發送到目的地。

Agent裏面包含3個核心組件:source、channel、sink。

Source組件是專用於收集日誌的,可以處理各種類型各種格式的日誌數據,包括avro、thrift、exec、jms、spoolingdirectory、netcat、sequencegenerator、syslog、http、legacy、自定義。source組件把數據收集來以後,臨時存放在channel中。

Channel組件是在agent中專用於臨時存儲數據的,可以存放在memory、jdbc、file、自定義。channel中的數據只有在sink發送成功之後才會被刪除。

Sink組件是用於把數據發送到目的地的組件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定義。

40、ApacheKafka是分佈式發佈-訂閲消息系統。它最初由LinkedIn公司開發,之後成為Apache項目的一部分。Kafka是一種快速、可擴展的、設計內在就是分佈式的,分區的和可複製的提交日誌服務。

41、Apache Kafka與傳統消息系統相比,有以下不同:

1、它被設計為一個分佈式系統,易於向外擴展;

2、它同時為發佈和訂閲提供高吞吐量;

3、它支持多訂閲者,當失敗時能自動平衡消費者;

4、它將消息持久化到磁盤,因此可用於批量消費

42、DataFrame 特性

1、支持從KB到PB級的數據量

2、支持多種數據格式和多種存儲系統

3、通過Catalyst優化器進行先進的優化生成代碼

4、通過Spark無縫集成主流大數據工具與基礎設施

5、API支持Python、Java、Scala和R語言

43、Scala的好處:

1、面向對象和函數式編程理念加入到靜態類型語言中的混合體

2、Scala的兼容性----能夠與Java庫無縫的交互

3、Scala的簡潔性----高效,更不容易犯錯

4、Scala的高級抽象

5、Scala是靜態類型----類型推斷

6、Scala是可擴展的語言

44、搜索引擎是指根據一定的策略、運用特定的計算機程序從互聯網上搜集信息,在對信息進行組織和處理後,為用户提供檢索服務,將用户檢索相關的信息展示給用户的系統。搜索引擎包括全文索引、目錄索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、門户搜索引擎與免費鏈接列表等。

45、Lucene是一個高性能、可伸縮的信息搜索庫,即它不是一個完整的全文檢索引擎,而是一個全檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。

46、Elasticsearch是一個高可擴展的、開源的全文本搜索和分析工具。它允許你以近實時的方式快速存儲、搜索、分析大容量的數據。

Elasticsearch是一個基於ApacheLucene(TM)的開源搜索引擎。無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、性能最好的、功能最全的搜索引擎庫。

47、ElasticSearch 有4種方式來構建數據庫,

最簡單的方法是使用indexAPI,將一個Document發送到特定的index,一般通過curltools實現。

第二第三種方法是通過bulkAPI和UDPbulkAPI。兩者的區別僅在於連接方式。

第四種方式是通過一個插件——river。river運行在ElasticSearch上,並且可以從外部數據庫導入數據到ES中。需要注意的是,數據構建僅在分片上進行,而不能在副本上進行。

48、ELK是一套常用的開源日誌監控和分析系統,包括一個分佈式索引與搜索服務Elasticsearch,一個管理日誌和事件的工具logstash,和一個數據可視化服務Kibana

logstash                負責日誌的收集,處理和儲存

elasticsearch           負責日誌檢索和分析

Kibana                  負責日誌的可視化

49、Hive是什麼?

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供類SQL查詢功能。本質是將HQL轉換為MapReduce程序

50、Hive的設計目標?

1、Hive的設計目標是使Hadoop上的數據操作與傳統SQL相結合,讓熟悉SQL編程開發人員能夠輕鬆向Hadoop平台遷移

2、Hive提供類似SQL的查詢語言HQL,HQL在底層被轉換為相應的MapReduce操作

3、Hive在HDFS上構建數據倉庫來存儲結構化的數據,這些數據一般來源與HDFS上的原始數據,使用Hive可以對這些數據執行查詢、分析等操作。

51、Hive的數據模型

1、Hive數據庫2、內部表3、外部表4、分區5、桶6、Hive的視圖

52、Hive的調用方式

1、Hive Shell 2、Thrift 3、JDBC 4、ODBC

53、Hive的運行機制

1、將sql轉換成抽象語法樹

2、將抽象語法樹轉化成查詢塊

3、將查詢塊轉換成邏輯查詢計劃(操作符樹)

4、將邏輯計劃轉換成物理計劃(MRjobs)

54、Hive的優勢

1、並行計算

2、充分利用集羣的CPU計算資源、存儲資源

3、處理大規模數據集

4、使用SQL,學習成本低

55、Hive應用場景

1、海量數據處理 2、數據挖掘 3、數據分析 4、SQL是商務智能工具的通用語言,Hive有條件和這些BI產品進行集成

56、Hive不適用場景

1、複雜的科學計算 2、不能做到交互式的實時查詢

57、Hive和數據庫(RDBMS)的區別

1、數據存儲位置。Hive是建立在Hadoop之上的,所有的Hive的數據都是存儲在HDFS中的。而數據庫則可以將數據保存在塊設備或本地文件系統中。

2、數據格式。Hive中沒有定義專門的數據格式,由用户指定三個屬性:列分隔符,行分隔符,以及讀取文件數據的方法。數據庫中,存儲引擎定義了自己的數據格式。所有數據都會按照一定的組織存儲。

3、數據更新。Hive的內容是讀多寫少的,因此,不支持對數據的改寫和刪除,數據都在加載的時候中確定好的。數據庫中的數據通常是需要經常進行修改。

4、執行延遲。Hive在查詢數據的時候,需要掃描整個表(或分區),因此延遲較高,只有在處理大數據是才有優勢。數據庫在處理小數據是執行延遲較低。

5、索引。Hive沒有,數據庫有

6、執行。Hive是MapReduce,數據庫是Executor

7、可擴展性。Hive高,數據庫低

8、數據規模。Hive大,數據庫小

58、Hbase 的模塊:

Region

- Region用於存放表中的行數據

- 當一個表格很大的時候,數據會存放並共享在多個Region中

- 每一個Region只存放一個單一的Column Family

Region Server

- 一個Region Server包含多個Region

- 管理表格,以及實現讀寫操作

- Client會直接和Region Server通信獲取數據

Master

- 協調多個Region Server

- 偵測各個Region Server的狀態並平衡它們之間的workload

- 分配Region給Region Serer

- 允許多個Master節點,但是隻有一個服務,其他是backup

- 和Zookeeper一起工作實現HA

Zookeeper

- Hbase中至關重要的模塊

- 確保有一個Master處於Running的狀態

- 註冊Region和Region Server

- 屬於Hbase容錯性的一部分

HDFS

- Hadoop 的分佈式文件系統(Hadoop Distributed File System)

API

- Hbase提供Java的Client API

標籤: 知識點
  • 文章版權屬於文章作者所有,轉載請註明 https://wenshudu.com/shiwuwenshu/gongzuozongjie/mz0wp4.html
專題