大數(shù)據(jù)技術(shù)基礎(chǔ)教程 課件 第5章 分布式數(shù)據(jù)庫HBase_第1頁
大數(shù)據(jù)技術(shù)基礎(chǔ)教程 課件 第5章 分布式數(shù)據(jù)庫HBase_第2頁
大數(shù)據(jù)技術(shù)基礎(chǔ)教程 課件 第5章 分布式數(shù)據(jù)庫HBase_第3頁
大數(shù)據(jù)技術(shù)基礎(chǔ)教程 課件 第5章 分布式數(shù)據(jù)庫HBase_第4頁
大數(shù)據(jù)技術(shù)基礎(chǔ)教程 課件 第5章 分布式數(shù)據(jù)庫HBase_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章分布式數(shù)據(jù)庫HBase《大數(shù)據(jù)技術(shù)基礎(chǔ)教程》學(xué)習(xí)目標(biāo)/Target掌握HBase的數(shù)據(jù)模型和系統(tǒng)架構(gòu)掌握HBase的讀寫流程掌握HBase相關(guān)的shell命令和API編程章節(jié)概述/

SummaryHBase是目前非常熱門的一款分布式KV(KeyValue,鍵值)數(shù)據(jù)庫系統(tǒng),無論是互聯(lián)網(wǎng)行業(yè),還是其他傳統(tǒng)IT行業(yè)都在大量使用。尤其是近幾年隨著國內(nèi)大數(shù)據(jù)理念的普及,HBase憑借其高可靠、易擴展、高性能以及成熟的社區(qū)支持,受到越來越多企業(yè)的青睞。許多大數(shù)據(jù)系統(tǒng)都將HBase作為底層數(shù)據(jù)存儲服務(wù)本章將簡要介紹HBase簡介、HBase數(shù)據(jù)模型、HBase系統(tǒng)架構(gòu)、HBase數(shù)據(jù)讀寫流程和HBase編程實踐。目錄/Contents01020304HBase簡介HBase數(shù)據(jù)模型HBase系統(tǒng)架構(gòu)HBase讀寫流程05HBase編程實踐HBase簡介5.15.1HBase簡介5.1.1Hbase的發(fā)展及現(xiàn)狀2003年Google在SOSP會議上發(fā)表了大數(shù)據(jù)歷史上第一篇公認(rèn)的革命性論文——《GFS:TheGoogleFileSystem》2004年,Google又發(fā)表了另一篇非常重要的論文——《MapReduce:SimplefiedDataProcessingonLargeClusters》2006年,Google發(fā)布了第三篇重要論文——《BigTable:ADistributedStorageSystemforStructuredData》,用于解決Google內(nèi)部海量結(jié)構(gòu)化數(shù)據(jù)的存儲以及高效讀寫問題5.1HBase簡介5.1.1Hbase的發(fā)展及現(xiàn)狀Google的三篇論文論證了在大量廉價機器上存儲、處理海量數(shù)據(jù)(結(jié)構(gòu)化數(shù)據(jù)、非結(jié)構(gòu)化數(shù)據(jù))是可行的,遺憾的是,Yahoo并沒有給出開源方案。2004年,DougCutting和MikeCafarella在為他們的搜索引擎爬蟲(Nutch)實現(xiàn)分布式架構(gòu)的時候看到了Google的上述兩篇論文。他們在之后的幾個月里按照論文,實現(xiàn)出一個簡易版的HDFS和MapReduce,這也就是Hadoop的最早起源。5.1HBase簡介5.1.2Hbase應(yīng)用場景Facebook用戶交互數(shù)據(jù)淘寶TLog小米云服務(wù)用戶行為數(shù)據(jù)存儲HBase數(shù)據(jù)模型5.25.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖NameSpace:命名空間,類似于關(guān)系型數(shù)據(jù)庫的database概念,每個命名空間下有多個表,HBASE有兩個自帶的命名空間,分別是HBASE和default,HBASE中存放的是HBASE內(nèi)置的表(系統(tǒng)內(nèi)建表,包含namespace和meta表:存的是用戶表或系統(tǒng)表位置信息),default表是用戶默認(rèn)的使用的命名空間(用戶建表時未指定namespace的表都創(chuàng)建在此)。Region(表的切片):HBase表的分片,HBase表會根據(jù)RowKey值被切分成不同的region存儲在RegionServer中,在一個RegionServer中可以有多個不同的region。5.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖table:表,一個表包含多行數(shù)據(jù)。row:行,在HBase表里,每一行數(shù)據(jù)代表一個數(shù)據(jù)對象,每一行都有一個行鍵(RowKey)來進(jìn)行唯一標(biāo)識(不可分割的字節(jié)數(shù)組,且按照字典排序[ASCII碼]由低到高存儲),每一行都有一個rowkey和多個column(列)組成。在HBase中針對行鍵建立索引,提高檢索數(shù)據(jù)的速度。5.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖column:列,與關(guān)系型數(shù)據(jù)庫中的列不同,HBase中的column由columnfamily(列簇)以及qualifier(列名)兩部分組成,兩者中間使用":"相連。比如contents:html,其中contents為列簇,html為列簇下具體的一列。columnfamily在表創(chuàng)建的時候需要指定,用戶不能隨意增減。一個columnfamily下可以設(shè)置任意多個qualifier,因此可以理解為HBase中的列可以動態(tài)增加,理論上甚至可以擴展到上百萬列。5.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖Store:每一個region有一個或多個store組成,至少有一個store,hbase會把一起訪問的數(shù)據(jù)放在一個store里面,即為每個ColumnFamily建一個store(即有幾個ColumnFamily,也就有幾個Store)。一個Store由一個memStore、0或多個StoreFile組成。5.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖timestamp:時間戳,每個cell在寫入HBase的時候都會默認(rèn)分配一個時間戳作為該cell的版本,當(dāng)然,用戶也可以在寫入的時候自帶時間戳。HBase支持多版本特性,即同一rowkey、column下可以有多個value存在,這些value使用timestamp作為版本號,版本越大,表示數(shù)據(jù)越新。cell:單元格,由五元組(row,column,timestamp,type,value)組成的結(jié)構(gòu),其中type表示Put/Delete這樣的操作類型,timestamp代表這個cell的版本。這個結(jié)構(gòu)在數(shù)據(jù)庫中實際是以KV結(jié)構(gòu)存儲的,其中(row,column,timestamp,type)是K,value字段對應(yīng)KV結(jié)構(gòu)的V。5.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖HBase引入了列簇的概念,列簇下的列可以動態(tài)擴展。另外,HBase使用時間戳實現(xiàn)了數(shù)據(jù)的多版本支持5.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖HBase是一個多維、稀疏、排序的表。多維:HBase中的Map與普通Map最大的不同在于,key是一個復(fù)合數(shù)據(jù)結(jié)構(gòu),由多維元素構(gòu)成,包括rowkey、columnfamily、qualifier、type以及timestamp。稀疏:在其他數(shù)據(jù)庫中,對于空值的處理一般都會填充null,而對于HBase,空值不需要任何填充。這個特性為什么重要?因為HBase的列在理論上是允許無限擴展的,對于成百萬列的表來說,通常都會存在大量的空值,如果使用填充null的策略,勢必會造成大量空間的浪費。因此稀疏性是HBase的列可以無限擴展的一個重要條件。5.2HBase數(shù)據(jù)模型5.2.1HBase邏輯視圖HBase是一個多維、稀疏、排序、分布式存儲的表。排序:構(gòu)成HBase的KV在同一個文件中都是有序的,但規(guī)則并不是僅僅按照rowkey排序,而是按照KV中的key進(jìn)行排序—先比較rowkey,rowkey小的排在前面;如果rowkey相同,再比較column,即columnfamily:qualifier,column小的排在前面;如果column還相同,再比較時間戳timestamp,即版本信息,timestamp大的排在前面。這樣的多維元素排序規(guī)則對于提升HBase的讀取性能至關(guān)重要,在后面讀取章節(jié)會詳細(xì)分析。分布式:構(gòu)成HBase的所有Map并不集中在某臺機器上,而是分布在整個集群中。5.2HBase數(shù)據(jù)模型5.2.2HBase物理視圖與大多數(shù)數(shù)據(jù)庫系統(tǒng)不同,HBase中的數(shù)據(jù)是按照列簇存儲的,即將數(shù)據(jù)按照列簇分別存儲在不同的目錄中。列簇anchor的所有數(shù)據(jù)存儲在一起形成5.2HBase數(shù)據(jù)模型5.2.2HBase物理視圖與大多數(shù)數(shù)據(jù)庫系統(tǒng)不同,HBase中的數(shù)據(jù)是按照列簇存儲的,即將數(shù)據(jù)按照列簇分別存儲在不同的目錄中。列簇contents的所有數(shù)據(jù)存儲在一起形成:5.2HBase數(shù)據(jù)模型5.2.3行式存儲、列式存儲、列簇式存儲為什么HBase要將數(shù)據(jù)按照列簇分別存儲?行式存儲:行式存儲系統(tǒng)會將一行數(shù)據(jù)存儲在一起,一行數(shù)據(jù)寫完之后再接著寫下一行,最典型的如MySQL這類關(guān)系型數(shù)據(jù)庫5.2HBase數(shù)據(jù)模型5.2.3行式存儲、列式存儲、列簇式存儲為什么HBase要將數(shù)據(jù)按照列簇分別存儲?列式存儲:列式存儲理論上會將一列數(shù)據(jù)存儲在一起,不同列的數(shù)據(jù)分別集中存儲,最典型的如Kudu、ParquetonHDFS等系統(tǒng)(文件格式)5.2HBase數(shù)據(jù)模型5.2.3行式存儲、列式存儲、列簇式存儲為什么HBase要將數(shù)據(jù)按照列簇分別存儲?列簇式存儲:從概念上來說,列簇式存儲介于行式存儲和列式存儲之間,可以通過不同的設(shè)計思路在行式存儲和列式存儲兩者之間相互切換。比如,一張表只設(shè)置一個列簇,這個列簇包含所有用戶的列。HBase中一個列簇的數(shù)據(jù)是存儲在一起的,因此這種設(shè)計模式就等同于行式存儲。再比如,一張表設(shè)置大量列族,每個列簇下僅有一列,很顯然這種設(shè)計模式就等同于列式存儲。HBase系統(tǒng)架構(gòu)5.35.3HBase系統(tǒng)架構(gòu)離線分析系統(tǒng)HBase體系結(jié)構(gòu)借鑒了BigTable論文,是典型的Master-Slave模型。系統(tǒng)中有一個管理集群的Master節(jié)點以及大量實際服務(wù)用戶讀寫的RegionServer節(jié)點。除此之外,HBase中所有數(shù)據(jù)最終都存儲在HDFS系統(tǒng)中,這與BigTable實際數(shù)據(jù)存儲在GFS中相對應(yīng);系統(tǒng)中還有一個ZooKeeper節(jié)點,協(xié)助Master對集群進(jìn)行管理。5.3HBase系統(tǒng)架構(gòu)5.3.1ClientHBase客戶端(Client)提供了Shell命令行接口、原生JavaAPI編程接口、Thrift/RESTAPI編程接口以及MapReduce編程接口。HBase客戶端支持所有常見的DML操作以及DDL操作,即數(shù)據(jù)的增刪改查和表的日常維護(hù)等。其中Thrift/RESTAPI主要用于支持非Java的上層業(yè)務(wù)需求,MapReduce接口主要用于批量數(shù)據(jù)導(dǎo)入以及批量數(shù)據(jù)讀取。5.3HBase系統(tǒng)架構(gòu)5.3.2ZookeeperZooKeeper(ZK)也是ApacheHadoop的一個頂級項目,基于Google的Chubby開源實現(xiàn),主要用于協(xié)調(diào)管理分布式應(yīng)用程序。在HBase系統(tǒng)中,ZooKeeper扮演著非常重要的角色。實現(xiàn)Master高可用管理系統(tǒng)核心元數(shù)據(jù)

參與RegionServer宕機恢復(fù)。實現(xiàn)分布式表鎖5.3HBase系統(tǒng)架構(gòu)5.3.3HMasteHBase集群中有若干臺計算機,其中有一臺是“主機(Master)”,其余的都是“從機(Slaver)”。一般在生產(chǎn)系統(tǒng)中,還會有一臺“備用主機(backupmaster)”。這個HMaster進(jìn)程,就是運行在“主機”上的。準(zhǔn)確的說,應(yīng)該是HMaster在哪一臺計算機上運行,哪一臺計算機就是“主機”.

分發(fā)Region

監(jiān)控HRegionServer

管理元數(shù)據(jù)5.3HBase系統(tǒng)架構(gòu)5.3.4HRegeionServeRegionServer主要用來響應(yīng)用戶的IO請求,是HBase中最核心的模塊,由WAL(HLog)、BlockCache以及多個Region構(gòu)成.WAL(HLog):HLog在HBase中有兩個核心作用:其一,用于實現(xiàn)數(shù)據(jù)的高可靠性,HBase數(shù)據(jù)隨機寫入時,并非直接寫入HFile數(shù)據(jù)文件,而是先寫入緩存,再異步刷新落盤。為了防止緩存數(shù)據(jù)丟失,數(shù)據(jù)寫入緩存之前需要首先順序?qū)懭際Log,這樣,即使緩存數(shù)據(jù)丟失,仍然可以通過HLog日志恢復(fù);其二,用于實現(xiàn)HBase集群間主從復(fù)制,通過回放主集群推送過來的HLog日志實現(xiàn)主從復(fù)制。5.3HBase系統(tǒng)架構(gòu)5.3.4HRegeionServeRegionServer主要用來響應(yīng)用戶的IO請求,是HBase中最核心的模塊,由WAL(HLog)、BlockCache以及多個Region構(gòu)成.BlockCache:HBase系統(tǒng)中的讀緩存??蛻舳藦拇疟P讀取數(shù)據(jù)之后通常會將數(shù)據(jù)緩存到系統(tǒng)內(nèi)存中,后續(xù)訪問同一行數(shù)據(jù)可以直接從內(nèi)存中獲取而不需要訪問磁盤。對于帶有大量熱點讀的業(yè)務(wù)請求來說,緩存機制會帶來極大的性能提升。5.3HBase系統(tǒng)架構(gòu)5.3.4HRegeionServeRegion:數(shù)據(jù)表的一個分片,當(dāng)數(shù)據(jù)表大小超過一定閾值就會“水平切分”,分裂為兩個Region。Region是集群負(fù)載均衡的基本單位。通常一張表的Region會分布在整個集群的多臺RegionServer上,一個RegionServer上會管理多個Region,當(dāng)然,這些Region一般來自不同的數(shù)據(jù)表。HBase表結(jié)構(gòu)設(shè)計5.45.4HBase表結(jié)構(gòu)設(shè)計5.4.1命名空間設(shè)計針對hbase使用較多數(shù)據(jù)量較大的業(yè)務(wù),可以將數(shù)據(jù)放在單獨的namespace中單獨管理,入庫的時候tablename使用namespace:tablename的方式來處理。針對hbase使用較少數(shù)據(jù)量較少的業(yè)務(wù),可以將數(shù)據(jù)放在default的namespace中統(tǒng)一管理,入庫的時候直接單獨使用tablename方式來處理。5.4HBase表結(jié)構(gòu)設(shè)計5.4.2rowkey設(shè)計rowkey設(shè)計根本上還是需要解決或者避免可能出現(xiàn)的各種問題getorscan?如何避免數(shù)據(jù)熱點?如何優(yōu)化HBase硬盤占用量?對于時序數(shù)據(jù),如何能快速的取到最新一條?5.4HBase表結(jié)構(gòu)設(shè)計5.4.2rowkey設(shè)計table預(yù)分區(qū)

按照Hash對table進(jìn)行預(yù)分區(qū)

按照業(yè)務(wù)標(biāo)識字段進(jìn)行預(yù)分區(qū)Rowkey盡可能設(shè)計的短

Rowkey最大長度64kb,但是實際應(yīng)用中一般為10-100bytes5.4HBase表結(jié)構(gòu)設(shè)計5.4.3列族設(shè)計列族是設(shè)計是在建表階段需要完成的,也是表屬性需要集中配置的維度,主要有下面的內(nèi)容供參考:(1)VERSIONS(2)BLOOMFILTER(3)TTL(TimeToLive)(4)COMPRESSION&DATA_BLOCK_ENCODING(5)BLOCKSIZE(6)DFS_REPLICATION(7)IN_MEMORY5.4HBase表結(jié)構(gòu)設(shè)計5.4.4列設(shè)計由于HBase是弱schema的結(jié)構(gòu),所以列相關(guān)的配置不在建表時指定,而是在數(shù)據(jù)寫入的時候自動指定。而HBase的稀疏存儲更是支持業(yè)務(wù)上定義大量的列,然后查詢的時候指定列名進(jìn)行精確查詢,取到需要的數(shù)據(jù)。這種設(shè)計很符合HBase的特點以及設(shè)計理念。但是按照上文所說,HBase底層是按照cell存儲的,cell的越多,rowkey以及columnfamily的冗余存儲就越大,浪費了緩存資源和硬盤資源,所以給出的建議是在充分發(fā)揮HBase的特點的同時盡量減少列的數(shù)量。HBase數(shù)據(jù)讀寫流程5.55.5HBase數(shù)據(jù)讀寫流程5.5.1HBase數(shù)據(jù)寫流程(1)客戶端處理階段:客戶端將用戶的寫入請求進(jìn)行預(yù)處理,并根據(jù)集群元數(shù)據(jù)定位寫入數(shù)據(jù)所在的RegionServer,將請求發(fā)送給對應(yīng)的RegionServer。(2)Region寫入階段:RegionServer接收到寫入請求之后將數(shù)據(jù)解析出來,首先寫入HLog,再寫入對應(yīng)Region列簇的MemStore。(3)MemStoreFlush階段:當(dāng)Region中MemStore容量超過一定閾值,系統(tǒng)會異步執(zhí)行flush操作,將內(nèi)存中的數(shù)據(jù)寫入文件,形成HFile。5.5HBase數(shù)據(jù)讀寫流程5.5.1HBase數(shù)據(jù)寫流程HBase寫入流程5.5HBase數(shù)據(jù)讀寫流程5.5.2HBase數(shù)據(jù)讀流程首先從ZooKeeper中讀取-ROOT-表所在的RegionServer然后從該HRegionServer中根據(jù)請求的TableName,RowKey讀取.META.表所在的HRegionServer最后從該HRegionServer中讀取.META.表的內(nèi)容而獲取此次請求需要訪問的HRegion所在的位置,然后訪問該HRegionServer獲取請求的數(shù)據(jù)三層尋址5.5HBase數(shù)據(jù)讀寫流程5.5.2HBase數(shù)據(jù)讀流程(1)用戶通過查找zk(zookeeper)的/hbase/meta-region-server節(jié)點查詢哪臺RegionServer上有hbase:meta表。(2)客戶端連接含有hbase:meta表的RegionServer。Hbase:meta表存儲了所有Region的行鍵范圍信息,通過這個表就可以查詢出你要存取的rowkey屬于哪個Region的范圍里面,以及這個Region又是屬于哪個RegionServer。5.5HBase數(shù)據(jù)讀寫流程5.5.2HBase數(shù)據(jù)讀流程(3)獲取這些信息后,客戶端就可以直連其中一臺擁有你要存取的rowkey的RegionServer,并直接對其操作。(4)客戶端會把meta信息緩存起來,下次操作就不需要進(jìn)行以上加載HBase:meta的步驟了。HBase編程實踐5.65.6HBase編程實踐5.6.1HBase常用shell命令HBaseShell常用命令命名描述語法help‘命名名’查看命令的使用描述help‘命令名’whoami我是誰whoamiversion返回hbase版本信息versionstatus返回hbase集群的狀態(tài)信息statustable_help查看如何操作表table_helpcreate創(chuàng)建表create‘表名’,‘列族名1’,‘列族名2’,‘列族名N’alter修改列族添加一個列族:alter‘表名’,‘列族名’刪除列族:alter‘表名’,{NAME=>‘列族名’,METHOD=>‘delete’}5.6HBase編程實踐5.6.1HBase常用shell命令HBaseShell常用命令命名描述語法describe顯示表相關(guān)的詳細(xì)信息describe‘表名’list列出hbase中存在的所有表listexists測試表是否存在exists‘表名’put添加或修改的表的值

put‘表名’,‘行鍵’,‘列族名’,‘列值’put‘表名’,‘行鍵’,‘列族名:列名’,‘列值’scan通過對表的掃描來獲取對用的值scan‘表名’掃描某個列族:scan‘表名’,{COLUMN=>‘列族名’}掃描某個列族的某個列:scan‘表名’,{COLUMN=>‘列族名:列名’}查詢同一個列族的多個列:scan‘表名’,{COLUMNS=>[‘列族名1:列名1’,‘列族名1:列名2’,…]}get獲取行或單元(cell)的值get‘表名’,‘行鍵’

get‘表名’,‘行鍵’,‘列族名’count統(tǒng)計表中行的數(shù)量count‘表名’5.6HBase編程實踐5.6.1HBase常用shell命令HBaseShell常用命令命名描述語法incr增加指定表行或列的值incr‘表名’,‘行鍵’,‘列族:列名’,步長值get_counter獲取計數(shù)器get_counter‘表名’,‘行鍵’,‘列族:列名’delete刪除指定對象的值(可以為表,行,列對應(yīng)的值,另外也可以指定時間戳的值)刪除列族的某個列:delete‘表名’,‘行鍵’,‘列族名:列名’deleteall刪除指定行的所有元素值deleteall‘表名’,‘行鍵’truncate重新創(chuàng)建指定表truncate‘表名’enable使表有效enable‘表名’is_enabled是否啟用is_enabled‘表名’disable使表無效disable‘表名’is_disabled是否無效is_disabled‘表名’drop刪除表drop的表必須是disable的5.6HBase編程實踐5.6.2HBase常用JavaAPI及示例HBase提供了豐富的JavaAPI接口供用戶使用,可以通過HBaseJavaAPI完成和HBaseShell相同的功能。(1)連接HBaseJava連接HBase需要兩個類:HBaseConfiguration和ConnectionFactory

Configurationconfig=HBaseConfiguration.create();

//使用create()靜態(tài)方法就可以得到Configuration對象通過ConnectionFactory(連接工廠)的方法我們就能獲取到Connection(連接對象)了。具體用法:Connectionconnection=ConnectionFactory.createConnection(config);//config為前文的配置對象5.6HBase編程實踐5.6.2HBase常用JavaAPI及示例(2)創(chuàng)建表TableNametableName=TableName.valueOf("test");//定義表名//TableDescriptor對象通過TableDescriptorBuilder構(gòu)建;TableDescriptorBuildertableDescriptor=TableDescriptorBuilder.newBuilder(tableName);ColumnFamilyDescriptorfamily=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//構(gòu)建列族對象tableDescriptor.setColumnFamily(family);//設(shè)置列族admin.createTable(tableDescriptor.build());//創(chuàng)建表5.6HBase編程實踐5.6.2HBase常用JavaAPI及示例(3)添加數(shù)據(jù)Tabletable=connection.getTable(tableName);//獲取Table對象try{byte[]row=Bytes.toBytes("row1");//定義行Putput=newPut(row);//創(chuàng)建Put對象byte[]columnFamily=Bytes.toBytes("data");//列簇byte[]qualifier=Bytes.toBytes(String.valueOf(1));//列byte[]value=Bytes.toBytes("張三豐");//值put.addColumn(columnFamily,qualifier,value);table.put(put);//向表中添加數(shù)據(jù)}finally{//使用完了要釋放資源table.close();}5.6HBase編程實踐5.6.2HBase常用JavaAPI及示例(4)獲取指定行的數(shù)據(jù)Getget=newGe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論