細(xì)細(xì)品味Hadoop-Hadoop集群(第12期副刊)-HBase性能優(yōu)化_第1頁(yè)
細(xì)細(xì)品味Hadoop-Hadoop集群(第12期副刊)-HBase性能優(yōu)化_第2頁(yè)
細(xì)細(xì)品味Hadoop-Hadoop集群(第12期副刊)-HBase性能優(yōu)化_第3頁(yè)
細(xì)細(xì)品味Hadoop-Hadoop集群(第12期副刊)-HBase性能優(yōu)化_第4頁(yè)
細(xì)細(xì)品味Hadoop-Hadoop集群(第12期副刊)-HBase性能優(yōu)化_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

精華集錦csAxp蝦皮工作室ogscomxiapi河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮1Hadoop集群(第12期副刊)HBasex命令進(jìn)行修改,或者修改/etc/security/limits.conf和/proc/sys/fs/file-max的參數(shù),具體如何修改可以去Google關(guān)鍵字“l(fā)inuxlimits.conf”JVM配置位)配置適當(dāng)?shù)膮?shù):HBASEHEAPSIZE0HBase使用的JVM堆的大小JVMGCzookeeper.session.timeout默認(rèn)值:3分鐘(180000ms)rver河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮2handlercount默認(rèn)值:10OChbase.hregion.max.filesizenn沖擊非常大。此外,大region意味著較大的storefile,tlit手動(dòng)split在靈活性和穩(wěn)定性上比起自動(dòng)split要高很多,相反,管理成本增加不多,比河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮3hbaseregionserver.global.memstore.upperLimit/lowerLimit.4/0.35eflushsizeRegion制flush導(dǎo)致性能降低前的補(bǔ)救措施。在日志中,表現(xiàn)為“**Flushthreadwokeupwithmemoryabovelowwater.”參數(shù)調(diào)整會(huì)影響讀寫,如果寫的壓力大導(dǎo)致經(jīng)常超過(guò)這個(gè)閥值,則調(diào)小讀緩存還有一種可能性是hbase.hregion.memstore.flush.size保持不變,但RS維護(hù)了過(guò)多的ionhfile.block.cache.size.2p0.3左右。如果寫比讀多,果斷默認(rèn)吧。設(shè)置這個(gè)值的時(shí)候,你同時(shí)要參考p有OOM的風(fēng)險(xiǎn),謹(jǐn)hbase.hstore.blockingStoreFiles默認(rèn)值:7mnFamilystorefile河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮4hbase.hregion.memstore.block.multiplier:2調(diào)優(yōu):這個(gè)參數(shù)的默認(rèn)值還是比較靠譜的。如果你預(yù)估你的正常應(yīng)用場(chǎng)景(不包括異就會(huì)經(jīng)常暴長(zhǎng)到正常的幾倍,那么你應(yīng)該調(diào)大這個(gè)倍數(shù)并調(diào)整其他參數(shù)值,比如fileblockcachesizehbaseregionserverglobalmemstoreupperLimitlowerLimithbase.hregion.memstore.mslab.enablede從而提高系統(tǒng)的整體性能。本文介紹ArenaAllocation的原理及其在Hbase中的應(yīng)用1)背景C分配的大小不一。分配的空間不連續(xù)。httpwwwclouderacomblogavoidingfullgcsinhbasewith-memstore-local-allonbufferspart河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮52)HBase中的內(nèi)存碎片HBase為了提高寫入性能,為每個(gè)region添加了一個(gè)內(nèi)存寫緩存-Memstore。當(dāng)單個(gè)Memstore的大小達(dá)到memstore.size或Heap內(nèi)存達(dá)到hbase.regionserver.global.memstore.upperegionMemstoresGC不一定及時(shí))。region在內(nèi)存中的位置,它是無(wú)序的,因?yàn)榭蛻舳说恼?qǐng)求是region,nArenaAllocation是一種非傳統(tǒng)的內(nèi)存管理方法。它通過(guò)順序化分配內(nèi)存,內(nèi)存數(shù)據(jù)分C分配對(duì)象時(shí),將新對(duì)象的databytes復(fù)制到數(shù)組中,數(shù)組的起始位置是偏移量,復(fù)掉老數(shù)據(jù)(append)。當(dāng)一個(gè)數(shù)組被充滿時(shí),創(chuàng)建一個(gè)新的數(shù)組。清理時(shí),只需要釋放掉這些數(shù)組,即可得到固定的大塊連續(xù)內(nèi)存。ArenaAllocation但內(nèi)河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮6)HBase的解決方案-MSLABmStoreLocalAllocationBufferClouderaHBaseseMChunkchunklength5)開啟MSLABBhbase.hregion.memstore.mslab.chunksize=2m//chunk的大小,越大內(nèi)存連續(xù)性越好,但內(nèi)存低hbase.hregion.memstore.mslab.max.allocation=256K//通過(guò)MSLAB分配的對(duì)象不能超過(guò)AutoFlushutScanCachingScanAttributeSelection河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮7的所有數(shù)據(jù)(所有CoulmnFamily)。CloseResultScanners(對(duì)應(yīng)的Server資源無(wú)法釋放)。OptimalLoadingofRowKeys當(dāng)Put某些非重要數(shù)據(jù)時(shí),你可以設(shè)置writeToWAL(false),來(lái)進(jìn)一步提高寫性能。啟用BloomFilter啟用LZO壓縮LZO對(duì)比Hbase默認(rèn)的GZip,前者性能較高,后者壓縮比較高,具體參見UsingLZO不要在一張表里定義太多的ColumnFamily批量導(dǎo)入在批量導(dǎo)入數(shù)據(jù)到Hbase前,你可以通過(guò)預(yù)先創(chuàng)建regions,來(lái)平衡數(shù)據(jù)的負(fù)載。詳見?PreCreatingRegions避免CMSconcurrentmodefailureC河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮8線程),然后采用單線程拷貝方式清理所有垃圾對(duì)象。這個(gè)過(guò)程會(huì)非常漫長(zhǎng)。為了避免出現(xiàn)通過(guò)設(shè)置“-XX:CMSInitiatingOccupancyFraction=N”hfileblockcachesize70-80,一般高10%左.1表的設(shè)計(jì)ons一些空的regions,這樣當(dāng)數(shù)據(jù)寫入HBasenpublicstaticbooleancreateTable(HBaseAdminadmin,HTableDescriptortable,byte[][]splits)throwsIOException{try{admincreateTabletablesplitstrue}catch(TableExistsExceptione){loggerinfotable+table.getNameAsString()+"alreadyexists");//thetablealreadyexists...nfalse}}publicstaticbyte][]getHexSplits(StringstartKey,StringendKey,intnumRegions){bytesplits=newbyte[numRegions-1][];BigIntegerlowestKey=newBigInteger(startKey,16);BigIntegerhighestKey=newBigInteger(endKey,16);河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮9BigIntegerrangehighestKey.subtract(lowestKey);BigIntegerregionIncrement=range.divide(BigIntegermRegionslowestKeylowestKeyaddregionIncrement);for(inti=0;i<numRegions-1;i++){BigIntegerkey=lowestKey.add(regionIncrement.multiply(BigIntegerbyteb=String.format("%016x",key).getBytes();tsib}nsplits}RowKeyyy全表掃描:即直接掃描整張表中所有行記錄。在HBase中,rowkey可以是任意字符串,最大長(zhǎng)度64KB,實(shí)際應(yīng)用中一般為rowkey是按照字典序存儲(chǔ),因此,設(shè)計(jì)rowkey時(shí),要充分利用這個(gè)排序特點(diǎn),將經(jīng)舉個(gè)例子:如果最近寫入HBase表中的數(shù)據(jù)是最可能被訪問(wèn)的,可以考慮將時(shí)間戳作ColumnFamilyInMemory創(chuàng)建表的時(shí)候,可以通過(guò)HColumnDescriptor.setInMemory(true)將表放到RegionServer河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮10CompactSplitreinorcompactStore部的StoreFile和2.2寫表操作1)多HTable并發(fā)寫staticfinalConfigurationconfHBaseConfigurationcreate);staticfinalStringtablelogname“user_log”;wTableLog=newHTable[tableN];for(inti=0;i<tableN;i++){wTableLogi=newHTable(conf,table_log_name);wTableLogi].setWriteBufferSize(5*1024*1024);//5MBwTableLogisetAutoFlush(false);}AutoFlushHBaseautoflush開啟的。河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮11WriteBuffer通過(guò)調(diào)用HTable.setWriteBufferSize(writeBufferSize)方法可以設(shè)置HTable客戶端的寫sh寫WAL(WriteAheadLog)日志(即HLog,一個(gè)RegionServer上的所有Region共享一個(gè)3)批量寫e4)多線程并發(fā)寫efor(inti=0;i<threadN;i++){Threadth=newThread(){publicvoidrun(){while(true){try{sleep(1000);//1second}catch(InterruptedExceptione){intStackTrace}synchronized(wTableLog[i]){try{wTableLogi].flushCommits();河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮12}catch(IOExceptione){intStackTrace}}}}thsetDaemontrue;thstart();}.3讀表操作1)多HTable并發(fā)讀staticfinalConfigurationconfHBaseConfigurationcreate);staticfinalStringtablelogname“user_log”;rTableLog=newHTable[tableN];for(inti=0;i<tableN;i++){rTableLogi=newHTable(conf,table_log_name);rTableLogi.setScannerCaching(50);}ScannerCaching通過(guò)調(diào)用HTable.setScannerCaching(intscannerCaching)可以設(shè)置HBasescanner一次從服scan過(guò)程中next()的時(shí)間開銷,代價(jià)是scanner需要通過(guò)客戶端的內(nèi)存來(lái)維持這些被cacheScanAttributeSelectionCloseResultScanner(對(duì)應(yīng)的Server資源無(wú)法釋放)。3)批量讀河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮134)多線程并發(fā)讀publicclassDataReaderServer{publicstaticConcurrentHashMapString,String>getUnitMinutePV(longuid,longstartStamp,longendStamp){longminstartStampintcount(int)((endStamp-startStamp)/(60*1000));ListStringlst=newArrayList<String>();for(inti=0;i<=count;i++){minstartStamp+i*60*1000;lstadduid"+min);}returnparallelBatchMinutePVlst}privatestaticConcurrentHashMapStringStringparallelBatchMinutePV(List<String>lstKeys){ConcurrentHashMapStringStringhashRet=newConcurrentHashMap<String,String>();intparallel=3;ListListStringlstBatchKeys=null;if(lstKeys.size()<parallel){lstBatchKeysnewArrayList<List<String>>(1);BatchKeysaddlstKeys}lstBatchKeysnewArrayList<List<String>>(parallel);forinti0;i<parallel;i++){ListStringlst=newArrayList<String>();tBatchKeysaddlst}forinti0;i<lstKeys.size();i++){lstBatchKeysgetiparalleladdlstKeysget(i));}}ListFutureConcurrentHashMapStringString>>>futures=newArrayListFutureConcurrentHashMapStringString>>>(5);河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮14ThreadFactoryBuilderbuildernewThreadFactoryBuilder);builder.setNameFormat("ParallelBatchQuery");ThreadFactoryfactorybuilderbuild();ThreadPoolExecutorexecutor=ThreadPoolExecutorExecutorsnewFixedThreadPoollstBatchKeyssize,factory);forListStringkeyslstBatchKeysCallableConcurrentHashMapString,String>>callable=wBatchMinutePVCallablekeysFutureTaskConcurrentHashMap<String,String>>future=FutureTaskConcurrentHashMapStringString>)executor.submit(callable);resaddfuture}rshutdown//Waitforallthetaskstofinishtry{booleanstillRunningexecutorawaitTerminationTimeUnit.MILLISECONDS);if(stillRunning){try{orshutdownNow}catch(Exceptione){//TODOAuto-generatedcatchblockintStackTrace}}}catch(InterruptedExceptione){try{ThreadcurrentThreadinterrupt;}catch(Exceptione1){//TODOAuto-generatedcatchblockintStackTrace}}//Lookforanyexceptionfor(Futuref:futures){try{iffget!=null){hashRetputAllConcurrentHashMap<String,String>)f.get());}}catch(InterruptedExceptione){try{河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮15hreadcurrentThreadinterrupt}catch(Exceptione1){//TODOAuto-generatedcatchblockintStackTrace}}catch(ExecutionExceptione){ntStackTrace}}hashRet}protectedstaticConcurrentHashMapStringString>getBatchMinutePV(List<String>lstKeys){ConcurrentHashMapStringStringhashRetnull;ListGetlstGet=newArrayList<Get>();gsplitValuenullfor(Strings:lstKeys){plitValuessplitlonguidLongparseLong(splitValue[0]);longminLongparseLong(splitValue[1]);bytekey=newbyte[16];BytesputLongkey0,uid);BytesputLongkey,min);GetgnewGetkey;dFamilyfpGetaddg}Resultres=null;try{res=tableMinutePV[rand.nextInt(tableN)].get(lstGet);}catch(IOExceptione1){loggererrortableMinutePVexception,e="+e1.getStackTrace());}if(res!=null&&res.length>0){hashRetnewConcurrentHashMap<String,String>(res.length);for(Resultre:res){if(re!=null&&!re.isEmpty()){try{bytekeyre.getRow();bytevalue=re.getValue(fp,cp);if(key!=null&&value!=null){河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮16hashRetput(String.valueOf(Bytes.toLong(key,BytesSIZEOFLONG)),StringvalueOfBytestoLongvalue));}}catch(Exceptione2){loggererroregetStackTrace);}}}}nhashRet}}tchMinutePVCallableimplementsCallable<ConcurrentHashMap<String,String>>{privateListStringkeyspublicBatchMinutePVCallable(List<String>lstKeys){thiskeyslstKeys}publicConcurrentHashMap<String,String>call()throwsException{rnDataReadServergetBatchMinutePVkeys}}5)緩存查詢結(jié)果HBase新的查詢請(qǐng)求直接返回,不再查詢HBase;否則對(duì)HBase發(fā)起讀請(qǐng)ckcache寫請(qǐng)求會(huì)先寫入Memstore,Regionserver會(huì)給每個(gè)region提供一個(gè)Memstore,當(dāng)Memstore滿64MB以后,會(huì)啟動(dòng)flush刷新到磁盤。當(dāng)Memstore的總大小超過(guò)限制時(shí) 河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮17于注重讀響應(yīng)時(shí)間的系統(tǒng),可以將BlockCache設(shè)大些,比如設(shè)置BlockCache=0.4,2.4數(shù)據(jù)計(jì)算1)服務(wù)端計(jì)算Coprocessor運(yùn)行于HBaseRegionServer服務(wù)端,各個(gè)Regions保持對(duì)與其相關(guān)的aronRegionObserver例如表的Endpoint:提供可以在region上執(zhí)行任意函數(shù)的命令觸發(fā)器。一個(gè)使用例子是coprocessor驗(yàn),對(duì)它的可2)寫端計(jì)算計(jì)數(shù)canV去重UV同步到HBase中。河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮183)讀端計(jì)算如果對(duì)于響應(yīng)時(shí)間要求比較苛刻的情況(如單次http請(qǐng)求要在毫秒級(jí)時(shí)間內(nèi)返回),個(gè)輯。.5優(yōu)化總結(jié)河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮19圖又被保存在制定的web站點(diǎn)中,pnHDFS了一個(gè)與表格同onmaxfilesize立即被一切為二,其過(guò)程是在該目錄下創(chuàng)建一個(gè)名為“.splits”的目錄作為標(biāo)記,然后由region的region中切分出的數(shù)據(jù)獨(dú)立為一個(gè)文件并不再接受新的數(shù)據(jù)(該文件大小超過(guò)了64M,最大可達(dá)到(256+64)/2=160MB),內(nèi)存中新的數(shù)據(jù)的目錄下就將增加一個(gè)64M的文件,直到總文件數(shù)超過(guò)由河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮20“pactionThreshold”指定的數(shù)量時(shí)(默認(rèn)為3),compaction過(guò)程就將被觸compactiondir目錄進(jìn)行壓縮,而且在壓縮后的文件超過(guò)256MBCompaction結(jié)束之后,后續(xù)的split依然會(huì)持續(xù)進(jìn)行一小段時(shí)間,直到所有的region都被切HBase一目plit插入的數(shù)據(jù)將被分布到越來(lái)越多的region上,因此波峰之間的間隔時(shí)間也將會(huì)再次理解上述論述,我們可以推斷出Hbase的數(shù)據(jù)插入性能實(shí)際上應(yīng)該被分為三種情況,即直線狀態(tài)、低峰狀態(tài)和高峰狀態(tài)。在這三種情況下得到的性能數(shù)據(jù)才是最終Hbase4.1前言hbasehadoopapache它很好地用java實(shí)現(xiàn)了google的bigtable系統(tǒng)大部分特性,因此在數(shù)據(jù)量猛增的今天非常受到歡迎。對(duì)于淘寶而phbase4.2原因11年之前所有的后端持久化存儲(chǔ)基本上都是在mysql上進(jìn)行的(不排除少量河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮21l類變化:a)數(shù)據(jù)量變得越來(lái)越多,事實(shí)上現(xiàn)在淘寶幾乎任何一個(gè)與用戶相關(guān)的在線業(yè)務(wù)的數(shù)據(jù)量b)數(shù)據(jù)量的增長(zhǎng)很快且不一定能準(zhǔn)確預(yù)計(jì),大多數(shù)應(yīng)用系統(tǒng)從上線起在一段時(shí)間內(nèi)數(shù)據(jù)制約需求,并且希望系統(tǒng)能夠保持強(qiáng)一致性d寫入非常頻繁,尤其是大量系統(tǒng)依賴于實(shí)時(shí)的日志分析e讀取批量數(shù)據(jù)fschema,可能經(jīng)常更新列屬性或新增列g(shù))希望能夠方便使用,有良好且語(yǔ)義清晰的java接口降。region(相當(dāng)于數(shù)據(jù)庫(kù)的分表)可以ms級(jí)動(dòng)態(tài)的切分和移動(dòng),保證了負(fù)載均衡性。由base.3應(yīng)用情況河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮22s持續(xù)增大以及需求的變化,因此我們用hbase重構(gòu)了它的存儲(chǔ)層。準(zhǔn)確的說(shuō)prom更適合groupby數(shù)據(jù)傳輸平臺(tái),廣泛應(yīng)用于實(shí)時(shí)日志收集、數(shù)據(jù)實(shí)時(shí)監(jiān)控、廣告效果實(shí)時(shí)反饋、數(shù)據(jù)庫(kù)實(shí)時(shí)同步等領(lǐng)域。它與prom相比的特點(diǎn)是增加了在線寫。動(dòng)態(tài)的數(shù)據(jù)增加使hbase上se的風(fēng)險(xiǎn)之一,這一點(diǎn)對(duì)于每個(gè)想使用hbase的開發(fā)者來(lái)說(shuō)必須牢記。hbase由于采用了LSM-Tree模型,從架構(gòu)原理上來(lái)說(shuō)數(shù)據(jù)幾乎沒(méi)有丟失的可能,但是在實(shí)際使用中不小心謹(jǐn)命中率以及client的反序列化問(wèn)題。我們現(xiàn)在對(duì)它們做了一些解決方案(后面會(huì)有介有控制力。FacebookhbaseTopN頁(yè)面點(diǎn)擊系統(tǒng)則是基于twitter開源的stormTT維表持久化到河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮234.4部署、運(yùn)維和監(jiān)控Facebook經(jīng)透露過(guò)Facebook的hbase架構(gòu),可以說(shuō)是非常不錯(cuò)的。如他們將以及分為5個(gè)機(jī)架,每個(gè)機(jī)架上一臺(tái)zookeeper??梢哉f(shuō)對(duì)于大數(shù)據(jù)量的服務(wù)這是一種優(yōu)良hdfs制namenode單點(diǎn)問(wèn)題)。在其上架設(shè)數(shù)個(gè)hbase集群,每個(gè)集群一個(gè)master以及一個(gè)socketgangliaganglia記錄js實(shí)現(xiàn)了一套監(jiān)控界面,將我們關(guān)心實(shí)現(xiàn)波動(dòng)報(bào)警等自定義的報(bào)警。經(jīng)過(guò)以上措施,保證了我們總是能先于用戶發(fā)現(xiàn)集群的問(wèn)redisregion能夠在高負(fù)載的情況下找到具體請(qǐng)求次數(shù)排名較高的那些region,并把它們移到空閑的regionserverregion時(shí)排序。的應(yīng)用也會(huì)控制在低峰期運(yùn)行,比如在白天我們會(huì)關(guān)閉jobtracker等。河北工業(yè)大學(xué)——軟件工程與理論實(shí)驗(yàn)室整理:蝦皮24rror4.5測(cè)試與發(fā)布大小,不同列族數(shù),不同命中率,是否做presharding等等。每次運(yùn)行都會(huì)持續(xù)數(shù)小時(shí)以得以上的重合度,這個(gè)工作非常煩瑣,以至于消耗了很多時(shí)間,但后來(lái)的事實(shí)證明它非常有compact曲線有了一些起伏而被我的問(wèn)題我們會(huì)通過(guò)查看代碼大體定位到問(wèn)題以后,在代碼層面強(qiáng)行拋出異常來(lái)復(fù)現(xiàn)它。事有規(guī)律的發(fā)布模式。它既要避免頻繁的發(fā)布引起的不穩(wěn)定,又要避免長(zhǎng)期不發(fā)布導(dǎo)致生產(chǎn)自從我們引入這套發(fā)布機(jī)制后,由發(fā)布帶來(lái)的不穩(wěn)定因素大大下降了,并且線上版本也能河北工業(yè)大學(xué)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論