Hadoop原理彙總(一)——HDFS

摘要:本文主要對hadoop的原理性知識進行彙總,包括核心組件、HDFS存儲原理、HDFS shell命令、HDFS Java端API、MapReduce基本原理、shuffle基本原理、sort過程等。

原文:http://blog.csdn.net/u010255818/article/details/72730864

1 Hadoop核心組件

  1. 生態系統圖 
    這裏寫圖片描述

  2. HDFS文件系統 
    它是一個高度容錯的系統,能檢測和應對硬件故障,用於在低成本的通用硬件上運行。HDFS簡化了文件的一致性模型,通過流式數據訪問,提供高吞吐量應用程序數據訪問功能,適合帶有大型數據集的應用程序。 
    這裏寫圖片描述 
    ● Client:切分文件;與NameNode交互,獲取文件位置信息;與DataNode交互,讀取和寫入數據。 
    ● NameNode:管理HDFS的文件命名空間,處理客戶端請求。 
    ● DataNode:存儲實際的數據,彙報存儲信息給NameNode。 
    ● Secondary NameNode:定期合併NameNode的fsImage(文件鏡像)和fsEdits(操作日誌),推送給NameNode;可輔助恢復NameNode。

  3. MapReduce分佈式計算框架 
    Map對數據集上的獨立元素進行指定的操作,生成鍵-值對形式中間結果。Reduce則對中間結果中相同 “鍵”的所有“值”進行規約,以得到最終結果。 
    這裏寫圖片描述 
    JobTracker:管理所有作業,將任務分解成一系列任務,並分派給TaskTracker。 
    TaskTracker:運行Map Task和Reduce Task;並與JobTracker交互,彙報任務狀態。 
    Map Task:解析每條數據記錄,傳遞給用戶編寫的map(),將輸出結果寫入本地磁盤。 
    Reducer Task:從Map Task的執行結果中,遠程讀取輸入數據,對數據進行排序,將數據按照分組傳遞給用戶編寫的reduce函數執行。 
    這裏寫圖片描述

  4. Hive數據倉庫 
    Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉化爲MapReduce任務在Hadoop上執行。通常用於離線分析 
    這裏寫圖片描述

  5. HBase數據庫 
    HBase 是一個面向列的動態模式數據庫,鍵由行關鍵字、列關鍵字和時間戳構成。HBase提供了對大規模數據的隨機、實時讀寫訪問,HBase中保存的數據可以使用MapReduce來處理,它將數據存儲和並行計算完美地結合在一起。 
    數據模型:Schema-->Table-->Column Family-->Column-->RowKey-->TimeStamp-->Value 
    這裏寫圖片描述

  6. zookeeper分佈式協作服務 
    解決分佈式環境下的數據管理問題:統一命名,狀態同步,集羣管理,配置同步等

  7. sqoop數據同步工具 
    Sqoop是SQL-to-Hadoop的縮寫,主要用於傳統數據庫和Hadoop之前傳輸數據。 
    數據的導入和導出本質上是Mapreduce程序,充分利用了MR的並行化和容錯性。

  8. pig數據流系統 
    設計動機是提供一種基於MapReduce的ad-hoc(計算在query時發生)數據分析工具 
    定義了一種數據流語言—Pig Latin,將腳本轉換爲MapReduce任務在Hadoop上執行。 
    通常用於進行離線分析

  9. Mahout數據挖掘算法庫 
    Mahout 的主要目標是創建一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。Mahout現在已經包含了聚類、分類、推 薦引擎(協同過濾)和頻繁集挖掘等廣泛使用的數據挖掘方法。除了算法,Mahout還包含數據的輸入/輸出工具、與其他存儲系統(如數據庫、 MongoDB 或Cassandra)集成等數據挖掘支持架構。

  10. Flume日誌收集工具 
    將數據從產生、傳輸、處理並最終寫入目標的路徑的過程抽象爲數據流。在具體的數據流中,數據源支持在Flume中定製數據發送方,從而支持收集各種不同協議數據。同時,Flume數據流提供對日誌數據進行簡單處理的能力,如過濾、 格式轉換等。此外,Flume還具有能夠將日誌寫往各種數據目標(可定製)的能力。

2 HDFS存儲原理

2.1 HDFS整體結構

這裏寫圖片描述

(1)NameNode 
  管理數據節點和文件塊的映射關係;處理客戶端對數據的讀寫請求。 
  NameNode保存了兩個核心的數據結構FsImage和EditLog。FsImage用於維護文件系統樹以及元數據;EditLog記錄了文件的操作。NameNode不持久化Block與DataNode的映射信息,而是在系統每次啓動時掃描所有DataNode來重構這些信息。

(2)DataNode 
  負責數據的存儲和讀取;向NameNode定期發送自己的存儲塊信息;週期性地向NameNode發送心跳信息報告自己的狀態。
  HDFS集羣中只有一個NameNode,負責所有元數據的管理;有若干DataNode,每個DataNode運行在一個獨立節點上。

(3)SecondaryNameNode 
  對NameNode進行備份。週期性地從NameNode下載EditLog與FsImage,將EditLog與FsImage合併得到FsImage.ckpt,將合併後的FsImage.ckpt上傳到NameNode,更新NameNode的EditLog與FsImage。

(4)讀寫過程 
  客戶端向HDFS寫文件時,先請求NameNode節點獲取分配的存儲位置,然後根據存儲位置直接把數據寫入DataNode;客戶端向HDFS讀數據時,先請求NameNode獲取文件塊和數據節點的映射關係,然後直接到數據節點訪問相應位置的文件塊

2.2 關於Block大小

(1)HDFS默認文件塊Block大小爲64MB,如果一個文件小於Block,則它並不佔用整個Block空間大小。

(2)Block不宜過大,MapReduce的Map任務一次只能處理一個Block的數據,Block過大會使啓動的Map數量過少,影響並行處理速度。

(3)HDFS無法高效存儲大量小文件

檢索效率:HDFS中NameNode的元數據保存在內存中,過多的小文件需要大量內存空間,降低數據檢索效率; 
尋址開銷:訪問大量小文件,需要不斷從一個DataNode跳到另一個DataNode,尋址開銷增大; 
線程開銷:MapReduce處理大量小文件時會產生過多的Map任務,線程管理開銷會大大增加;

2.3 HDFS數據存取策略

(1)數據存放 
  HDFS默認冗餘參數是3,一個Block會保存在3個地方。兩份副本存放在同一機架的不同機器上,第三個副本存放在不同機架的機器上,即保證高可靠性,又提高讀寫性能。 
(2)數據讀取 
  客戶端從名稱節點獲取不同副本的存放位置列表,當發現有數據副本的機架與客戶端機架相同時,優先選擇該副本;否則,隨機選取一個副本。 
(3)數據複製 
  採用流水線複製策略。Client向HDFS寫文件時,先將文件寫到本地,並切分成若干塊,每個塊都向NameNode發送寫請求。Client根據DataNode的使用情況,返回一個節點列表給客戶端。客戶端把數據首先寫入第一個DataNode,同時把節點列表傳給第一個DataNode;當第一個DataNode接收4KB數據時,寫入本地,並向列表的第二個DataNode發起連接,把接收到的4KB數據和節點列表傳給第二個DataNode;依次列推,列表中的多個數據節點形成一條數據複製流水線。當文件寫完時,數據複製也同時完成。

2.4 數據錯誤與恢復

NameNode出錯:利用SecondaryNode中的FsImage與EditLog數據進行恢復

DataNode出錯:DataNode定期向NameNode發送心跳信息報告自己的狀態,超時未收到心跳信息會被標記爲宕機,該DataNode不再可用。NameNode一旦發現某個Block的副本數量小於冗餘因子,則對數據進行冗餘複製。

數據出錯:網絡傳輸與磁盤錯誤等因素均會造成數據錯誤。讀取數據時,客戶端會採用MD5和shal對數據塊進行校驗;寫數據時,將文件塊的信息摘錄寫入同一路徑的隱藏文件,在讀取時進行校驗,如果校驗失敗則請求讀取另一副本,並報告NameNode。

3 HDFS的Shell操作

HDFS的shell操作中部分基於hadoop工具的操作已經被hdfs工具替代,但仍有一些基於hadoop工具的操作未被替代。 
(1)hdfs工具 
這裏寫圖片描述

(2)hadoop工具 
這裏寫圖片描述

(3)主要命令

hdfs namenode -format                           格式化DFS文件系統
hdfs [namenode | secondaryNameNode | datanode]  啓動命令
hdfs dfsadmin -safemode [enter | leave]         進入或退出安全模式
  • 1
  • 2
  • 3

這裏寫圖片描述

hdfs balancer                                   手動負載均衡
hdfs getconf [-namenodes | -secondaryNameNodes | -backupNodes | -nnRpcAddresses]    獲取配置信息

hadoop 
hadoop jar <xx.jar> <mainClass> [args, args]        運行jar文件
hadoop fs                                   運行通用文件系統用戶客戶端
hdfs dfs                                        運行hadoop支持的文件系統命令
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

hadoop fs命令參數與hdfs dfs命令參數完全一致,HDFS中hdfs dfs工具替代了hadoop fs工具: 
這裏寫圖片描述

4 HDFS Java端API

(1)Configuration類

public class Configuration extends Object implements Iterable<Map.Entry<String,String>>, Writable {
// 提供配置參數,如果沒有具體指明,hadoop從core-site.xml中獲取配置信息
    //構造方法
    public Configuration() {}
    public Configuration(Configuration conf) {}
    public Configuration(boolean loadDefaults) {}//是否從默認文件core-site.xml中讀取配置信息

    //set與get
    public String get(String name) {}//根據屬性名獲取值,屬性不存在時返回null
    public String get(String name, String defaultValue){}
    public void set(String name, String value) {}

    //迭代遍歷
    public Iterator<Map.Entry<String,String>> iterator(){}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(2)FileSystem 
第一個無參構造方法返回默認文件系統,即core-site.xml中fs.defaultFS項,若未設置則默認返回本地文件系統;其他帶URI參數的構造方法通過URI參數指定文件系統。

public abstract class FileSystem extends Configured implements Closeable {
//通用文件系統的抽象基類
    //工廠模式,獲取實例
    public static FileSystem get(Configuration conf) throws IOException {}
    public static FileSystem get(URI uri, Configuration conf, String user) throws IOException
    public static FileSystem get(URI uri, Configuration conf) throws IOException {}
    public static LocalFileSystem getLocal(Configuration conf) throws IOException {}
    public static FileSystem newInstance(URI uri, Configuration conf) throws IOException

    //創建輸出/輸入流對象
    public FSDataOutputStream create(Path f, boolean overwrite, int bufferSize) throws IOException
    public FSDataInputStream open(Path f) throws IOException
    public FSDataOutputStream append(Path f, int bufferSize) throws IOException
    public void concat(Path trg, Path[] psrcs) throws IOException{} //Concat existing files together

    //文件移動
    public void moveFromLocalFile(Path src, Path dst) throws IOException{} //從本地向HDFS移動文件
    public void moveToLocalFile(Path src, Path dst) throws IOException{} //從HDFS向本地移動文件
    public void copyFromLocalFile(boolean delSrc, boolean overwrite, Path src, Path dst) throws IOException{} //從本地向HDFS複製文件
    public void copyToLocalFile(boolean delSrc, Path src, Path dst) throws IOException{} //從HDFS向本地複製文件
    public abstract boolean rename(Path src, Path dst) throws IOException{} //在本地磁盤間或HDFS之間移動文件,即重命名

    //判斷方法
    public boolean exists(Path f) throws IOException{} //判斷文件或目錄是否存在
    public boolean isDirectory(Path f) throws IOException{}
    public boolean isFile(Path f) throws IOException{}

    //創建目錄
    public boolean mkdirs(Path f) throws IOException{}

    //刪除文件或目錄
    public abstract boolean delete(Path f, boolean recursive) throws IOException

    //獲取文件統計信息
    public FsStatus getStatus(Path p) throws IOException
    public FileStatus[] listStatus(Path f, PathFilter filter) throws FileNotFoundException, IOException

    //關閉
    public void close() throws IOException{}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

(3)FSDataInputStream,繼承自java.io.DataInputStream

public class FSDataInputStream extends DataInputStream implements...{
    //構造方法
    public FSDataInputStream(InputStream in) {}

    //讀指針相關方法
    public void seek(long desired) throws IOException{}
    public long getPos() throws IOException{}

    //讀操作
    public int read(long position, byte[] buffer, int offset, int length) throws IOException
    public void readFully(long position, byte[] buffer, int offset, int length) throws IOException
    /*read(byte[] b)方法實質是讀取流上的字節直到流上沒有字節爲止,如果當聲明的字節數組長度大於流上的數據長度時就提前返回,
    而readFully(byte[] b)方法是讀取流上指定長度的字節數組,也就是說如果聲明瞭長度爲len的字節數組,
    readFully(byte[] b)方法只有讀取len長度個字節的時候才返回,否則阻塞等待,如果超時,則會拋出異常 EOFException*/
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(4)FSDataOutputStream,繼承自java.io.DataOutputStream

public class FSDataOutputStream extends DataOutputStream implements...{
//寫方法全部繼承自父類
}
  • 1
  • 2
  • 3

(5)FileStatus

public class FileStatus{
    //構造方法
    public FileStatus(){}

    //判斷方法
    public boolean isFile(){};
    public boolean isDirectory(){};

    //get方法
    public long getLen(){};
    public long getBlockSize(){};
    public short getReplication(){};
    public String getOwner(){};

    public Path getPath(){};

    //set方法
    public void setPath(Path p){};
    protected void setOwner(String owner){};
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

(6)Path

public class Path extends Object implements Comparable {
    //構造方法
    public Path(String parent, String child){}
    public Path(URI uri){}

    //合併路徑
    public static Path mergePaths(Path path1, Path path2) {}

    public URI toUri(){};

    //get方法
    public FileSystem getFileSystem(Configuration conf) throws IOException {}
    //該方法可獲取fs對象,在輸出路徑存在的情況下刪除輸出路徑

    public String getName(){} //Returns the final component of this path
    public Path getParent(){} //Returns the parent of a path or null if at root

    //判斷方法
    public boolean isAbsolute(){};
    public boolean isRoot(){};
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

(7)URI,java.net.URI

public final class URI extends Object implements Comparable<URI>, Serializable {
    //構造方法
    public URI(String str) {};
    public URI(String scheme, String host, String path, String fragment) {};
}
  • 1
  • 2
  • 3
  • 4
  • 5

(8)PathFilter

public interface PathFilter{
    boolean accept(Path path);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章