<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      好程序員大數(shù)據(jù)學(xué)習(xí)路線分享分布式文件系統(tǒng)HDFS,設(shè)計(jì)目標(biāo):

      1、存儲(chǔ)量大

      2、自動(dòng)快速檢測(cè)應(yīng)對(duì)硬件錯(cuò)誤

      3、流式訪問數(shù)據(jù)

      4、移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)本身更劃算

      5、簡(jiǎn)單一致性模型

      6、異構(gòu)平臺(tái)可移植

      特點(diǎn)

      優(yōu)點(diǎn):

      高可靠性:Hadoop按位存儲(chǔ)和處理數(shù)據(jù)的能力強(qiáng)
      高擴(kuò)展性:hadoop是在可用的計(jì)算機(jī)集簇間分配數(shù)據(jù)并完成計(jì)算任務(wù)的,這些集簇可以方便地?cái)U(kuò)展到數(shù)以千計(jì)的節(jié)點(diǎn)中
      高效性:hadoop能夠在節(jié)點(diǎn)之間動(dòng)態(tài)地移動(dòng)數(shù)據(jù),并保證各個(gè)節(jié)點(diǎn)的動(dòng)態(tài)平衡,因此處理速度非???br>高容錯(cuò)性:hadoop能夠自動(dòng)保存數(shù)據(jù)的多個(gè)副本,并且能夠自動(dòng)將失敗的任務(wù)重新分配。
      缺點(diǎn):

      不適合低延遲數(shù)據(jù)訪問
      無法高效存儲(chǔ)大量小文件(每個(gè)文件存儲(chǔ)都有屬于自己的索引,元數(shù)據(jù)龐大就不高效)
      不支持多用戶寫入及任意修改文件(可以刪除以及追加,只是不能修改文件中某處的數(shù)據(jù))
      重要特性:

      文件在物理上是分塊存儲(chǔ),塊的大小可以通過配置參數(shù)(dfs.blocksize)來規(guī)定,默認(rèn)2.x版本之后是128M,老版本是64M

      HDFS會(huì)給哭護(hù)短提供一個(gè)統(tǒng)一的抽象目錄樹,客戶端通過路徑來訪問文件,刑辱:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data

      目錄結(jié)構(gòu)及文件分塊信息(元數(shù)據(jù))的管理由namenode承擔(dān)—namenode是HDFS集群主節(jié)點(diǎn),負(fù)責(zé)維護(hù)整個(gè)hdfs文件系統(tǒng)的目錄樹,以及每一個(gè)路徑(文件)所對(duì)應(yīng)的block塊信息(block的id以及所在datanode服務(wù)器)

      文件的各個(gè)block的存儲(chǔ)管理由datanode承擔(dān)—datanode是HDFS集群從節(jié)點(diǎn),每一個(gè)block都可以在多個(gè)datanode上存儲(chǔ)多個(gè)副本(副本參數(shù)設(shè)置dfs.replication)
      HDFS是設(shè)計(jì)成適應(yīng)一次寫入,多次讀出的場(chǎng)景,且不支持文件的修改
      管理文件系統(tǒng)的命名空間(元數(shù)據(jù):包含文件名稱、大小、所屬人、地址)
      規(guī)定客戶端訪問文件規(guī)則
      三個(gè)服務(wù)

      Namenode

      任務(wù)清單

      a) 文件大小是否已經(jīng)超載(超過集群的負(fù)載)

      b) 是否已經(jīng)存在相同的文件

      c) 是否具有創(chuàng)建該文件的權(quán)限

      對(duì)文件執(zhí)行命令,關(guān)閉,打開文件或者打開路徑等操作
      所有的數(shù)據(jù)節(jié)點(diǎn)發(fā)送心跳給NameNode,他需要確保數(shù)據(jù)節(jié)點(diǎn)DataNode是否在線,一個(gè)數(shù)據(jù)塊報(bào)告包含所有這個(gè)數(shù)據(jù)節(jié)點(diǎn)上的所有block的狀況
      首先將fsimage(鏡像)載入內(nèi)存,并讀取執(zhí)行日志editlog的各項(xiàng)操作
      一旦在內(nèi)存中建立文件系統(tǒng)元數(shù)據(jù)映射,則創(chuàng)建一個(gè)新的fsimage文件(這個(gè)過程不需要secondaryNamenode)和一個(gè)空的editlog
      在安全模式下,各個(gè)datanode會(huì)向namenode發(fā)送塊列表的最新情況
      此刻namenode運(yùn)行在安全模式。即NameNode的文件系統(tǒng)對(duì)于客戶端來說是只讀
      NameNode開始監(jiān)聽RPC和HTTP請(qǐng)求
      啟動(dòng)過程

      RPC:Remote Procedure Call Protocol---遠(yuǎn)程過程通過協(xié)議

      它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議

      系統(tǒng)中數(shù)據(jù)塊的位置并不是由namenode維護(hù)的,而是以塊列表形式存儲(chǔ)在datanode中
      在系統(tǒng)的正常操作期間,namenode會(huì)在內(nèi)存中保留所有塊信息的映射信息
      fsimage:元數(shù)據(jù)鏡像文件(保存文件系統(tǒng)的目錄樹)
      edit.log:元數(shù)據(jù)操作日志(針對(duì)目錄樹的修改操作)
      兩個(gè)重要文件

      元數(shù)據(jù)鏡像

      a) 內(nèi)存中保存一份最新的

      b) 內(nèi)存中鏡像=fsimage+edits

      SecondaryNamenode

      工作任務(wù)

      定期合并fsimage與edits

      c) Edits文件過大將導(dǎo)致NamenNode重啟速度緩慢

      d) SecondaryNameNode負(fù)責(zé)定期合并他們

      Datanode

      hdfs的寫過程



      寫過程語言Description:

      Client通過調(diào)用FileSystem的get方法與namenode進(jìn)程建立通道進(jìn)行通信,然后調(diào)用create方法來請(qǐng)求創(chuàng)建文件。

      FileSystem通過對(duì)namenode發(fā)出遠(yuǎn)程請(qǐng)求,在namenode里面創(chuàng)建一個(gè)新的文件,但此時(shí)并不關(guān)聯(lián)任何的塊。NameNode進(jìn)行很多檢查來保證不存在要?jiǎng)?chuàng)建的文件已經(jīng)存在文件系統(tǒng)中,同時(shí)檢查是否有相應(yīng)的權(quán)限來創(chuàng)建文件。如果這些檢查完了,nameNameNode將這個(gè)新文件的嘻嘻記錄下來,然后FileSystem返回一個(gè)DFSOutputStream給客戶端用來寫入數(shù)據(jù)。和讀的情形一樣,F(xiàn)SDataOutputStream將包裝一個(gè)DFSOutputStream用于和DataNode及NameNode通信。而一旦文件創(chuàng)建失敗,客戶端會(huì)受到一個(gè)IOException,標(biāo)識(shí)文件創(chuàng)建失敗,停止后續(xù)任務(wù)。

      客戶端開始寫數(shù)。FSDataOutputStream把要寫入的數(shù)據(jù)分成塊打成包的形式,將其寫入到DFSOutputStream對(duì)象的中間隊(duì)列中。其中的數(shù)據(jù)由Datastreamer來讀取。DataStreamer的職責(zé)是讓NameNode分配新的塊—找出合適的DataNode來存儲(chǔ)作為備份而復(fù)制的數(shù)據(jù)。

      FSDataOutputStream維護(hù)了一個(gè)內(nèi)部關(guān)于packets的隊(duì)列,里面存放等待被DataNode確認(rèn)無誤的packets的信息。這個(gè)隊(duì)列被稱為等待隊(duì)列,一個(gè)packet的信息被移出本隊(duì)列當(dāng)且僅當(dāng)packet被所有節(jié)點(diǎn)都確認(rèn)無誤。

      當(dāng)完成數(shù)據(jù)寫入之后客戶端調(diào)用流的close方法,再通知NameNode完成寫入之前,這個(gè)方法將flush殘留的packets,并等待確認(rèn)信息。NameNode已經(jīng)知道文件由哪些塊組成,所以在返回成功前只需要等待數(shù)據(jù)塊進(jìn)行最小復(fù)制。
      Write API:

      1.從本地系統(tǒng)上傳到hdfs

      Configuration hdfsConf = new Configuration();//創(chuàng)建一個(gè)hdfs的環(huán)境變量

      String namenodeURI=”hdfs://hadoop001:8020”;//namenode的統(tǒng)一資源定位符

      String username=”root”;//訪問指定用戶的hdfs

      FileSystem hdfs = FileSystem.get(new
      URI(namenodeURI),hdfsConf,username);//創(chuàng)建一個(gè)hdfs的文件系統(tǒng)對(duì)象

      FileSystem local = FileSystem.getLocal(new Configuration());//創(chuàng)建一個(gè)本地的文件系統(tǒng)對(duì)象

      hdfs.copyFromLocalFile(new Path(localPath),new Path(hdfsPath));

      2.在hdfs上創(chuàng)建文件并直接給定文件的內(nèi)容

      FSDateOutputStream out = hdfs.create(new Path(hdfsPath));

      out.write(fileContent.getBytes());

      out.close();

      hdfs的讀過程



      讀過程語言Description:

      客戶端或者用戶通過調(diào)用FileSystem對(duì)象的open方法打開需要讀取的文件,這對(duì)HDFS來說是常見一個(gè)分布式文件系統(tǒng)的一個(gè)讀取實(shí)例。
      FileSystem通過遠(yuǎn)程協(xié)議調(diào)用NameNode確定文件的前幾個(gè)Block的位置。對(duì)于每一個(gè)Block,Namenode返回含有那個(gè)Block
      的“元數(shù)據(jù)”,即文件基本信息;接下來,DataNode按照上文定義的距離來進(jìn)行排序,如果Client本身就是一個(gè)DataNode優(yōu)先從本地DataNode讀物數(shù)據(jù)。HDFS實(shí)例完成以上工作后,返回一個(gè)FSDataInputStream給客戶端,讓其從FSDataInputStream中讀取數(shù)據(jù)。FSDataInputStream接著包裝一個(gè)DFSInputStream用來管理DataNode和NameNode的I/O。
      NameNode向客戶端返回一個(gè)包含數(shù)據(jù)信息的地址,客戶端格努詆毀創(chuàng)建一個(gè)FSDataInputStream開始對(duì)數(shù)據(jù)進(jìn)行讀取。

      FSDataInputStream根據(jù)開始存放的前幾個(gè)Blocks的DataNode的地址,連接到最近的DataNode上對(duì)數(shù)據(jù)開始從頭讀取??蛻舳朔磸?fù)調(diào)用read()方法,以流式方式從DataNode讀取數(shù)據(jù)

      當(dāng)讀到Block的結(jié)尾的時(shí)候,F(xiàn)SDataInputStream會(huì)關(guān)閉當(dāng)前DataNode的地址,然后查找能夠讀取下一個(gè)Block的最好的DataNode。這些操作對(duì)客戶端是透明的,客戶端感覺到的是連續(xù)的流,也就是說讀取的時(shí)候就開始查找下一個(gè)塊所在的地址。
      讀取完成調(diào)用close()方法,關(guān)閉FSDataInputStream。
      Read API:

      1.從hdfs上下載文件到本地

      Configuration hdfsConf = new Configuration();//創(chuàng)建一個(gè)hdfs的環(huán)境變量

      String namenodeURI=”hdfs://hadoop001:8020”;//namenode的統(tǒng)一資源定位符

      String username=”root”;//訪問指定用戶的hdfs

      FileSystem hdfs = FileSystem.get(new
      URI(namenodeURI),hdfsConf,username);//創(chuàng)建一個(gè)hdfs的文件系統(tǒng)對(duì)象

      FileSystem local = FileSystem.getLocal(new Configuration());//創(chuàng)建一個(gè)本地的文件系統(tǒng)對(duì)象

      hdfs.copyToLocalFile(new Path(hdfsPath),new Path(localPath));

      * 在hdfs上讀取給定文件的內(nèi)容
      Path path = new Path(hdfsFilePath);//文件路徑

      FSDataInputStream in = hdfs.open(path);//獲取文件輸入流

      FileStatus status = hdfs.getFileStatus(path);//獲取文件的元數(shù)據(jù)信息

      //獲取文件元數(shù)據(jù)中的文件大小

      byte[] bytes = new byte[Integer.pareInt(String.valueOf(status.getLen()))];

      //將輸入流中的全部?jī)?nèi)容一次性讀取出來

      in.readFully(0,bytes);

      System.out.println(new String(bytes));//將讀取的文件打印輸出

      in.close();

      hdfs的整體過程

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          欧美操逼免费 | 欧美一级A片免费看 | 能免费看黄的网站 | 韩国三级HD久久精品 | 大鸡巴视频在线播放 | 男人添女荫道口免费视频 | 做爱视频在线观看网站免费观看 | 福利片一区二区 | 欧美极品欧美精品欧美视频 | 国产自产91 |