成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

性能提升100倍!基于Hadoop的TB級大文件上傳優(yōu)化實(shí)踐

開發(fā) 架構(gòu)
這篇文章,我們來看看,Hadoop的HDFS分布式文件系統(tǒng)的文件上傳的性能優(yōu)化。

一、寫在前面

上一篇文章,我們聊了一下Hadoop中的NameNode里的edits log寫機(jī)制。

主要分析了edits log寫入磁盤和網(wǎng)絡(luò)的時(shí)候,是如何通過分段加鎖以及雙緩沖的機(jī)制,大幅度提升了多線程并發(fā)寫edits log的吞吐量,從而支持高并發(fā)的訪問。

如果沒看那篇文章的同學(xué),可以回看一下:《?每秒上千次高并發(fā)訪問,HDFS優(yōu)雅的抗住了?》。

這篇文章,我們來看看,Hadoop的HDFS分布式文件系統(tǒng)的文件上傳的性能優(yōu)化。

首先,我們還是通過一張圖來回顧一下文件上傳的大概的原理。

?由上圖所示,文件上傳的原理,其實(shí)說出來也簡單。

比如有個(gè)TB級的大文件,太大了,HDFS客戶端會給拆成很多block,一個(gè)block就是128MB。

這個(gè)HDFS客戶端你可以理解為是云盤系統(tǒng)、日志采集系統(tǒng)之類的東西。

比如有人上傳一個(gè)1TB的大文件到網(wǎng)盤,或者是上傳個(gè)1TB的大日志文件。

然后,HDFS客戶端把一個(gè)一個(gè)的block上傳到第一個(gè)DataNode

第一個(gè)DataNode會把這個(gè)block復(fù)制一份,做一個(gè)副本發(fā)送給第二個(gè)DataNode。

第二個(gè)DataNode發(fā)送一個(gè)block副本到第三個(gè)DataNode。

所以你會發(fā)現(xiàn),一個(gè)block有3個(gè)副本,分布在三臺機(jī)器上。任何一臺機(jī)器宕機(jī),數(shù)據(jù)是不會丟失的。

最后,一個(gè)TB級大文件就被拆散成了N多個(gè)MB級的小文件存放在很多臺機(jī)器上了,這不就是分布式存儲么??

二、原始的文件上傳方案

今天要討論的問題,就是那個(gè)HDFS客戶端上傳TB級大文件的時(shí)候,到底是怎么上傳呢?

我們先來考慮一下,如果用一個(gè)比較原始的方式來上傳,應(yīng)該怎么做?

大概能想到的是下面這個(gè)圖里的樣子。

很多java的初學(xué)者,估計(jì)都知道這樣來上傳文件,其實(shí)無非就是不停的從本地磁盤文件用輸入流讀取數(shù)據(jù),讀到一點(diǎn),就立馬通過網(wǎng)絡(luò)的輸出流寫到DataNode里去。

上面這種流程圖的代碼,估計(jì)剛畢業(yè)的同學(xué)都可以立馬寫出來。因?yàn)閷ξ募妮斎肓髯疃嗑褪莻€(gè)FileInputStream。

而對DataNode的輸出流,最多就是個(gè)Socket返回的OutputStream。

然后中間找一個(gè)小的內(nèi)存byte[]數(shù)組,進(jìn)行流對拷就行了,從本地文件讀一點(diǎn)數(shù)據(jù),就給DataNode發(fā)一點(diǎn)數(shù)據(jù)。

但是如果你要這么弄,那性能真是極其的低下了,網(wǎng)絡(luò)通信講究的是適當(dāng)頻率,每次batch批量發(fā)送,你得讀一大批數(shù)據(jù),通過網(wǎng)絡(luò)通信發(fā)一批數(shù)據(jù)。

不能說讀一點(diǎn)點(diǎn)數(shù)據(jù),就立馬來一次網(wǎng)絡(luò)通信,就發(fā)出去這一點(diǎn)點(diǎn)的數(shù)據(jù)。

如果按照上面這種原始的方式,絕對會導(dǎo)致網(wǎng)絡(luò)通信效率極其低下,大文件上傳性能很差。

為什么這么說呢?

相當(dāng)于你可能剛讀出來幾百個(gè)字節(jié)的數(shù)據(jù),立馬就寫網(wǎng)絡(luò),卡頓個(gè)比如幾百毫秒。

然后再讀下一批幾百個(gè)字節(jié)的數(shù)據(jù),再寫網(wǎng)絡(luò)卡頓個(gè)幾百毫秒,這個(gè)性能很差,在工業(yè)級的大規(guī)模分布式系統(tǒng)中,是無法容忍的。

三、HDFS對大文件上傳的性能優(yōu)化

好,看完了原始的文件上傳,那么我們來看看,Hadoop中的大文件上傳是如何優(yōu)化性能的呢?一起來看看下面那張圖。

首先你需要自己創(chuàng)建一個(gè)針對本地TB級磁盤文件的輸入流。

然后讀到數(shù)據(jù)之后立馬寫入HDFS提供的FSDataOutputStream輸出流。

這個(gè)FSDataOutputStream輸出流在干啥?

大家覺得他會天真的立馬把數(shù)據(jù)通過網(wǎng)絡(luò)傳輸寫給DataNode嗎?

答案當(dāng)然是否定的了!這么干的話,不就跟之前的那種方式一樣了!

1、Chunk緩沖機(jī)制

首先,數(shù)據(jù)會被寫入一個(gè)chunk緩沖數(shù)組,這個(gè)chunk是一個(gè)512字節(jié)大小的數(shù)據(jù)片段,你可以這么來理解。

然后這個(gè)緩沖數(shù)組可以容納多個(gè)chunk大小的數(shù)據(jù)在里面緩沖。

光是這個(gè)緩沖,首先就可以讓客戶端快速的寫入數(shù)據(jù)了,不至于說幾百字節(jié)就要進(jìn)行一次網(wǎng)絡(luò)傳輸,想一想,是不是這樣?

2、Packet數(shù)據(jù)包機(jī)制

?接著,當(dāng)chunk緩沖數(shù)組都寫滿了之后,就會把這個(gè)chunk緩沖數(shù)組進(jìn)行一下chunk切割,切割為一個(gè)一個(gè)的chunk,一個(gè)chunk是一個(gè)數(shù)據(jù)片段。

然后多個(gè)chunk會直接一次性寫入另外一個(gè)內(nèi)存緩沖數(shù)據(jù)結(jié)構(gòu),就是Packet數(shù)據(jù)包。

一個(gè)Packet數(shù)據(jù)包,設(shè)計(jì)為可以容納127個(gè)chunk,大小大致為64mb。所以說大量的chunk會不斷的寫入Packet數(shù)據(jù)包的內(nèi)存緩沖中。

通過這個(gè)Packet數(shù)據(jù)包機(jī)制的設(shè)計(jì),又可以在內(nèi)存中容納大量的數(shù)據(jù),進(jìn)一步避免了頻繁的網(wǎng)絡(luò)傳輸影響性能。?

3、內(nèi)存隊(duì)列異步發(fā)送機(jī)制

?當(dāng)一個(gè)Packet被塞滿了chunk之后,就會將這個(gè)Packet放入一個(gè)內(nèi)存隊(duì)列來進(jìn)行排隊(duì)。

然后有一個(gè)DataStreamer線程會不斷的獲取隊(duì)列中的Packet數(shù)據(jù)包,通過網(wǎng)絡(luò)傳輸直接寫一個(gè)Packet數(shù)據(jù)包給DataNode。

如果一個(gè)Block默認(rèn)是128mb的話,那么一個(gè)Block默認(rèn)會對應(yīng)兩個(gè)Packet數(shù)據(jù)包,每個(gè)Packet數(shù)據(jù)包是64MB。

也就是說,傳送兩個(gè)Packet數(shù)據(jù)包給DataNode之后,就會發(fā)一個(gè)通知說,一個(gè)Block的數(shù)據(jù)都傳輸完畢。

這樣DataNode就知道自己收到一個(gè)Block了,里面包含了人家發(fā)送過來的兩個(gè)Packet數(shù)據(jù)包。?

四、總結(jié)

OK,大家看完了上面的那個(gè)圖以及Hadoop采取的大文件上傳機(jī)制,是不是感覺設(shè)計(jì)的很巧妙?

說白了,工業(yè)級的大規(guī)模分布式系統(tǒng),都不會采取特別簡單的代碼和模式,那樣性能很低下。

這里都有大量的并發(fā)優(yōu)化、網(wǎng)絡(luò)IO優(yōu)化、內(nèi)存優(yōu)化、磁盤讀寫優(yōu)化的架構(gòu)設(shè)計(jì)、生產(chǎn)方案在里面。

所以大家觀察上面那個(gè)圖,HDFS客戶端可以快速的將tb級大文件的數(shù)據(jù)讀出來,然后快速的交給HDFS的輸出流寫入內(nèi)存。

基于內(nèi)存里的chunk緩沖機(jī)制、packet數(shù)據(jù)包機(jī)制、內(nèi)存隊(duì)列異步發(fā)送機(jī)制。絕對不會有任何網(wǎng)絡(luò)傳輸?shù)目D,導(dǎo)致大文件的上傳速度變慢。

反而通過上述幾種機(jī)制,可以上百倍的提升一個(gè)TB級大文件的上傳性能。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2013-09-26 14:11:23

SQL性能優(yōu)化

2022-11-23 17:44:10

HadoopHDFS

2020-03-26 12:38:15

代碼節(jié)點(diǎn)數(shù)據(jù)

2024-11-15 09:41:03

2017-09-25 10:27:37

阿里云POLARDB數(shù)據(jù)庫

2021-02-08 15:56:59

文件傳輸辦公

2019-08-02 11:28:45

HadoopYARN調(diào)度系統(tǒng)

2017-09-22 09:22:55

阿里云POLARDB實(shí)現(xiàn)

2021-04-21 18:57:16

二進(jìn)制存儲空間

2025-04-07 02:22:00

C#性能優(yōu)化

2012-03-12 13:54:56

ASP.NET

2022-04-21 07:51:51

場景JavaSQL

2022-11-27 17:39:06

大數(shù)據(jù)集群性能

2024-07-17 08:25:44

2011-07-01 10:11:39

2012-11-21 17:35:21

Oracle技術(shù)嘉年華

2022-04-11 15:56:51

Golang代碼框架

2024-11-25 09:11:43

2017-09-26 14:56:57

MongoDBLBS服務(wù)性能

2020-08-10 11:00:02

Python優(yōu)化代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲欧美综合精品另类天天更新 | 久久99精品国产麻豆婷婷 | 狠狠操天天操 | 久久中文字幕视频 | 午夜小视频在线播放 | 亚洲视频中文字幕 | 国产精品久久久久久久久久久久久 | 成人免费在线观看视频 | 97精品国产 | 天堂中文在线播放 | 国内精品久久久久久久 | 在线视频中文字幕 | 亚洲欧美日韩精品久久亚洲区 | 免费观看日韩精品 | 成人午夜在线视频 | 国产资源视频 | 精品久久久久久久久久 | 午夜激情免费 | 亚洲免费精品 | 国产精品高潮呻吟久久久久 | 日本精品一区二区在线观看 | 在线视频三区 | 久久天堂网 | 欧美最猛性xxxxx亚洲精品 | 国产视频久 | 国产91在线播放 | 日韩电影免费观看中文字幕 | 免费看淫片 | 国产精品色一区二区三区 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | av手机免费在线观看 | 91视频久久 | 在线播放日韩 | 欧美在线日韩 | 欧美色图另类 | 中国美女一级黄色片 | www视频在线观看 | 中文字幕日韩一区 | 欧美中文字幕一区二区三区亚洲 | 在线播放中文字幕 | a级黄色毛片免费播放视频 国产精品视频在线观看 |