中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

怎么把網(wǎng)站放到空間嗎教育培訓(xùn)機(jī)構(gòu)平臺(tái)

怎么把網(wǎng)站放到空間嗎,教育培訓(xùn)機(jī)構(gòu)平臺(tái),廈門網(wǎng)站建設(shè)案例,物流企業(yè)網(wǎng)站建設(shè)步驟HDFS分布式文件系統(tǒng) 1.目標(biāo) 理解分布式思想學(xué)會(huì)使用HDFS的常用命令掌握如何使用java api操作HDFS能獨(dú)立描述HDFS三大組件namenode、secondarynamenode、datanode的作用理解并獨(dú)立描述HDFS讀寫流程HDFS如何解決大量小文件存儲(chǔ)問題 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…

HDFS分布式文件系統(tǒng)

1.目標(biāo)

  1. 理解分布式思想
  2. 學(xué)會(huì)使用HDFS的常用命令
  3. 掌握如何使用java api操作HDFS
  4. 能獨(dú)立描述HDFS三大組件namenode、secondarynamenode、datanode的作用
  5. 理解并獨(dú)立描述HDFS讀寫流程
  6. HDFS如何解決大量小文件存儲(chǔ)問題

2. HDFS

2.1 HDFS是什么
  • HDFS是Hadoop中的一個(gè)存儲(chǔ)子模塊

  • HDFS (全稱Hadoop Distributed File System),即hadoop的分布式文件系統(tǒng)

  • File System文件系統(tǒng)

    • 操作系統(tǒng)中負(fù)責(zé)管理文件、存儲(chǔ)文件信息的軟件;

    • 具體地說,它負(fù)責(zé)為用戶創(chuàng)建文件,存入、讀取、修改、轉(zhuǎn)儲(chǔ)、刪除文件等等操作

    • 比如windows下的文件系統(tǒng)

      請(qǐng)?zhí)砑訄D片描述

  • 分布式文件系統(tǒng)(distributed filesystem)

    • 當(dāng)數(shù)據(jù)集大小超出一臺(tái)計(jì)算機(jī)的存儲(chǔ)能力時(shí),就有必要將它拆分成若干部分,然后分散到不同的計(jì)算機(jī)中存儲(chǔ)。

    • 管理網(wǎng)絡(luò)中跨多臺(tái)計(jì)算機(jī)存儲(chǔ)的文件系統(tǒng)稱之為分布式文件系統(tǒng)

      請(qǐng)?zhí)砑訄D片描述

2.2 HDFS特點(diǎn)

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

  • 適合存儲(chǔ)大文件,能用來存儲(chǔ)管理PB級(jí)的數(shù)據(jù);不適合存儲(chǔ)小文件
  • 存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)
  • 流式的訪問數(shù)據(jù),一次寫入、多次讀寫
  • 運(yùn)行于廉價(jià)的商用機(jī)器集群上,成本低
  • 高容錯(cuò):故障時(shí)能繼續(xù)運(yùn)行且不讓用戶察覺到明顯的中斷
  • 容量可擴(kuò)展

2.2.2 局限性

  • 不適合處理低延遲數(shù)據(jù)訪問
    • DFS是為了處理大型數(shù)據(jù)集分析任務(wù)的,主要是為達(dá)到高的數(shù)據(jù)吞吐量而設(shè)計(jì)的
    • 對(duì)于低延時(shí)的訪問需求,HBase是更好的選擇
  • 無法高效存儲(chǔ)大量的小文件
    • 小文件會(huì)給Hadoop的擴(kuò)展性和性能帶來嚴(yán)重問題(How?)
    • 利用SequenceFile、MapFile等方式歸檔小文件(How?)
  • 不支持多用戶寫入及任意修改文件
    • 文件有一個(gè)寫入者,只能執(zhí)行追加操作
    • 不支持多個(gè)用戶對(duì)同一文件的寫操作,以及在文件任意位置進(jìn)行修改,但支持追加
2.3 小結(jié)
  • HDFS是Hadoop中的分布式文件系統(tǒng)
  • HDFS高容錯(cuò)
  • 可擴(kuò)展
  • HDFS適合存儲(chǔ)大文件,不適合存儲(chǔ)小文件
  • 不適合處理低延時(shí)的數(shù)據(jù)方問

3. HDFS初體驗(yàn)

3.1 HDFS命令(20分鐘)

若熟悉基本的linux命令,HDFS學(xué)起來so easy

  • HDFS命令與linux 命令的相似性

  • 參考課件《HDFS命令》

3.2 WEB UI界面

注意:

若在windows下,能夠訪問node01:50070,需要配置C:\Windows\System32\drivers\etc\hosts文件,末尾添加如下三行內(nèi)容

192.168.51.100 node01
192.168.51.110 node02
192.168.51.120 node03

  • 訪問HDFS的web界面,瀏覽器訪問
node01:50070

在這里插入圖片描述

3.3 HDFS編程
  • HDFS java API編程

    • 如何建MAVEN工程:①pom.xml文件;②建包、建類;

    • 如何編寫HDFS讀寫代碼

    • 如何運(yùn)行代碼:

      • 方式①本地運(yùn)行(代碼右鍵->run);

      • 方式②打包運(yùn)行:

      • 如何打包?兩種方式;

      • 方式一(得獨(dú)立安裝maven):

        mvn clean package -DskipTests # 在工程目錄下執(zhí)行
        
      • 方式二:利用IDEA打包

      • 運(yùn)行jar包

        [hadoop@node01 ~]$ hadoop jar com.kaikeba.hadoop-1.0-SNAPSHOT.jar com.kaikeba.hadoop.hdfs.CopyFileFromLocal /kkb/install/hadoop-2.6.0-cdh5.14.2/README.txt /README.txt
        
  • 如何查看官方API文檔
    網(wǎng)址

  • HDFS代碼

    向HDFS上傳文件

    package com.kaikeba.hadoop.hdfs;import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;import java.io.*;
    import java.net.URI;/*** 將本地文件系統(tǒng)的文件通過java-API寫入到HDFS文件*/
    public class CopyFileFromLocal {/*** @param args* args0 windows本地磁盤文件C:/test.txt 或虛擬機(jī)本地磁盤文件/kkb/install/hadoop-2.6.0-cdh5.14.2/README.txt* args1 hdfs上文件hdfs://node01:8020/test.txt*/public static void main(String[] args){//本地磁盤路徑String source = args[0];//先確保/data目錄存在String destination = args[1];//HDFS的路徑InputStream in = null;try {in = new BufferedInputStream(new FileInputStream(source));//HDFS讀寫的配置文件Configuration conf = new Configuration();FileSystem fs = FileSystem.get(URI.create(destination),conf);//調(diào)用Filesystem的create方法返回的是FSDataOutputStream對(duì)象//該對(duì)象不允許在文件中定位,因?yàn)镠DFS只允許一個(gè)已打開的文件順序?qū)懭牖蜃芳?/span>OutputStream out = fs.create(new Path(destination));IOUtils.copyBytes(in, out, 4096, true);} catch (FileNotFoundException e) {System.out.println("exception");e.printStackTrace();} catch (IOException e) {System.out.println("exception1");e.printStackTrace();}}
    }
    

    從HDFS下載文件

    package com.kaikeba.hadoop.hdfs;import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.URI;/*** 從HDFS讀取文件* 打包運(yùn)行jar包 [bruce@node01 Desktop]$ hadoop jar com.kaikeba.hadoop-1.0-SNAPSHOT.jar  com.kaikeba.hadoop.hdfs.ReadFileFromHDFS*/
    public class ReadFileFromHDFS {/*** @param args* args0 hdfs上文件hdfs://node01:8020/test.txt* args1 windows本地磁盤文件C:/01 HK/高級(jí)03班/test01.txt或虛擬機(jī)本地磁盤文件*/public static void main(String[] args) {try {//源文件String srcFile = args[0];Configuration conf = new Configuration();FileSystem fs = FileSystem.get(URI.create(srcFile),conf);FSDataInputStream hdfsInStream = fs.open(new Path(srcFile));//本地文件BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(args[1]));IOUtils.copyBytes(hdfsInStream, outputStream, 4096, true);} catch (IOException e) {e.printStackTrace();}}
    }
    
3.4 小結(jié)
  • 學(xué)習(xí)HDFS命令,學(xué)會(huì)借助help命令

  • 根據(jù)HDFS與linux命令的相似性,舉一反三

  • HDFS API編程時(shí),要學(xué)會(huì)查看官方API文檔(不管什么編程都要會(huì)查看官方API文檔啊~~~)

4. 核心概念block!!!!

4.1 數(shù)據(jù)塊block

4.1.1 HDFS block塊

  • 向HDFS上傳文件,是按照128M為單位,切分成一個(gè)個(gè)block,分散的存儲(chǔ)在集群的不同數(shù)據(jù)節(jié)點(diǎn)datanode上

  • 問:HDFS中一個(gè)44M大小的block塊會(huì)不會(huì)占據(jù)128M的空間?

    • 不會(huì)
    • 小于128M大小的塊不會(huì)占據(jù)128M空間,此例占據(jù)44M
  • 問:這樣存儲(chǔ)有沒有問題?

    • hadoop集群搭建在廉價(jià)的商用服務(wù)器上,所以服務(wù)器有出問題的幾率

    在這里插入圖片描述

4.2 block副本
  • 回答上一個(gè)問題;因?yàn)镠DFS是用普通的商用服務(wù)器搭建起來的;所以有節(jié)點(diǎn)出問題的可能性;

  • 那么如果每個(gè)block只有一份的話,當(dāng)block所在的節(jié)點(diǎn)宕機(jī)后,此block將無法訪問,進(jìn)而導(dǎo)致文件無法完整讀取

  • 為保正數(shù)據(jù)的可用及容錯(cuò),HDFS設(shè)計(jì)成每個(gè)block共有三份,即三個(gè)副本

  • 如何設(shè)置副本數(shù)?

    • replication = 3

    • hdfs-site.xml

    <property><name>dfs.replication</name><value>3</value>
    </property>
    

在這里插入圖片描述

4.3 機(jī)架存儲(chǔ)策略
  • 實(shí)際機(jī)房中,會(huì)有機(jī)架rack,每個(gè)機(jī)架上若干服務(wù)器

在這里插入圖片描述

  • 每個(gè)block有三個(gè)副本;以block1為例
    • 第一副本:在本機(jī)器(rack1機(jī)架中的datanode1)的HDFS目錄下存儲(chǔ)block1的第一個(gè)副本。
    • 第二副本:在不同Rack(如rack2)的某個(gè)DataNode(datanode4)上存儲(chǔ)block1的第二個(gè)副本。
    • 第三副本:在datanode4所在機(jī)架rack2下,找一臺(tái)其它的datanode節(jié)點(diǎn)(如datanode5),存儲(chǔ)block1的第三個(gè)副本。
    • 能有多副本:隨機(jī)節(jié)點(diǎn)

了解下服務(wù)器參數(shù):https://item.jd.com/4564487.html

機(jī)架:https://item.jd.com/16829137698.html

4.4 block的一些操作
  • 設(shè)置文件副本數(shù),有什么用?

    • 數(shù)據(jù)分塊存儲(chǔ)和副本的存放,是保證可靠性和高性能的關(guān)鍵

    • 方式一:使用命令設(shè)置文件副本數(shù);動(dòng)態(tài)生效,不需要重啟hadoop集群

      hadoop fs -setrep -R 4 /path
      
    • 方式二:修改配置文件hdfs-site.xml,需要 重啟hadoop集群才能生效

      <property><name>dfs.replication</name><value>4</value>
      </property>
      
  • HDFS提供了fsck命令,用于檢查HDFS上文件和目錄的健康狀態(tài)、獲取文件的block信息和位置信息

[hadoop@node01 ~]$ hdfs fsck

在這里插入圖片描述

  • 查看文件中損壞的塊
[hadoop@node01 ~]$ hdfs fsck /tmall-201412-1w.csv -list-corruptfileblocks

在這里插入圖片描述

  • 刪除損壞的文件
[hadoop@node01 ~]$ hdfs fsck  /tmall-201412-1w.csv -delete
  • 查看文件的塊基本信息
hdfs fsck /02-041-0029.mp4 -files -blocks -locations

在這里插入圖片描述

4.5 小結(jié)
  • HDFS上的文件分塊存儲(chǔ)
  • 默認(rèn)每個(gè)塊block有3個(gè)副本
  • 考慮機(jī)架存儲(chǔ)策略
  • 關(guān)于block的一些常用命令:hdfs fsck 這個(gè)有時(shí)候會(huì)用到清理一些損壞的文件

5. HDFS架構(gòu)(重點(diǎn) 40分鐘)

在這里插入圖片描述

  • 大多數(shù)分布式大數(shù)據(jù)框架都是主從架構(gòu)
  • HDFS也是主從架構(gòu)Master|Slave或稱為管理節(jié)點(diǎn)|工作節(jié)點(diǎn)
    • 主叫NameNode,中文稱“名稱節(jié)點(diǎn)”
    • 從叫DataNode,中文稱“數(shù)據(jù)節(jié)點(diǎn)”
5.1 NameNode

5.1.1 文件系統(tǒng)

  • file system文件系統(tǒng):操作系統(tǒng)中負(fù)責(zé)管理文件、存儲(chǔ)文件信息的軟件
    • 具體地說,它負(fù)責(zé)為用戶創(chuàng)建文件,存入、讀取、修改、轉(zhuǎn)儲(chǔ)、刪除文件等
  • 讀文件 =>>找到文件 =>> 在哪 + 叫啥?
  • 元數(shù)據(jù)
    • 關(guān)于文件或目錄的描述信息,如文件所在路徑、文件名稱、文件類型等等,這些信息稱為文件的元數(shù)據(jù)metadata
    • 注意:元數(shù)據(jù)的概念在其他的大數(shù)據(jù)中也屢有提及
  • 命名空間
    • 文件系統(tǒng)中,為了便于管理存儲(chǔ)介質(zhì)上的內(nèi)容,給每個(gè)目錄、目錄中的文件、子目錄都起了名字,這樣形成的層級(jí)結(jié)構(gòu),稱之為命名空間
    • 同一個(gè)目錄中,不能有同名的文件或目錄
    • 用處:這樣通過目錄+文件名稱的方式能夠唯一的定位一個(gè)文件
      在這里插入圖片描述

5.1.2 HDFS-NameNode

  • HDFS本質(zhì)上也是文件系統(tǒng)filesystem,所以它也有元數(shù)據(jù)metadata;
  • HDFS元數(shù)據(jù)metadata保存在NameNode內(nèi)存
  • NameNode作用
    • HDFS的主節(jié)點(diǎn)
    • 負(fù)責(zé)管理文件系統(tǒng)的命名空間,將HDFS的元數(shù)據(jù)存儲(chǔ)在NameNode節(jié)點(diǎn)的內(nèi)存中
    • 負(fù)責(zé)響應(yīng)客戶端對(duì)文件的讀寫請(qǐng)求
  • HDFS元數(shù)據(jù)
    • 文件目錄樹、所有的文件(目錄)名稱、文件屬性(生成時(shí)間、副本、權(quán)限)、每個(gè)文件的塊列表、每個(gè)block塊所在的datanode列表

在這里插入圖片描述

  • 每個(gè)文件、目錄、block占用大概150Byte字節(jié)的元數(shù)據(jù);所以HDFS適合存儲(chǔ)大文件,不適合存儲(chǔ)小文件

  • HDFS元數(shù)據(jù)信息以兩種形式保存:①編輯日志edits log②命名空間鏡像文件fsimage

    • edits log:
      • HDFS編輯日志文件 ,保存客戶端對(duì)HDFS的所有更改記錄,如增、刪、重命名文件(目錄),這些操作會(huì)修改HDFS目錄樹;
      • NameNode會(huì)在編輯日志edit日志中記錄下來;
    • fsimage:
      • HDFS元數(shù)據(jù)鏡像文件 ,即將namenode內(nèi)存中的元數(shù)據(jù)落入磁盤生成的文件;
      • 保存了文件系統(tǒng)目錄樹信息以及文件、塊、datanode的映射關(guān)系,如下圖

在這里插入圖片描述

說明:

①為hdfs-site.xml中屬性dfs.namenode.edits.dir的值決定;用于namenode保存edits.log文件

②為hdfs-site.xml中屬性dfs.namenode.name.dir的值決定;用于namenode保存fsimage文件

5.2 DataNode
  • DataNode數(shù)據(jù)節(jié)點(diǎn)的作用
    • 存儲(chǔ)block以及block元數(shù)據(jù)到datanode本地磁盤;
    • 此處的元數(shù)據(jù)包括數(shù)據(jù)塊的長(zhǎng)度、塊數(shù)據(jù)的校驗(yàn)和、時(shí)間戳
5.3 SecondaryNameNode
  • 為什么引入SecondaryNameNode

    • 為什么元數(shù)據(jù)存儲(chǔ)在NameNode在內(nèi)存中?這樣做有什么問題?如何解決?

      • HDFS編輯日志文件 editlog:在NameNode節(jié)點(diǎn)中的編輯日志editlog中,記錄下來客戶端對(duì)HDFS的所有更改的記錄,如增、刪、重命名文件(目錄);每次更改對(duì)應(yīng)一個(gè)事務(wù),每個(gè)事務(wù)有一個(gè)事務(wù)編號(hào);事務(wù)編號(hào)遞增

      • 作用:一旦系統(tǒng)出故障,可以根據(jù)editlog恢復(fù)元數(shù)據(jù);

    • 但editlog日志大小會(huì)隨著時(shí)間變的越來越大,導(dǎo)致系統(tǒng)重啟,根據(jù)日志恢復(fù)元數(shù)據(jù)的時(shí)間會(huì)越來越長(zhǎng);

    • 為了避免這種情況,引入檢查點(diǎn)機(jī)制checkpoint,命名空間鏡像fsimage就是HDFS元數(shù)據(jù)的持久性檢查點(diǎn),即將內(nèi)存中的元數(shù)據(jù)落磁盤生成的文件;

    • 此時(shí),namenode如果重啟,可以將磁盤中的fsimage文件讀入內(nèi)容,將元數(shù)據(jù)恢復(fù)到某一個(gè)檢查點(diǎn),然后再執(zhí)行檢查點(diǎn)之后記錄的編輯日志editlog,最后完全恢復(fù)元數(shù)據(jù)。

    • 但是依然,隨著時(shí)間的推移,editlog記錄的日志會(huì)變多,那么當(dāng)namenode重啟,恢復(fù)元數(shù)據(jù)過程中,會(huì)花越來越長(zhǎng)的時(shí)間執(zhí)行editlog中的每一個(gè)日志;而在namenode元數(shù)據(jù)恢復(fù)期間,HDFS不可用。

    • 為了解決此問題,引入secondarynamenode輔助namenode,用來合并fsimage及editlog

在這里插入圖片描述

  • SecondaryNameNode定期做checkpoint檢查點(diǎn)操作

    • 創(chuàng)建檢查點(diǎn)checkpoint的兩大條件:
      • SecondaryNameNode每隔1小時(shí)創(chuàng)建一個(gè)檢查點(diǎn)

      • 另外,Secondary NameNode每1分鐘檢查一次,從上一檢查點(diǎn)開始,edits日志文件中是否已包括100萬個(gè)事務(wù),如果是,也會(huì)創(chuàng)建檢查點(diǎn)

      • checkpoint相關(guān)屬性(hdfs-site.xml)

    屬性解釋
    dfs.namenode.checkpoint.period3600秒(即1小時(shí))The number of seconds between two periodic checkpoints.
    dfs.namenode.checkpoint.txns1000000The Secondary NameNode or CheckpointNode will create a checkpoint of the namespace every ‘dfs.namenode.checkpoint.txns’ transactions, regardless of whether ‘dfs.namenode.checkpoint.period’ has expired.
    dfs.namenode.checkpoint.check.period60(1分鐘)The SecondaryNameNode and CheckpointNode will poll the NameNode every ‘dfs.namenode.checkpoint.check.period’ seconds to query the number of uncheckpointed transactions.
    • Secondary NameNode首先請(qǐng)求原NameNode進(jìn)行edits的滾動(dòng),這樣新的編輯操作就能夠進(jìn)入新的文件中

    • Secondary NameNode通過HTTP GET方式讀取原NameNode中的fsimage及edits

    • Secondary NameNode讀取fsimage到內(nèi)存中,然后執(zhí)行edits中的每個(gè)操作,并創(chuàng)建一個(gè)新的統(tǒng)一的fsimage文件,有ckpt后綴

    • Secondary NameNode通過HTTP PUT方式將新的fsimage發(fā)送到原NameNode

    • 原NameNode用新的fsimage替換舊的fsimage,同時(shí)系統(tǒng)會(huì)更新fsimage文件到記錄檢查點(diǎn)的時(shí)間。

    • 這個(gè)過程結(jié)束后,NameNode就有了最新的fsimage文件和更小的edits文件

  • SecondaryNameNode一般部署在另外一臺(tái)節(jié)點(diǎn)上

    • 因?yàn)樗枰加么罅康腃PU時(shí)間
    • 并需要與namenode一樣多的內(nèi)存,來執(zhí)行合并操作
  • 如何查看edits日志文件

    hdfs oev -i edits_0000000000000000256-0000000000000000363 -o /home/hadoop/edit1.xml
    
  • 如何查看fsimage文件

    hdfs oiv -p XML -i fsimage_0000000000000092691 -o fsimage.xml  
    
5.4 心跳機(jī)制

在這里插入圖片描述

工作原理:

  1. NameNode啟動(dòng)的時(shí)候,會(huì)開一個(gè)ipc server在那里
  2. DataNode啟動(dòng)后向NameNode注冊(cè),每隔3秒鐘向NameNode發(fā)送一個(gè)“心跳heartbeat
  3. 心跳返回結(jié)果帶有NameNode給該DataNode的命令,如復(fù)制塊數(shù)據(jù)到另一DataNode,或刪除某個(gè)數(shù)據(jù)塊
  4. 如果超過10分鐘NameNode沒有收到某個(gè)DataNode 的心跳,則認(rèn)為該DataNode節(jié)點(diǎn)不可用
  5. DataNode周期性(6小時(shí))的向NameNode上報(bào)當(dāng)前DataNode上的塊狀態(tài)報(bào)告BlockReport;塊狀態(tài)報(bào)告包含了一個(gè)該 Datanode上所有數(shù)據(jù)塊的列表

心跳的作用:

  1. 通過周期心跳,NameNode可以向DataNode返回指令

  2. 可以判斷DataNode是否在線

  3. 通過BlockReport,NameNode能夠知道各DataNode的存儲(chǔ)情況,如磁盤利用率、塊列表;跟負(fù)載均衡有關(guān)

  4. hadoop集群剛開始啟動(dòng)時(shí),99.9%的block沒有達(dá)到最小副本數(shù)(dfs.namenode.replication.min默認(rèn)值為1),集群處于安全模式,涉及BlockReport;

相關(guān)配置項(xiàng)

  • hdfs-default.xml
屬性解釋
dfs.heartbeat.interval3Determines datanode heartbeat interval in seconds. 心跳間隔
dfs.blockreport.intervalMsec21600000 (6小時(shí))Determines block reporting interval in milliseconds. 上傳塊報(bào)告時(shí)間間隔
  • 查看hdfs-default.xml默認(rèn)配置文件

在這里插入圖片描述

5.5 負(fù)載均衡 start-balancer
  • 什么原因會(huì)有可能造成不均衡?

    • 機(jī)器與機(jī)器之間磁盤利用率不平衡是HDFS集群非常容易出現(xiàn)的情況
    • 尤其是在DataNode節(jié)點(diǎn)出現(xiàn)故障或在現(xiàn)有的集群上增添新的DataNode的時(shí)候
  • 為什么需要均衡?

    • 防止熱點(diǎn)出現(xiàn),提升集群存儲(chǔ)資源利用率
    • 從存儲(chǔ)與計(jì)算兩方面提高集群性能
  • 如何手動(dòng)負(fù)載均衡?下邊命令無需重啟hadoop

$HADOOP_HOME/sbin/start-balancer.sh -t 5%	# 磁盤利用率最高的節(jié)點(diǎn)若比最少的節(jié)點(diǎn),大于5%,觸發(fā)均衡
  • 停止負(fù)載均衡
$HADOOP_HOME/sbin/stop-balancer.sh
5.6 小結(jié)
  • NameNode負(fù)責(zé)存儲(chǔ)HDFS集群的元數(shù)據(jù),存在內(nèi)存中
  • DataNode負(fù)責(zé)存儲(chǔ)block塊及塊的元數(shù)據(jù)
  • SecondaryNameNode主要負(fù)責(zé)對(duì)HDFS元數(shù)據(jù)做checkpoint操作
  • 集群的心跳機(jī)制,讓集群中各節(jié)點(diǎn)形成一個(gè)整體;主節(jié)點(diǎn)知道從節(jié)點(diǎn)的死活
  • 節(jié)點(diǎn)的上下線,導(dǎo)致存儲(chǔ)的不均衡,可以手動(dòng)觸發(fā)負(fù)載均衡

6. HDFS讀寫流程(重點(diǎn) 30分鐘)

在這里插入圖片描述

6.1 數(shù)據(jù)寫流程

在這里插入圖片描述

在這里插入圖片描述

6.1.1 詳細(xì)流程

  • 創(chuàng)建文件:

    • HDFS客戶端向HDFS寫數(shù)據(jù),先調(diào)用DistributedFileSystem.create()方法,在HDFS創(chuàng)建新的空文件
    • RPC(ClientProtocol.create())遠(yuǎn)程過程調(diào)用NameNode(NameNodeRpcServer)的create(),首先在HDFS目錄樹指定路徑添加新文件
    • 然后將創(chuàng)建新文件的操作記錄在editslog中
    • NameNode.create方法執(zhí)行完后,DistributedFileSystem.create()返回FSDataOutputStream,它本質(zhì)是封裝了一個(gè)DFSOutputStream對(duì)象
  • 建立數(shù)據(jù)流管道:

    • 客戶端調(diào)用DFSOutputStream.write()寫數(shù)據(jù)
    • DFSOutputStream調(diào)用ClientProtocol.addBlock(),首先向NameNode申請(qǐng)一個(gè)空的數(shù)據(jù)塊
    • addBlock()返回LocatedBlock對(duì)象,對(duì)象包含當(dāng)前數(shù)據(jù)塊的所有datanode的位置信息
    • 根據(jù)位置信息,建立數(shù)據(jù)流管道
  • 向數(shù)據(jù)流管道pipeline中寫當(dāng)前塊的數(shù)據(jù):

    • 客戶端向流管道中寫數(shù)據(jù),先將數(shù)據(jù)寫入一個(gè)檢驗(yàn)塊chunk中,大小512Byte,寫滿后,計(jì)算chunk的檢驗(yàn)和checksum值(4Byte)
    • 然后將chunk數(shù)據(jù)本身加上checksum,形成一個(gè)帶checksum值的chunk(516Byte)
    • 保存到一個(gè)更大一些的結(jié)構(gòu)packet數(shù)據(jù)包中,packet為64kB大小
  • packet寫滿后,先被寫入一個(gè)dataQueue隊(duì)列中

    • packet被從隊(duì)列中取出,向pipeline中寫入,先寫入datanode1,再?gòu)膁atanoe1傳到datanode2,再?gòu)膁atanode2傳到datanode3中
  • 一個(gè)packet數(shù)據(jù)取完后,后被放入到ackQueue中等待pipeline關(guān)于該packet的ack的反饋

    • 每個(gè)packet都會(huì)有ack確認(rèn)包,逆pipeline(dn3 -> dn2 -> dn1)傳回輸出流
  • 若packet的ack是SUCCESS成功的,則從ackQueue中,將packet刪除;否則,將packet從ackQueue中取出,重新放入dataQueue,重新發(fā)送

    • 如果當(dāng)前塊寫完后,文件還有其它塊要寫,那么再調(diào)用addBlock方法(流程同上
  • 文件最后一個(gè)block塊數(shù)據(jù)寫完后,會(huì)再發(fā)送一個(gè)空的packet,表示當(dāng)前block寫完了,然后關(guān)閉pipeline

    • 所有塊寫完,close()關(guān)閉流
  • ClientProtocol.complete()通知namenode當(dāng)前文件所有塊寫完了

6.1.2 容錯(cuò)

  • 在寫的過程中,pipeline中的datanode出現(xiàn)故障(如網(wǎng)絡(luò)不通),輸出流如何恢復(fù)
    • 輸出流中ackQueue緩存的所有packet會(huì)被重新加入dataQueue
    • 輸出流調(diào)用ClientProtocol.updateBlockForPipeline(),為block申請(qǐng)一個(gè)新的時(shí)間戳,namenode會(huì)記錄新時(shí)間戳
    • 確保故障datanode即使恢復(fù),但由于其上的block時(shí)間戳與namenode記錄的新的時(shí)間戳不一致,故障datanode上的block進(jìn)而被刪除
    • 故障的datanode從pipeline中刪除
    • 輸出流調(diào)用ClientProtocol.getAdditionalDatanode()通知namenode分配新的datanode到數(shù)據(jù)流pipeline中,并使用新的時(shí)間戳建立pipeline
    • 新添加到pipeline中的datanode,目前還沒有存儲(chǔ)這個(gè)新的block,HDFS客戶端通過DataTransferProtocol通知pipeline中的一個(gè)datanode復(fù)制這個(gè)block到新的datanode中
    • pipeline重建后,輸出流調(diào)用ClientProtocol.updatePipeline(),更新namenode中的元數(shù)據(jù)
    • 故障恢復(fù)完畢,完成后續(xù)的寫入流程
6.2 數(shù)據(jù)讀流程

6.2.1 基本流程

在這里插入圖片描述

  • 1、client端讀取HDFS文件,client調(diào)用文件系統(tǒng)對(duì)象DistributedFileSystem的open方法
  • 2、返回FSDataInputStream對(duì)象(對(duì)DFSInputStream的包裝)
  • 3、構(gòu)造DFSInputStream對(duì)象時(shí),調(diào)用namenode的getBlockLocations方法,獲得file的開始若干block(如blk1, blk2, blk3, blk4)的存儲(chǔ)datanode(以下簡(jiǎn)稱dn)列表;針對(duì)每個(gè)block的dn列表,會(huì)根據(jù)網(wǎng)絡(luò)拓?fù)渥雠判?#xff0c;離client近的排在前;
  • 4、調(diào)用DFSInputStream的read方法,先讀取blk1的數(shù)據(jù),與client最近的datanode建立連接,讀取數(shù)據(jù)
  • 5、讀取完后,關(guān)閉與dn建立的流
  • 6、讀取下一個(gè)block,如blk2的數(shù)據(jù)(重復(fù)步驟4、5、6)
  • 7、這一批block讀取完后,再讀取下一批block的數(shù)據(jù)(重復(fù)3、4、5、6、7)
  • 8、完成文件數(shù)據(jù)讀取后,調(diào)用FSDataInputStream的close方法

6.2.2 容錯(cuò)

  • 情況一:讀取block過程中,client與datanode通信中斷

    • client與存儲(chǔ)此block的第二個(gè)datandoe建立連接,讀取數(shù)據(jù)
    • 記錄此有問題的datanode,不會(huì)再?gòu)乃献x取數(shù)據(jù)
  • 情況二:client讀取block,發(fā)現(xiàn)block數(shù)據(jù)有問題

    • client讀取block數(shù)據(jù)時(shí),同時(shí)會(huì)讀取到block的校驗(yàn)和,若client針對(duì)讀取過來的block數(shù)據(jù),計(jì)算檢驗(yàn)和,其值與讀取過來的校驗(yàn)和不一樣,說明block數(shù)據(jù)損壞
    • client從存儲(chǔ)此block副本的其它datanode上讀取block數(shù)據(jù)(也會(huì)計(jì)算校驗(yàn)和)
    • 同時(shí),client會(huì)告知namenode此情況;

7. Hadoop HA高可用

7.1 HDFS高可用原理

在這里插入圖片描述

  • 對(duì)于HDFS ,NN存儲(chǔ)元數(shù)據(jù)在內(nèi)存中,并負(fù)責(zé)管理文件系統(tǒng)的命名空間和客戶端對(duì)HDFS的讀寫請(qǐng)求。但是,如果只存在一個(gè)NN,一旦發(fā)生“單點(diǎn)故障”,會(huì)使整個(gè)系統(tǒng)失效。
  • 雖然有個(gè)SNN,但是它并不是NN的熱備份
  • 因?yàn)镾NN無法提供“熱備份”功能,在NN故障時(shí),無法立即切換到SNN對(duì)外提供服務(wù),即HDFS處于停服狀態(tài)。
  • HDFS2.x采用了HA(High Availability高可用)架構(gòu)。
    • 在HA集群中,可設(shè)置兩個(gè)NN,一個(gè)處于“活躍(Active)”狀態(tài),另一個(gè)處于“待命(Standby)”狀態(tài)。
    • 由zookeeper確保一主一備(講zookeeper時(shí)具體展開)
    • 處于Active狀態(tài)的NN負(fù)責(zé)響應(yīng)所有客戶端的請(qǐng)求,處于Standby狀態(tài)的NN作為熱備份節(jié)點(diǎn),保證與active的NN的元數(shù)據(jù)同步
    • Active節(jié)點(diǎn)發(fā)生故障時(shí),zookeeper集群會(huì)發(fā)現(xiàn)此情況,通知Standby節(jié)點(diǎn)立即切換到活躍狀態(tài)對(duì)外提供服務(wù)
    • 確保集群一直處于可用狀態(tài)
  • 如何熱備份元數(shù)據(jù):
    • Standby NN是Active NN的“熱備份”,因此Active NN的狀態(tài)信息必須實(shí)時(shí)同步到StandbyNN。
    • 可借助一個(gè)共享存儲(chǔ)系統(tǒng)來實(shí)現(xiàn)狀態(tài)同步,如NFS(NetworkFile System)、QJM(Quorum Journal Manager)或者Zookeeper。
    • Active NN將更新數(shù)據(jù)寫入到共享存儲(chǔ)系統(tǒng),Standby NN一直監(jiān)聽該系統(tǒng),一旦發(fā)現(xiàn)有新的數(shù)據(jù)寫入,就立即從公共存儲(chǔ)系統(tǒng)中讀取這些數(shù)據(jù)并加載到Standby NN自己內(nèi)存中,從而保證元數(shù)據(jù)與Active NN狀態(tài)一致。
  • 塊報(bào)告:
    • NN保存了數(shù)據(jù)塊到實(shí)際存儲(chǔ)位置的映射信息,為了實(shí)現(xiàn)故障時(shí)的快速切換,必須保證StandbyNN中也包含最新的塊映射信息
    • 因此需要給所有DN配置Active和Standby兩個(gè)NN的地址,把塊的位置和心跳信息同時(shí)發(fā)送到兩個(gè)NN上。

8. Hadoop聯(lián)邦

8.1 為什么需要聯(lián)邦
  • 雖然HDFS HA解決了“單點(diǎn)故障”問題,但HDFS在擴(kuò)展性、整體性能和隔離性方面仍有問題
    • 系統(tǒng)擴(kuò)展性方面,元數(shù)據(jù)存儲(chǔ)在NN內(nèi)存中,受限于內(nèi)存上限(每個(gè)文件、目錄、block占用約150字節(jié))
    • 整體性能方面,吞吐量受單個(gè)NN的影響
    • 隔離性方面,一個(gè)程序可能會(huì)影響其他程序的運(yùn)行,如果一個(gè)程序消耗過多資源會(huì)導(dǎo)致其他程序無法順利運(yùn)行
    • HDFS HA本質(zhì)上還是單名稱節(jié)點(diǎn)
8.2 聯(lián)邦 (多個(gè)命名空間)

在這里插入圖片描述

  • HDFS聯(lián)邦可以解決以上三個(gè)問題
    • HDFS聯(lián)邦中,設(shè)計(jì)了多個(gè)命名空間;每個(gè)命名空間有一個(gè)NN或一主一備兩個(gè)NN,使得HDFS的命名服務(wù)能夠水平擴(kuò)展
    • 這些NN分別進(jìn)行各自命名空間namespace和塊的管理,相互獨(dú)立,不需要彼此協(xié)調(diào)
    • 每個(gè)DN要向集群中所有的NN注冊(cè),并周期性的向所有NN發(fā)送心跳信息和塊信息,報(bào)告自己的狀態(tài)
    • HDFS聯(lián)邦每個(gè)相互獨(dú)立的NN對(duì)應(yīng)一個(gè)獨(dú)立的命名空間
    • 每一個(gè)命名空間管理屬于自己的一組塊,這些屬于同一命名空間的塊對(duì)應(yīng)一個(gè)“塊池”的概念。
    • 每個(gè)DN會(huì)為所有塊池提供塊的存儲(chǔ),塊池中的各個(gè)塊實(shí)際上是存儲(chǔ)在不同DN中的
8.3 擴(kuò)展

聯(lián)邦-官網(wǎng)

9. 文件壓縮

9.1 壓縮算法
  • 文件壓縮好處:

    • 減少數(shù)據(jù)所占用的磁盤空間
    • 加快數(shù)據(jù)在磁盤、網(wǎng)絡(luò)上的IO
  • 常用壓縮格式

    壓縮格式UNIX工具算 法文件擴(kuò)展名可分割
    DEFLATEDEFLATE.deflateNo
    gzipgzipDEFLATE.gzNo
    zipzipDEFLATE.zipYES
    bzipbzip2bzip2.bz2YES
    LZOlzopLZO.lzoNo
    SnappySnappy.snappyNo
  • Hadoop的壓縮實(shí)現(xiàn)類;均實(shí)現(xiàn)CompressionCodec接口

    壓縮格式對(duì)應(yīng)的編碼/解碼器
    DEFLATEorg.apache.hadoop.io.compress.DefaultCodec
    gziporg.apache.hadoop.io.compress.GzipCodec
    bzip2org.apache.hadoop.io.compress.BZip2Codec
    LZOcom.hadoop.compression.lzo.LzopCodec
    Snappyorg.apache.hadoop.io.compress.SnappyCodec
  • 查看集群是否支持本地壓縮(所有節(jié)點(diǎn)都要確認(rèn))

    [hadoop@node01 ~]$ hadoop checknative
    

    在這里插入圖片描述

9.2 編程實(shí)踐
  • 編程:上傳壓縮過的文件到HDFS

    • 對(duì)CopyFileFromLocal代碼做修改,向文件壓縮后,再上傳到HDFS
    • 代碼
package com.kaikeba.hadoop.compress;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.BZip2Codec;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.util.ReflectionUtils;import java.io.*;
import java.net.URI;/**** 將本地文件系統(tǒng)的文件通過java-API寫入到HDFS文件,并且寫入時(shí)使用壓縮*/
public class CopyFileFromLocal {/**** @param args 兩個(gè)參數(shù) C:\test\01_018分鐘.mp4 hdfs://node01:8020/copyFromLocal/01_018分鐘.bz2* @throws ClassNotFoundException*/public static void main(String[] args) throws ClassNotFoundException {//壓縮相關(guān)//壓縮類//HDFS讀寫的配置文件Configuration conf = new Configuration();BZip2Codec codec = new BZip2Codec();codec.setConf(conf);String source = args[0]; //linux或windows中的文件路徑,demo存在一定數(shù)據(jù)String destination="hdfs://node01:8020/copyFromLocal/01_018分鐘.bz2";//HDFS的路徑InputStream in = null;try {in = new BufferedInputStream(new FileInputStream(source));FileSystem fs = FileSystem.get(URI.create(destination),conf);//調(diào)用Filesystem的create方法返回的是FSDataOutputStream對(duì)象//該對(duì)象不允許在文件中定位,因?yàn)镠DFS只允許一個(gè)已打開的文件順序?qū)懭牖蜃芳?/span>OutputStream out = fs.create(new Path(destination));//對(duì)輸出流的數(shù)據(jù)壓縮CompressionOutputStream compressedOut = codec.createOutputStream(out);//流拷貝IOUtils.copyBytes(in, compressedOut, 4096, true);} catch (FileNotFoundException e) {System.out.println("exception");e.printStackTrace();} catch (IOException e) {System.out.println("exception1");e.printStackTrace();}}
}
  • 擴(kuò)展閱讀
    • 《Hadoop權(quán)威指南》 5.2章節(jié) 壓縮
    • HDFS文件壓縮

10. 小文件治理

10.1 HDFS不適合存儲(chǔ)小文件
  • NameNode存儲(chǔ)著文件系統(tǒng)的元數(shù)據(jù),每個(gè)文件、目錄、塊大概有150字節(jié)的元數(shù)據(jù);
  • NN內(nèi)存有限,因此HDFS存儲(chǔ)文件數(shù)量的也有上限,如果小文件過多則會(huì)造成NN的壓力過大
  • 且HDFS能存儲(chǔ)的數(shù)據(jù)總量也會(huì)變小
10.2 HAR文件方案(10分鐘)
  • 此方案本質(zhì)啟動(dòng)mr程序,所以需要啟動(dòng)yarn

在這里插入圖片描述

用法:hadoop archive -archiveName .har -p [-r ]*

在這里插入圖片描述
在這里插入圖片描述

# 創(chuàng)建archive文件;/testhar有兩個(gè)子目錄th1、th2;兩個(gè)子目錄中有若干文件
hadoop archive -archiveName test.har -p /testhar -r 3 th1 th2 /outhar # 原文件還存在,需手動(dòng)刪除# 查看archive文件
hdfs dfs -ls -R har:///outhar/test.har# 解壓archive文件
# 方式一
hdfs dfs -cp har:///outhar/test.har/th1 hdfs:/unarchivef1 # 順序解壓
hadoop fs -ls /unarchivef1	
# 方式二
hadoop distcp har:///outhar/test.har/th1 hdfs:/unarchivef2 # 并行解壓,效率高,啟動(dòng)MR
10.3 Sequence Files方案 !!!

在這里插入圖片描述

  • SequenceFile文件,主要由一條條record記錄組成;
  • 具體結(jié)構(gòu)(如上圖):
    • 一個(gè)SequenceFile首先有一個(gè)4字節(jié)的header(文件版本號(hào))
    • 接著是若干record記錄
    • 每個(gè)record是鍵值對(duì)形式的;鍵值類型是可序列化類型,如IntWritable、Text
    • 記錄間會(huì)隨機(jī)的插入一些同步點(diǎn)sync marker,用于方便定位到記錄邊界
  • SequenceFile文件可以作為小文件的存儲(chǔ)容器;
    • 每條record保存一個(gè)小文件的內(nèi)容
    • 小文件名作為當(dāng)前record的鍵;
    • 小文件的內(nèi)容作為當(dāng)前record的值;
    • 如10000個(gè)100KB的小文件,可以編寫程序?qū)⑦@些文件放到一個(gè)SequenceFile文件。
  • 一個(gè)SequenceFile是可分割的,所以MapReduce可將文件切分成塊,每一塊獨(dú)立操作。
  • 不像HAR,SequenceFile支持壓縮。記錄的結(jié)構(gòu)取決于是否啟動(dòng)壓縮
    • 支持兩類壓縮:
      • 不壓縮NONE,如上圖
      • 壓縮RECORD,如上圖
      • 壓縮BLOCK,如下圖,①一次性壓縮多條記錄;②每一個(gè)新塊Block開始處都需要插入同步點(diǎn)
    • 在大多數(shù)情況下,以block(注意:指的是SequenceFile中的block)為單位進(jìn)行壓縮是最好的選擇
    • 因?yàn)橐粋€(gè)block包含多條記錄,利用record間的相似性進(jìn)行壓縮,壓縮效率更高
    • 把已有的數(shù)據(jù)轉(zhuǎn)存為SequenceFile比較慢。比起先寫小文件,再將小文件寫入SequenceFile,一個(gè)更好的選擇是直接將數(shù)據(jù)寫入一個(gè)SequenceFile文件,省去小文件作為中間媒介.

在這里插入圖片描述

  • 向SequenceFile寫入數(shù)據(jù)
package com.kaikeba.hadoop.sequencefile;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.BZip2Codec;import java.io.IOException;
import java.net.URI;public class SequenceFileWriteNewVersion {//模擬數(shù)據(jù)源;數(shù)組中一個(gè)元素表示一個(gè)文件的內(nèi)容private static final String[] DATA = {"The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models.","It is designed to scale up from single servers to thousands of machines, each offering local computation and storage.","Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer","o delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures.","Hadoop Common: The common utilities that support the other Hadoop modules."};public static void main(String[] args) throws IOException {//輸出路徑:要生成的SequenceFile文件名String uri = "hdfs://node01:8020/writeSequenceFile";Configuration conf = new Configuration();FileSystem fs = FileSystem.get(URI.create(uri), conf);//向HDFS上的此SequenceFile文件寫數(shù)據(jù)Path path = new Path(uri);//因?yàn)镾equenceFile每個(gè)record是鍵值對(duì)的//指定key類型IntWritable key = new IntWritable(); //key數(shù)字 -> int -> IntWritable//指定value類型Text value = new Text();//value -> String -> Text//創(chuàng)建向SequenceFile文件寫入數(shù)據(jù)時(shí)的一些選項(xiàng)//要寫入的SequenceFile的路徑SequenceFile.Writer.Option pathOption       = SequenceFile.Writer.file(path);//record的key類型選項(xiàng)SequenceFile.Writer.Option keyOption        = SequenceFile.Writer.keyClass(IntWritable.class);//record的value類型選項(xiàng)SequenceFile.Writer.Option valueOption      = SequenceFile.Writer.valueClass(Text.class);//SequenceFile壓縮方式:NONE | RECORD | BLOCK三選一//方案一:RECORD、不指定壓縮算法
//        SequenceFile.Writer.Option compressOption   = SequenceFile.Writer.compression(SequenceFile.CompressionType.RECORD);
//        SequenceFile.Writer writer = SequenceFile.createWriter(conf, pathOption, keyOption, valueOption, compressOption);//方案二:BLOCK、不指定壓縮算法
//        SequenceFile.Writer.Option compressOption   = SequenceFile.Writer.compression(SequenceFile.CompressionType.BLOCK);
//        SequenceFile.Writer writer = SequenceFile.createWriter(conf, pathOption, keyOption, valueOption, compressOption);//方案三:使用BLOCK、壓縮算法BZip2Codec;壓縮耗時(shí)間//再加壓縮算法BZip2Codec codec = new BZip2Codec();codec.setConf(conf);SequenceFile.Writer.Option compressAlgorithm = SequenceFile.Writer.compression(SequenceFile.CompressionType.RECORD, codec);//創(chuàng)建寫數(shù)據(jù)的Writer實(shí)例SequenceFile.Writer writer = SequenceFile.createWriter(conf, pathOption, keyOption, valueOption, compressAlgorithm);for (int i = 0; i < 100000; i++) {//分別設(shè)置key、value值key.set(100000 - i);value.set(DATA[i % DATA.length]); //%取模 3 % 3 = 0;System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value);//在SequenceFile末尾追加內(nèi)容writer.append(key, value);}//關(guān)閉流IOUtils.closeStream(writer);}
}
  • 命令查看SequenceFile內(nèi)容
 hadoop fs -text /writeSequenceFile
  • 讀取SequenceFile文件
package com.kaikeba.hadoop.sequencefile;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.util.ReflectionUtils;import java.io.IOException;public class SequenceFileReadNewVersion {public static void main(String[] args) throws IOException {//要讀的SequenceFileString uri = "hdfs://node01:8020/writeSequenceFile";Configuration conf = new Configuration();Path path = new Path(uri);//Reader對(duì)象SequenceFile.Reader reader = null;try {//讀取SequenceFile的Reader的路徑選項(xiàng)SequenceFile.Reader.Option pathOption = SequenceFile.Reader.file(path);//實(shí)例化Reader對(duì)象reader = new SequenceFile.Reader(conf, pathOption);//根據(jù)反射,求出key類型對(duì)象Writable key = (Writable)ReflectionUtils.newInstance(reader.getKeyClass(), conf);//根據(jù)反射,求出value類型對(duì)象Writable value = (Writable)ReflectionUtils.newInstance(reader.getValueClass(), conf);long position = reader.getPosition();System.out.println(position);while (reader.next(key, value)) {String syncSeen = reader.syncSeen() ? "*" : "";System.out.printf("[%s%s]\t%s\t%s\n", position, syncSeen, key, value);//移動(dòng)到下一個(gè)record開頭的位置position = reader.getPosition(); // beginning of next record}} finally {IOUtils.closeStream(reader);}}
}

11. 文件快照(10分鐘)

11.1 什么是快照
  • 快照比較常見的應(yīng)用場(chǎng)景是數(shù)據(jù)備份,以防一些用戶錯(cuò)誤或?yàn)?zāi)難恢復(fù)
  • 快照snapshots是HDFS文件系統(tǒng)的,只讀的、某時(shí)間點(diǎn)的拷貝
  • 可以針對(duì)某個(gè)目錄,或者整個(gè)文件系統(tǒng)做快照
  • 創(chuàng)建快照時(shí),block塊并不會(huì)被拷貝??煺瘴募兄皇怯涗浟薭lock列表和文件大小,不會(huì)做任何數(shù)據(jù)拷貝
11.2 快照操作
  • 允許快照

    允許一個(gè)快照目錄被創(chuàng)建。如果這個(gè)操作成功完成,這個(gè)目錄就變成snapshottable

    用法:hdfs dfsadmin -allowSnapshot

    hdfs dfsadmin -allowSnapshot /wordcount
    
  • 禁用快照

    用法:hdfs dfsadmin -disallowSnapshot

    hdfs dfsadmin -disallowSnapshot /wordcount
    
  • 創(chuàng)建快照(snapshotDir必須是snapshottable)

    用法:hdfs dfs -createSnapshot []

    #注意:先將/wordcount目錄變成允許快照的
    hdfs dfs -createSnapshot /wordcount wcSnapshot
    
  • 查看快照

    hdfs dfs -ls /wordcount/.snapshot
    

在這里插入圖片描述

  • 重命名快照

    這個(gè)操作需要擁有snapshottabl目錄所有者權(quán)限

    用法:hdfs dfs -renameSnapshot

    hdfs dfs -renameSnapshot /wordcount wcSnapshot newWCSnapshot
    
  • 用快照恢復(fù)誤刪除數(shù)據(jù)

    HFDS的/wordcount目錄,文件列表如下

    在這里插入圖片描述

    誤刪除/wordcount/edit.xml文件

    hadoop fs -rm /wordcount/edit.xml
    

    在這里插入圖片描述

    恢復(fù)數(shù)據(jù)

    hadoop fs -cp /wordcount/.snapshot/newWCSnapshot/edit.xml /wordcount
    
  • 刪除快照

    這個(gè)操作需要擁有snapshottabl目錄所有者權(quán)限

    用法:hdfs dfs -deleteSnapshot

    hdfs dfs -deleteSnapshot /wordcount newWCSnapshot
    

拓展總結(jié)

  1. HDFS存儲(chǔ)地位

  2. block塊為什么設(shè)置的比較大(面試)

  • 磁盤基礎(chǔ)知識(shí)
    • 盤片platter、磁頭head、磁道track、扇區(qū)sector、柱面cylinder
    • 為了最小化尋址開銷;從磁盤傳輸數(shù)據(jù)的時(shí)間明顯大于定位這個(gè)塊開始位置所需的時(shí)間
  • 問:塊的大小是不是設(shè)置的越大越好呢?
    在這里插入圖片描述
  1. 擴(kuò)展閱讀:《HDFS新特性》

  2. 參考書籍:《Hadoop權(quán)威指南 第4版》

  3. 總結(jié): 在這里插入圖片描述

http://www.risenshineclean.com/news/32873.html

相關(guān)文章:

  • 公眾號(hào)的微網(wǎng)站開發(fā)營(yíng)銷型網(wǎng)站建設(shè)排名
  • 南京代做網(wǎng)站濟(jì)南百度競(jìng)價(jià)代運(yùn)營(yíng)
  • c 做網(wǎng)站如何調(diào)用dll免費(fèi)源碼網(wǎng)站
  • 公司怎么建立自己網(wǎng)站百度推廣價(jià)格價(jià)目表
  • php app網(wǎng)站建設(shè)武漢seo管理
  • 藍(lán)色大氣網(wǎng)站欣賞視頻推廣平臺(tái)
  • 手機(jī)企業(yè)網(wǎng)站制作企業(yè)網(wǎng)頁(yè)設(shè)計(jì)公司
  • 網(wǎng)站建設(shè)夢(mèng)幻創(chuàng)意百度文庫(kù)官網(wǎng)
  • php做的網(wǎng)站安全嗎今天的新聞?lì)^條
  • 什么公司在百度做網(wǎng)站常州seo關(guān)鍵詞排名
  • 做網(wǎng)站實(shí)習(xí)日志寧波seo怎么做引流推廣
  • 陽(yáng)泉購(gòu)物網(wǎng)站開發(fā)設(shè)計(jì)市場(chǎng)營(yíng)銷策劃
  • 網(wǎng)站網(wǎng)絡(luò)廣告如何建設(shè)自助建站免費(fèi)搭建個(gè)人網(wǎng)站
  • 織夢(mèng)網(wǎng)站后臺(tái)關(guān)鍵詞推廣優(yōu)化app
  • 婚禮顧問網(wǎng)站介紹模版有哪些營(yíng)銷推廣方式
  • 用php做動(dòng)態(tài)網(wǎng)站嗎企業(yè)中層管理人員培訓(xùn)課程
  • 手機(jī)網(wǎng)站內(nèi)容模塊如何進(jìn)行網(wǎng)站宣傳推廣
  • 58網(wǎng)站怎么做優(yōu)化迅雷磁力鏈bt磁力種子
  • 合肥疫情風(fēng)險(xiǎn)等級(jí)思億歐seo靠譜嗎
  • 天津企業(yè)網(wǎng)站建站做一個(gè)公司網(wǎng)站大概要多少錢
  • 用自己電腦做網(wǎng)站的空間百度自媒體注冊(cè)入口
  • 南寧seo費(fèi)用服務(wù)短視頻seo系統(tǒng)
  • 黨政機(jī)關(guān)如何建設(shè)網(wǎng)站企業(yè)推廣網(wǎng)絡(luò)營(yíng)銷外包服務(wù)
  • 做網(wǎng)站如何與美工配合日本比分預(yù)測(cè)
  • 網(wǎng)站開發(fā)速成班網(wǎng)絡(luò)軟文怎么寫
  • 天津建設(shè)工程信息網(wǎng) 官網(wǎng)首頁(yè)seo排名點(diǎn)擊器曝光行者seo
  • 鄂州做網(wǎng)站公司推廣營(yíng)銷軟件app
  • 建設(shè)銀行梅州分行網(wǎng)站廈門seo怎么做
  • 武漢 網(wǎng)站制作案例北京建站
  • 平頂山網(wǎng)站建設(shè)費(fèi)用競(jìng)價(jià)排名是什么