Hadoop分布式文件系統(tǒng)詳解_第1頁
Hadoop分布式文件系統(tǒng)詳解_第2頁
Hadoop分布式文件系統(tǒng)詳解_第3頁
Hadoop分布式文件系統(tǒng)詳解_第4頁
Hadoop分布式文件系統(tǒng)詳解_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Hadoop分布式文件系統(tǒng)詳解1.Hadoop架構(gòu)Hadoop由三個(gè)模塊組成:分布式存儲HDFS、分布式計(jì)算MapReduce、資源調(diào)度引擎Yarn2.HDFS體系架構(gòu)2.1NameNodeNameNode負(fù)責(zé):文件元數(shù)據(jù)信息的操作以及處理客戶端的請求

NameNode管理:HDFS文件系統(tǒng)的命名空間NameSpace。

NameNode維護(hù):文件系統(tǒng)樹(FileSystem)以及文件樹中所有的文件和文件夾的元數(shù)據(jù)信息(matedata)維護(hù)文件到塊的對應(yīng)關(guān)系和塊到節(jié)點(diǎn)的對應(yīng)關(guān)系

NameNode文件:namespace鏡像文件(fsimage),操作日志文件(editlog)這些信息被Cache在RAM中,當(dāng)然這兩個(gè)文件也會(huì)被持久化存儲在本地硬盤。

NameNode記錄:每個(gè)文件中各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)的位置信息。但它并不永久保存塊的位置信息,因?yàn)檫@些信息在系統(tǒng)啟動(dòng)時(shí)由數(shù)據(jù)節(jié)點(diǎn)重建。從數(shù)據(jù)節(jié)點(diǎn)重建:在nameNode啟動(dòng)時(shí),DataNode向NameNode進(jìn)行注冊時(shí)發(fā)送給NameNode2.1.1元數(shù)據(jù)信息文件名,文件目錄結(jié)構(gòu),文件屬性(生成時(shí)間,副本數(shù),權(quán)限)每個(gè)文件的塊列表。

以及列表中的塊與塊所在的DataNode之間的地址映射關(guān)系在內(nèi)存中加載文件系統(tǒng)中每個(gè)文件和每個(gè)數(shù)據(jù)塊的引用關(guān)系(文件、block、datanode之間的映射信息)數(shù)據(jù)會(huì)定期保存到本地磁盤,但不保存block的位置信息而是由DataNode注冊時(shí)上報(bào)和在運(yùn)行時(shí)維護(hù)2.1.2NameNode文件操作NameNode負(fù)責(zé)文件元數(shù)據(jù)的操作,DataNode負(fù)責(zé)處理文件內(nèi)容的讀寫請求,數(shù)據(jù)流不經(jīng)過NameNode,會(huì)詢問它跟那個(gè)DataNode聯(lián)系2.1.3NameNode副本文件數(shù)據(jù)塊到底存放到哪些DataNode上,是由NameNode決定的,NN根據(jù)全局情況做出放置副本的決定

讀取文件的時(shí)候,NN盡量讓client讀取離它最近的datanode上的副本,降低帶寬消耗和讀取時(shí)延2.1.4NameNode心跳機(jī)制全權(quán)管理數(shù)據(jù)塊的復(fù)制,周期性的接受心跳和塊的狀態(tài)報(bào)告信息(包含該DataNode上所有數(shù)據(jù)塊的列表)

若接受到心跳信息,NN認(rèn)為DN工作正常,如果在10分鐘后還接受到不到DN的心跳,那么NN認(rèn)為DN已經(jīng)宕機(jī)這時(shí)候NN準(zhǔn)備要把DN上的數(shù)據(jù)塊進(jìn)行重新的復(fù)制。塊的狀態(tài)報(bào)告包含了一個(gè)DN上所有數(shù)據(jù)塊的列表,blocksreport每個(gè)1小時(shí)發(fā)送一次2.1.5NameNode容錯(cuò)機(jī)制沒有Namenode,HDFS就不能工作。事實(shí)上,如果運(yùn)行namenode的機(jī)器壞掉的話,系統(tǒng)中的文件將會(huì)完全丟失,因?yàn)闆]有其他方法能夠?qū)⑽挥诓煌琩atanode上的文件塊(blocks)重建文件。因此,namenode的容錯(cuò)機(jī)制非常重要,Hadoop提供了兩種機(jī)制。

第一種方式是將持久化存儲在本地硬盤的文件系統(tǒng)元數(shù)據(jù)備份。Hadoop可以通過配置來讓Namenode將他的持久化狀態(tài)文件寫到不同的文件系統(tǒng)中。這種寫操作是同步并且是原子化的。比較常見的配置是在將持久化狀態(tài)寫到本地硬盤的同時(shí),也寫入到一個(gè)遠(yuǎn)程掛載的網(wǎng)絡(luò)文件系統(tǒng)(NFS)。

第二種方式是運(yùn)行一個(gè)輔助的Namenode(SecondaryNamenode)。事實(shí)上SecondaryNamenode并不能被用作Namenode它的主要作用是定期的將Namespace鏡像與操作日志文件(editlog)合并,以防止操作日志文件(editlog)變得過大。通常,SecondaryNamenode運(yùn)行在一個(gè)單獨(dú)的物理機(jī)上,因?yàn)楹喜⒉僮餍枰加么罅康腃PU時(shí)間以及和Namenode相當(dāng)?shù)膬?nèi)存。輔助Namenode保存著合并后的Namespace鏡像的一個(gè)備份,萬一哪天Namenode宕機(jī)了,這個(gè)備份就可以用上了。

但是輔助Namenode總是落后于主Namenode,所以在Namenode宕機(jī)時(shí),數(shù)據(jù)丟失是不可避免的。在這種情況下,一般的,要結(jié)合第一種方式中提到的遠(yuǎn)程掛載的網(wǎng)絡(luò)文件系統(tǒng)(NFS)中的Namenode的元數(shù)據(jù)文件來使用,把NFS中的Namenode元數(shù)據(jù)文件,拷貝到輔助Namenode,并把輔助Namenode作為主Namenode來運(yùn)行。2.1.6NameNode物理結(jié)構(gòu)2.1.7NameNode文件結(jié)構(gòu)NameNode的存儲目錄2.2DataNode一個(gè)集群可能包含上千個(gè)DataNode節(jié)點(diǎn),這些DataNode定時(shí)和NameNode進(jìn)行通信,接受NameNode的指令為了減輕NameNode的負(fù)擔(dān),NameNode上并不永久保存哪個(gè)DataNode上有哪些數(shù)據(jù)塊的信息,而是通過DataNode啟動(dòng)時(shí)的上報(bào)來更新NameNode上的映射表。

根據(jù)客戶端或者是namenode的調(diào)度存儲和檢索數(shù)據(jù),并且定期向namenode發(fā)送所存儲的塊(block)的列表,數(shù)據(jù)塊在DataNode進(jìn)程所在的節(jié)點(diǎn)上以文件的形式存儲在本地磁盤上,一個(gè)是數(shù)據(jù)本身,一個(gè)是元數(shù)據(jù)(數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳),維護(hù)blockid與DataNode之間的映射信息(元信息)2.2.1DataNode工作機(jī)制datanode啟動(dòng)時(shí),每個(gè)datanode對本地磁盤進(jìn)行掃描,將本datanode上保存的block信息匯報(bào)給namenodenamenode在接收到的block信息以及該block所在的datanode信息等保存在內(nèi)存中。

DataNode啟動(dòng)后向NameNode注冊,通過后周期性(1小時(shí))的向NameNode上報(bào)所有的塊信息.

(1)通過向NameNode發(fā)送心跳保持與其聯(lián)系(3秒一次),心跳返回結(jié)果帶有NN的命令,返回的命令為:如塊的復(fù)制,刪除某個(gè)數(shù)據(jù)塊……

(2)如果10分鐘沒有收到DataNode的心跳,則認(rèn)為其已經(jīng)lost,并copy其上的block到其它DataNode

(3)DN在其文件創(chuàng)建后三周進(jìn)行驗(yàn)證其checkSum的值是否和文件創(chuàng)建時(shí)的checkSum值一致2.2.2DataNode讀寫操作集群中的每個(gè)服務(wù)器都運(yùn)行一個(gè)DataNode后臺程序,這個(gè)后臺程序負(fù)責(zé)把HDFS數(shù)據(jù)塊讀寫到本地的文件系統(tǒng)。當(dāng)需要通過客戶端讀/寫某個(gè)數(shù)據(jù)時(shí),先由NameNode告訴客戶端去哪個(gè)DataNode進(jìn)行具體的讀/寫操作然后,客戶端直接與這個(gè)DataNode服務(wù)器上的后臺程序進(jìn)行通信,并且對相關(guān)的數(shù)據(jù)塊進(jìn)行讀/寫操作。2.3SecondaryNameNodeSecondaryNameNode是HDFS架構(gòu)中的一個(gè)組成部分,但是經(jīng)常由于名字而被人誤解它真正的用途,其實(shí)它真正的用途,是用來保存namenode中對HDFSmetadata的信息的備份,并減少namenode重啟的時(shí)間。對于\o"hadoop"hadoop進(jìn)程中,要配置好并正確的使用snn,還是需要做一些工作的。hadoop的默認(rèn)配置中讓snn進(jìn)程默認(rèn)運(yùn)行在了namenode的那臺機(jī)器上,但是這樣的話,如果這臺機(jī)器出錯(cuò),宕機(jī),對恢復(fù)HDFS文件系統(tǒng)是很大的災(zāi)難,更好的方式是:將snn的進(jìn)程配置在另外一臺機(jī)器上運(yùn)行。

在hadoop中,namenode負(fù)責(zé)對HDFS的metadata的持久化存儲,并且處理來自客戶端的對HDFS的各種操作的交互反饋。為了保證交互速度,HDFS文件系統(tǒng)的metadata是被load到namenode機(jī)器的內(nèi)存中的,并且會(huì)將內(nèi)存中的這些數(shù)據(jù)保存到磁盤進(jìn)行持久化存儲。為了保證這個(gè)持久化過程不會(huì)成為HDFS操作的瓶頸,hadoop采取的方式是:沒有對任何一次的當(dāng)前文件系統(tǒng)的snapshot進(jìn)行持久化,對HDFS最近一段時(shí)間的操作list會(huì)被保存到namenode中的一個(gè)叫Editlog的文件中去。當(dāng)重啟namenode時(shí),除了loadfslmage意外,還會(huì)對這個(gè)Editlog文件中記錄的HDFS操作進(jìn)行replay,以恢復(fù)HDFS重啟之前的最終狀態(tài)。

而SecondaryNameNode,會(huì)周期性的將Editlog中記錄的對HDFS的操作合并到一個(gè)checkpoint中,然后清空Editlog。所以namenode的重啟就會(huì)Load最新的一個(gè)checkpoint,并重現(xiàn)Editlog中記錄的hdfs操作,由于Editlog中記錄的是從上一次checkpoint以后到現(xiàn)在的操作列表,所以就會(huì)比較小。如果沒有SecondaryNameNode的這個(gè)周期性的合并過程,那么當(dāng)每次重啟namenode的時(shí)候,就會(huì)花費(fèi)很長的時(shí)間。而這樣周期性的合并就能減少重啟的時(shí)間。同時(shí)也能保證HDFS系統(tǒng)的完整性。

這就是SecondaryNameNode所做的事情。所以snn并不能分擔(dān)namenode上對HDFS交互性操作的壓力。盡管如此,當(dāng)namenode機(jī)器宕機(jī)或者namenode進(jìn)程出問題時(shí),namenode的daemon進(jìn)程可以通過人工的方式從snn上拷貝一份metadata來恢復(fù)HDFS文件系統(tǒng)。

至于為什么要將snn進(jìn)程運(yùn)行在一臺非NameNode的機(jī)器上,這主要出于兩點(diǎn)考慮:

1、可擴(kuò)展性:創(chuàng)建一個(gè)新的HDFS的snapshot(快照)需要將namenode中l(wèi)oad到內(nèi)存的metadata信息全部拷貝一遍,這樣的操作需要的內(nèi)存和namenode占用的內(nèi)存一樣,由于分配給namenode進(jìn)程的內(nèi)存其實(shí)是對HDFS文件系統(tǒng)的限制,如果分布式文件系統(tǒng)非常的大,那么namenode那臺機(jī)器的內(nèi)存就可能會(huì)被namenode進(jìn)程全部占據(jù)。

2、容錯(cuò)性:當(dāng)snn創(chuàng)建一個(gè)checkpoint的時(shí)候,它會(huì)將checkpoint拷貝成metadata的幾個(gè)拷貝。將這個(gè)操作運(yùn)行到另外一臺機(jī)器,還可以提供分布式文件系統(tǒng)的容錯(cuò)性。

SECONDARYNAMENODE工作原理2.3.1SecondaryNameNode日志與鏡像合并步驟日志與鏡像的定期合并總共分五步:

1、SecondaryNameNode通知NameNode準(zhǔn)備提交edits文件,此時(shí)主節(jié)點(diǎn)產(chǎn)生edits.new

2、SecondaryNameNode通過httpget方式獲取NameNode的fsimage與edits文件(在SecondaryNameNode的current同級目錄下可見到temp.check-point或者previous-checkpoint目錄,這些目錄中存儲著從namenode拷貝來的鏡像文件)

3、SecondaryNameNode開始合并獲取的上述兩個(gè)文件,產(chǎn)生一個(gè)新的fsimage文件fsimage.ckpt

4、SecondaryNameNode用httppost方式發(fā)送fsimage.ckpt至NameNode

5、NameNode將fsimage.ckpt與edits.new文件分別重命名為fsimage與edits,然后更新fstime,整個(gè)checkpoint過程到此結(jié)束。在新版本的hadoop中(hadoop0.21.0),SecondaryNameNode兩個(gè)作用被兩個(gè)節(jié)點(diǎn)替換,checkpointnode與backupnode.SecondaryNameNode備份由三個(gè)參數(shù)控制fs.checkpoint.period控制周期,fs.checkpoint.size控制日志文件超過多少大小時(shí)合并,dfs.http.address表示http地址,這個(gè)參數(shù)在SecondaryNameNode為單獨(dú)節(jié)點(diǎn)時(shí)需要設(shè)置。3.HDFS機(jī)制3.1心跳機(jī)制工作原理:master啟動(dòng)的時(shí)候,會(huì)開一個(gè)ipcserver在那里。slave啟動(dòng),連接master,每隔3秒鐘向master發(fā)送一個(gè)“心跳”,攜帶狀態(tài)信息;master通過這個(gè)心跳的返回值,向slave節(jié)點(diǎn)傳達(dá)指令

作用:Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每個(gè)Datanode接收心跳信號和塊狀態(tài)報(bào)告

(Blockreport)。接收到心跳信號意味著該Datanode節(jié)點(diǎn)工作正常。塊狀態(tài)報(bào)告包含了一個(gè)該Datanode上所

有數(shù)據(jù)塊的列表DataNode啟動(dòng)后向NameNode注冊,通過后,周期性(1小時(shí))的向NameNode上報(bào)所有的塊的列表;

每3秒向NamNode發(fā)一次心跳,返回NameNode給該DataNode的命令;如復(fù)制塊數(shù)據(jù)到另一臺機(jī)器,或刪

除某個(gè)數(shù)據(jù)塊。如果NameNode超過10分鐘沒有收到某個(gè)DataNode的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。hadoop集群剛開始啟動(dòng)時(shí),會(huì)進(jìn)入安全模式(99.9%),就用到了心跳機(jī)制3.2負(fù)載均衡Hadoop的HDFS集群非常容易出現(xiàn)機(jī)器與機(jī)器之間磁盤利用率不平衡的情況,例如:當(dāng)集群內(nèi)新增、刪除節(jié)點(diǎn),或者某個(gè)節(jié)點(diǎn)機(jī)器內(nèi)硬盤存儲達(dá)到飽和值。當(dāng)數(shù)據(jù)不平衡時(shí),Map任務(wù)可能會(huì)分配到?jīng)]有存儲數(shù)據(jù)的機(jī)器,這將導(dǎo)致網(wǎng)絡(luò)帶寬的消耗,也無法很好的進(jìn)行本地計(jì)算。

當(dāng)HDFS負(fù)載不均衡時(shí),需要對HDFS進(jìn)行數(shù)據(jù)的負(fù)載均衡調(diào)整,即對各節(jié)點(diǎn)機(jī)器上數(shù)據(jù)的存儲分布進(jìn)行調(diào)整。從而,讓數(shù)據(jù)均勻的分布在各個(gè)DataNode上,均衡IO性能,防止熱點(diǎn)的發(fā)生。進(jìn)行數(shù)據(jù)的負(fù)載均衡調(diào)整,必須要滿足如下原則:

c(1)數(shù)據(jù)平衡不能導(dǎo)致數(shù)據(jù)塊減少,數(shù)據(jù)塊備份丟失

(2)管理員可以中止數(shù)據(jù)平衡進(jìn)程

(3)每次移動(dòng)的數(shù)據(jù)量以及占用的網(wǎng)絡(luò)資源,必須是可控的

(4)數(shù)據(jù)均衡過程,不能影響namenode的正常工作

負(fù)載均衡原理如下:

步驟分析如下:

(1)數(shù)據(jù)均衡服務(wù)(RebalancingServer)首先要求NameNode生成DataNode數(shù)據(jù)分布分析報(bào)告,獲取每個(gè)DataNode磁盤使用情況

(2)RebalancingServer匯總需要移動(dòng)的數(shù)據(jù)分布情況,計(jì)算具體數(shù)據(jù)塊遷移路線圖。數(shù)據(jù)塊遷移路線圖,確保網(wǎng)絡(luò)內(nèi)最短路徑

(3)開始數(shù)據(jù)塊遷移任務(wù),ProxySourceDataNode復(fù)制一塊需要移動(dòng)數(shù)據(jù)塊

(4)將復(fù)制的數(shù)據(jù)塊復(fù)制到目標(biāo)DataNode上

(5)刪除原始數(shù)據(jù)塊

(6)目標(biāo)DataNode向ProxySourceDataNode確認(rèn)該數(shù)據(jù)塊遷移完成

(7)ProxySourceDataNode向RebalancingServer確認(rèn)本次數(shù)據(jù)塊遷移完成。然后繼續(xù)執(zhí)行這個(gè)過程,直至集群達(dá)到數(shù)據(jù)均衡標(biāo)準(zhǔn)4.HDFS讀寫流程在了解讀寫過程之前先了了解基本的概念:

在DFSClient寫HDFS的過程中,有三個(gè)需要搞清楚的單位:block、packet與chunk;

block是最大的一個(gè)單位,它是最終存儲于DataNode上的數(shù)據(jù)粒度,由dfs.block.size參數(shù)決定,默認(rèn)是64M;注:這個(gè)參數(shù)由客戶端配置決定;

packet是中等的一個(gè)單位,它是數(shù)據(jù)由DFSClient流向DataNode的粒度,以dfs.write.packet.size參數(shù)為參考值,默認(rèn)是64K;注:這個(gè)參數(shù)為參考值,是指真正在進(jìn)行數(shù)據(jù)傳輸時(shí),會(huì)以它為基準(zhǔn)進(jìn)行調(diào)整,調(diào)整的原因是一個(gè)packet有特定的結(jié)構(gòu),調(diào)整的目標(biāo)是這個(gè)packet的大小剛好包含結(jié)構(gòu)中的所有成員,同時(shí)也保證寫到DataNode后當(dāng)前block的大小不超過設(shè)定值;

chunk是最小的一個(gè)單位,它是DFSClient到DataNode數(shù)據(jù)傳輸中進(jìn)行數(shù)據(jù)校驗(yàn)的粒度,由io.bytes.per.checksum參數(shù)決定,默認(rèn)是512B;

注:事實(shí)上一個(gè)chunk還包含4B的校驗(yàn)值,因而chunk寫入packet時(shí)是516B;數(shù)據(jù)與檢驗(yàn)值的比值為128:1,所以對于一個(gè)128M的block會(huì)有一個(gè)1M的校驗(yàn)文件與之對應(yīng);4.1數(shù)據(jù)讀流程

1、客戶端調(diào)用FileSystem實(shí)例的open方法,獲得這個(gè)文件對應(yīng)的輸入流InputStream。

2、通過RPC遠(yuǎn)程調(diào)用NameNode,獲得NameNode中此文件對應(yīng)的數(shù)據(jù)塊保存位置,包括這個(gè)文件的副本的保存位置(主要是各DataNode的地址)。

3、獲得輸入流之后,客戶端調(diào)用read方法讀取數(shù)據(jù)。選擇最近的DataNode建立連接并讀取數(shù)據(jù)。

4、如果客戶端和其中一個(gè)DataNode位于同一機(jī)器(比如MapReduce過程中的mapper和reducer),那么就會(huì)直接從本地讀取數(shù)據(jù)。

5、到達(dá)數(shù)據(jù)塊末端,關(guān)閉與這個(gè)DataNode的連接,然后重新查找下一個(gè)數(shù)據(jù)塊。

6、不斷執(zhí)行第2–5步直到數(shù)據(jù)全部讀完。

7、客戶端調(diào)用close,關(guān)閉輸入流DFSInputStream。

在讀的過程中如何保證數(shù)據(jù)的完整性:

通過校驗(yàn)和。因?yàn)槊總€(gè)chunk中都有一個(gè)校驗(yàn)位,一個(gè)個(gè)chunk構(gòu)成packet,一個(gè)個(gè)packet最終形成block,故可在block上求校驗(yàn)和。HDFS的client端即實(shí)現(xiàn)了對HDFS文件內(nèi)容的校驗(yàn)和(checksum)檢查。當(dāng)客戶端創(chuàng)建一個(gè)新的HDFS文件時(shí)候,分塊后會(huì)計(jì)算這個(gè)文件每個(gè)數(shù)據(jù)塊的校驗(yàn)和,此校驗(yàn)和會(huì)以一個(gè)隱藏文件形式保存在同一個(gè)HDFS命名空間下。當(dāng)client端從HDFS中讀取文件內(nèi)容后,它會(huì)檢查分塊時(shí)候計(jì)算出的校驗(yàn)和(隱藏文件里)和讀取到的文件塊中校驗(yàn)和是否匹配,如果不匹配,客戶端可以選擇從其他Datanode獲取該數(shù)據(jù)塊的副本。4.2數(shù)據(jù)寫流程1、使用HDFS提供的客戶端Client,向遠(yuǎn)程的namenode發(fā)起RPC請求

2、namenode會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會(huì)為文件創(chuàng)建一個(gè)記錄,否則會(huì)讓客戶端拋出異常;

3、當(dāng)客戶端開始寫入文件的時(shí)候,客戶端會(huì)將文件切分成多個(gè)packets,并在內(nèi)部以數(shù)據(jù)隊(duì)列“dataqueue(數(shù)據(jù)隊(duì)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論