1. 程式人生 > >hadoop系列之HDFS 原理與實戰

hadoop系列之HDFS 原理與實戰

HDFS檔案系統

  1. HDFS簡介

HDFS 是 Hadoop Distributed File System 的簡稱,即 Hadoop 分散式檔案系統。它起源於谷歌發表的 GFS 論文, 是該論文的開源實現,也是整個大資料的基礎。

HDFS 專門為解決大資料的儲存問題而產生的,具有如下特點:

      可儲存超大檔案:HDFS 可儲存 PB 級的資料

      流式資料訪問:一次寫入,多次讀取。資料集通常從資料來源複製而來,每次分析都涉及該資料集的

     商用硬體:Hadoop 不需要執行在高昂可靠的硬體上.,它是設計執行在普通的商用硬體上,節點的故障不會影響到系統的執行。

不適用的場景:

  1.低延時的資料訪問:HDFS 是為高資料吞吐量而設計的,這會以提高時間延遲為代價。因此,對於低延時的訪問需求不適合在 HDFS 上。

2.大量的小檔案:由於 namenode 將檔案系統的元資料儲存在記憶體中,因此該檔案系統所能儲存的檔案總數受限於 namenode 的記憶體容量。

3.多使用者寫入,隨意修改檔案:HDFS 中的檔案只支援單個寫入者,而且不支援在任意位置進行修改。

HDFS檔案塊

每個磁碟有預設的資料塊,這是磁碟讀寫的最小單位。檔案系統的塊大小一般為磁碟塊的整數倍。磁碟塊大小一般為 512 位元組。

HDFS 檔案系統也有塊(block)的概念,預設值為 128M,也可以修改。超過塊大小的檔案在儲存的時候會被分為多個分塊(chunk)。有點需要注意:HDFS 中小於一個塊大小的檔案不會佔據整個塊的空間,而單一磁碟中如果檔案小於塊大小,那麼整個磁碟塊的空間都會被佔用。

對檔案進行分塊儲存有很多好處,比如:

1.檔案的大小可以不受限於單個磁碟的容量;

2.檔案的所有塊不必儲存在同一個磁碟上,可以利用叢集上的任意一個磁碟進行儲存;

3.將檔案分塊儲存便於備份和容錯,提高可用性。

HDFS 的檔案塊資訊可以通過 fsck 命令檢視,比如:

hdfs fsck / -files -blocks

另外,對於訪問頻繁的檔案,其對應的塊可能會被顯示地快取在記憶體中。

HDFS節點

namenode

namenode 維護 HDFS 檔案系統的元資料。所謂元資料,就是資料的資料。即儲存在 HDFS 檔案系統上的資料的基本資訊,比如檔案系統樹及整棵樹內所有的檔案和目錄,每個檔案中各個資料塊所在資料節點資訊,但並不永久儲存塊的位置資訊,因為這塊可能隨時變化。這部分的資訊在系統啟動的時候根據資料節點的資訊重 建。

datanode

datanode 是 HDFS 檔案系統儲存具體資料的節點。它們根據 namenode 節點的排程來儲存和檢索檔案的資料塊。由於檔案的元資料都儲存在 namenode,如果沒有 namenode,檔案系統將無法工作,如果 namenode 的資料損壞,那麼儲存在 datanode 上的資料就作廢了。

因此,對 namenode 的容錯顯得非常重要。

通常 來說,可以通過 NFS 或者 HA 的方式來確保 HDFS 的高可用。

HDFS HA高可用叢集

HDFSHA概述

在完全分散式 HDFS 叢集中,即使通過 namenode 備份還是無法做到及時的檔案系統高可用,namenode 存在單點故障(SPOF,Single Point Of Failure)。

對於一個大型叢集來說,冷啟動的時間樂觀情況下一般都需要半個小時以上,甚至更多。因此,Hadoop2 增加了 HDFS 的高可用 HA(High Availability)的支援。

HDFS HA 有兩種方案,NFS 和 QJM。這裡推薦使用 QJM

為了保障 HDFS 叢集的高可用,需要實現主備(active-standby) namenode。

HDFSHA架構下面是 HDFS HA 的架構

HDFS HA 架構圖

基於 QJMHDFSHA實現

QJM,Quorum Journal Manager,也就是群裡日誌管理器。它是一個專用的 HDFS 實現,為提供一個高可用編輯日誌而設計,應用於大多數的 HDFS 部署。QJM 包含一組日誌節點(Journal Node),NameNode 每次寫入的時候必須寫入多數的日誌節點。

典型的情況,有三個日誌節點,系統能夠容忍任何一個節點的失效。NameNode 就是通過一組 JournalNodes 的獨立程序進行相互通訊,來實現資料的同步。

當 Active 狀態的 NameNode 的名稱空間有任何修改時,會通知大部分的 JournalNodes 程序。Standby 狀態的

NameNode 會讀取 JournalNodes 中的變更資訊,並且一直監控 editlog 的變化,把變化應用於自己的名稱空間。

Standby 節點可以確保在叢集出錯時,名稱空間狀態已經完全同步了。

HDFS的檔案容錯測試

測試目的:測試 HDFS 在節點發生故障時,是否會發生資料丟失的情況。

第一步:準備一個簡單的文字檔案

vi hdfsha.txt

This is a test file for hdfs.replication. hdfs dfs -mkdir /user/test

第二步:上傳該檔案到 HDSF 檔案系統[[email protected] ~]# hdfs dfs -put hdfsha.txt /user/test/ [[email protected] ~]# hdfs dfs -cat /user/test/hdfsha.txt

第三步:關閉任意兩個 DataNode 節點,然後讀取該檔案先關閉一臺,測試

[[email protected] ~]# hadoop-daemon.sh stop datanode [[email protected] ~]# hdfs dfs -cat /user/test/hdfsha.txt

關鍵日誌資訊:

WARN hdfs.DFSClient: Failed to connect to /192.168.159.206:50010 for block, add to deadNodes and continue.

INFO hdfs.DFSClient: Successfully connected to /192.168.159.208:50010

結果:成功從第三臺機器獲取到檔案。

先關閉第二臺(選上次讀取成功的那臺),測試[[email protected] ~]# hadoop-daemon.sh stop datanode [[email protected] ~]# hdfs dfs -cat /user/test/hdfsha.txt

關鍵日誌資訊:

WARN hdfs.DFSClient: Failed to connect to /192.168.159.206:50010 for block, add to deadNodes and continue. WARN hdfs.DFSClient: Failed to connect to /192.168.159.208:50010 for block

INFO hdfs.DFSClient: Successfully connected to /192.168.159.207:50010

結果:成功從第二臺機器獲取到檔案。第四步:關閉第三臺

[[email protected] ~]# hadoop-daemon.sh stop datanode [[email protected] ~]# hdfs dfs -cat /user/test/hdfsha.txt 徹底 Over,無法成功獲取檔案。

    1. HDFS命令列基本操作

通過“hdfs -help”和“hdfs dfs -help”檢視幫助

HDFS 的檔案操作命令跟 Linux 的操作命令大多類似。

建立目錄

[[email protected] ~]# hdfs dfs -mkdir -p /user/$USER

當前為 root 使用者,因此會建立/user/root 目錄。

檢視剛建立的目錄

[[email protected] ~]# hdfs dfs -ls /user

上傳檔案

[[email protected] ~]# echo "Test file content" > testfile

[[email protected] ~]# hdfs dfs -put testfile /user/root/

檢視剛複製到 hdfs 的 檔案

[[email protected] ~]# hdfs dfs -ls /user/root/

讀取檔案

直接展示

[[email protected] ~]# hdfs dfs -cat /user/root/testfile

獲取到本地檔案系統

[[email protected] ~]# hdfs dfs -get /user/root/testfile

刪除檔案

刪除單個檔案

[[email protected] ~]# hdfs dfs -rm /user/root/testfile

刪除目錄

[[email protected] ~]# hdfs dfs -rm -r /user/root

HDFSHadoop命令

Hadoop 支援的檔案系統包括:本地檔案系統 Local FileSystem、HDFS、WebHDFS、Secure WebHDFS、

HAR、View、FTP、S3、Azure 和 Swift。

hadoop fs 面向是是一個抽象的檔案系統,支援多種檔案系統的實現。通過 uri 字首來識別。

hadoop dfs 已經被棄用(deprecated),執行的時候會被替換為 hdfs dfs 命令執行。

hdfs dfs 專門針對 HDFS 檔案系統的操作。

DistCp跨叢集拷貝資料

DistCp 是 Distributed Copy 的縮寫,即分散式拷貝,它是一個叢集中間資料拷貝的工具。

它使用 Map/Reduce 實現檔案分發,錯誤處理和恢復,以及報告生成。 它把檔案和目錄的列表作為 map 任務的輸入,每個任務會完成源列表中部分檔案的拷貝。 由於使用了 Map/Reduce 方法,這個工具在語義和執行上都會有特殊的地方。

一般格式:

hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

HDFS壓縮與分片

HDFS壓縮

檔案壓縮有兩大好處:

  1. 減少儲存檔案所需要的磁碟空間,節約硬體成本;
  2. 減少讀取的時間和在網路上傳輸的頻寬需求。

由於大資料的場景下,資料量比較大,高效率的壓縮就顯得更為重要。Hadoop 支援的壓縮格式包括:

選則壓縮方法的時候,還需要考慮壓縮方法的時間效率和空間效率,也就是壓縮速度的快慢與壓縮的比率。注:LZO 可以通過建索引的方式來支援切分。

HDFS分片

MapReduce 在處理資料的時候,如果資料經過了壓縮,那麼瞭解這些壓縮格式是否支援切分(splitting)是很重要的。

比如,一個壓縮完之後為 1G 的檔案,根據 128M 的預設塊大小,檔案會被儲存為 8 個塊。如果該壓縮格式支援切分,那麼 MapReduce 就可以將每個資料單獨作為一個分片讓 map 來工作,這樣就可以有 8 個 map 任務同時執行。但是如果該壓縮格式不支援切分,那麼單個數據塊就無法讓 map 支援工作,它需要將 8 個數據塊都讀到一起才能工作。這樣有兩個缺點:

8 個數據塊通常儲存在不同的 DataNode 節點上,讀取到一起會犧牲資料的本地性,減緩處理速度;

map 任務數減少了,作業的粒度變大,整體執行的時間變長。

HDFS檔案格式

檔案格式概述

HDFS 支援多種檔案格式,如:Text Files、CSV Files、JSON Records、Sequence Files,Avro Files、Parquet

Files、RC Files、ORC Files 等。

檔案格式根據內容的組織形式可分為兩類:

1.面向行 Sequence Files,Avro Files

2.面向列 Parquet Files、RC Files、ORC Files

注:Flume 採用面向行的儲存格式。

常見格式

Sequence/MapFiles

Sequence 檔案就是順序檔案,由檔案頭和隨後的一條或多條記錄組成。

Sequence 檔案格式壓縮前後的內部結構下面是採用塊壓縮的結構,塊壓縮就是一次性壓縮多條記錄。

採用塊壓縮的 Sequence 檔案格式內部結構

Map Files 就是排過序的 Sequence Files,有索引,可以按鍵查詢。

Avro

Apache Avro 是一個程式語言無關的資料序列化系統。建立它的目的是為了解決 Hadoop 中 Writable 型別缺乏語言移植性的不足。

Avro 資料檔案支援壓縮,並且是可切分的,這有利於 MapReduce 任務的執行。

RC/ORCFiles

RC 是 Record Columnar 的縮寫,是 Hadoop 中第一個面向列的檔案格式,目前已經被 Hive 的 ORCFile

(Optimized Record Columnar File)及 Parquet 取代了。

Parquet

Apache Parquet 是一種能夠有效儲存巢狀資料的列式儲存格式。列式儲存的優勢: 型別相同,壓縮率更高,佔用空間就更少

Parquet 源自於 Google 發表的一篇關於 Dremel 的論文,它以扁平的列式儲存格式和很小的額外開銷來儲存巢狀的結構,從而帶來 了效能上的很大提升。

相關推薦

hadoop系列HDFS 原理實戰

HDFS檔案系統 HDFS簡介 HDFS 是 Hadoop Distributed File System 的簡稱,即 Hadoop 分散式檔案系統。它起源於谷歌發表的 GFS 論文, 是該論文的開源實現,也是整個大資料的基礎。 HDFS 專門為解決大資料的儲存問題而產生

Hadoop系列-HDFS

HDFS       HDFS是Hadoop整體架構的底層儲存系統,從資料結構上來說,它適合儲存半結構化、非結構化、多維的資料,如果實時性要求不高,那麼它也可儲存關係性很強資料的資料。從資料量來說,它的分散式體系和容錯機制可容納

hadoop學習路----HDFS原理基本架構總結(第二講)

第二講主要內容如下1.HDFS特點(也就是HDFS適用什麼場景)2.HDFS缺點(也就是HDFS不適用什麼場景)3.HDFS基本架構4.HDFS工作原理5.下一代HDFS介紹下面主要聊聊其中的各個部分1.HDFS特點(主要出自PPT)主要有以下五點高容錯性       資料自動儲存多個副本          

Hadoop HDFS原理

HDFS原理概述 HDFS叢集分為兩大角色:NameNode、DataNode  (Secondary Namenode) NameNode負責管理整個檔案系統的元資料 DataNode 負責管理使用者的檔案資料塊 檔案會按照固定的大小(blocksize)切成

大資料Hadoop系列壓縮(一)

Hadoop壓縮簡介Hadoop作為一個較通用的海量數椐處理平臺,在使用壓縮方式方面,主要考慮壓縮速度和壓縮檔案的可分割性.所有的壓縮演算法都會考慮時間和空間的權衡,更快的壓縮和解壓縮速度通常會耗費更多的交間(壓縮比較低)例如:通過gzip命令壓縮資料時,使用者可以設定不同的

hadoop學習HDFS(2.4):hadoop資料型別java資料型別的對比轉換

前言:   hadoop由各個節點構成一個叢集,分散式儲存就要考慮到資料在節點之間來回傳遞的問題。為了解決這一問題,hadoop採用了java中的序列化和反序列化概念。序列化(serialization)是指將結構化的物件轉化為位元組流,以便在網路上傳輸或者寫入到硬碟進行

.NET Core加解密實戰系列——訊息摘要數字簽名演算法

![](https://img2020.cnblogs.com/blog/2029875/202006/2029875-20200629172528304-1596961448.png) --- [TOC] ## 簡介 加解密現狀,編寫此係列文章的背景: - 需要考慮系統環境相容性問題(Linux、W

2Python全棧系列Django路由視圖

request 配置文件 hello 文章 Python全棧之路系列之Django路由與視圖路由說白了就是與視圖(函數)的對應關系,怎麽說呢,一個路由對應一個視圖,比如上面文章中所提到的那樣,當打開/users/路徑的時候會讓users這個函數來進行邏輯處理,把處理的結果再返回到前端。那麽dj

《深入淺出MyBatis技術原理實戰》——7. 插件

看到了 5.1 com htm html 而不是 sig stat str 在第6章討論了四大運行對象的運行過程,在Configuration對象的創建方法裏我們看到了MyBatis用責任鏈去封裝它們。 7.1 插件接口 在MyBatis中使用插件,我們必須使用接口Inte

20170825L08-05老男孩linux實戰運維培訓-Lamp系列-Apache服務生產實戰應用指南02

apache這一節說Apache的安裝目錄文件具體介紹了一些重要文件的配置tree -L 1 /usr/local/apache[[email protected] extra]# tree -L 1 /usr/local/apache/usr/local/apache├── apache ->

20170830L08-06老男孩linux實戰運維培訓-Lamp系列-Apache服務生產實戰應用指南03

apache還是說的apache的設置這一次說的是虛擬主機主要配置文件httpd.confhttpd-vhhsots.confhttpd.conf主要控制目錄的訪問httpd-vhosts.conf控制域名的轉換,要別名,日誌的路徑對於實驗中的訪問主機中要設置 hosts文件<Directory "/v

網絡實戰ospf多區域原理實戰

網絡實戰ospf多區域原理與實戰OSPF多區域原理與配置楔子 其實網路算得上是底層的原理了 根據tcp/ip 七層協議就可以看出 系統原理和網絡是不可分割的一部分。生成OSPF多區域的原因改善網絡的可擴展性快速收斂OSPF區域的容量劃分多區域後,每個OSPF區域裏到底可以容納多少臺路由器?單個區域所支持的路由

Hadoop框架HDFS的shell操作

技術分享 登錄 自動 訪問hdfs tro 分布式文件系 屬組 3-9 統計文件 既然HDFS是存取數據的分布式文件系統,那麽對HDFS的操作,就是文件系統的基本操作,比如文件的創建、修改、刪除、修改權限等,文件夾的創建、刪除、重命名等。對HDFS的操作命令類似於Linux

c#學習系列委托事件

gen () 第一次用 關鍵字 將在 generic frame 再次 body 1. 引言 委托 和 事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委托和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易

Java並發編程原理實戰

地址 騰訊 http baidu 密碼 iyu .com 實戰 java並發 Java並發編程原理與實戰網盤地址:https://pan.baidu.com/s/1c3mpC7A 密碼: pe62備用地址(騰訊微雲):https://share.weiyun.com/11e

Java並發編程原理實戰視頻教程

cnp mysql enter 架構師 分享圖片 span aid rocketmq 相對 14套java精品高級架構課,緩存架構,深入Jvm虛擬機,全文檢索Elasticsearch,Dubbo分布式Restful 服務,並發原理編程,SpringBoot,Spring

MySQL 索引原理慢查詢優化

英文 borde 發生 聚集 引擎 返回 位置 時間 pro 一 索引介紹 二 索引類型 三 索引分類 四 聚合索引和輔助索引 五 測試索引 六 正確使用索引 七 組合索引 八 註意事項 九 查詢計劃 十 慢日誌查詢 十一 大數據量分頁優化 1. 索引介紹

Hadoop系列HDFS

現在 conda 適合 產生 理解 並行處理 rip 意見 雲端 Hadoop的前世今生 什麽是大數據 各行各業都會產生大量的數據,比如社交網站的意見觀點,電商平臺人們瀏覽網頁停留的時間,交通運輸每天產生的數據等等。這些數據大多不是結構化的,一般來說都是半結構化或者非結構化

Squid緩存服務器原理實戰演練

Squid緩存服務器原理與實戰演練Squid服務基礎講解代理緩存機制:代理的基本類型:1、 傳統代理:需要在客戶端軟件手動設置指定代理服務器 2、 透明代理:無需用戶手動指定,通過路由、防火墻策略將訪問重定向Squid 反向代理:為網站服務下面進行實戰演練! 實驗環境:代理服務器squid 192.168

細說java系列HashMap原理

hashmap 屬於 情況 int 數據結構 boolean 條件 com ext 類圖 在正式分析HashMap實現原理之前,先來看看其類圖。 源碼解讀 下面集合HashMap的put(K key, V value)方法探究其實現原理。 // 在HashMap內部用於