HDFS應用場景、原理、基本架構及使用方法概述
以下主要參考小象科技的董西成老師的視訊
1. HDFS概述
2. HDFS基本架構和原理
3. HDFS程式設計
4. HDFS 2.0新特性
一、HDFS概述
HDFS是什麼?
1、源自於Google的GFS論文,發表於2003年10月,HDFS是GFS克隆版
2、Hadoop Distributed File System,易於擴充套件的分散式檔案系統,執行在大量普通廉價機器上,提供容錯機制,為大量使用者提供效能不錯的檔案存取服務
HDFS優點
1、高容錯性
資料自動儲存多個副本,副本丟失後,自動恢復
2、適合批處理
移動計算而非資料, 資料位置暴露給計算框架
3、適合大資料處理
GB、TB、甚至PB級資料,百萬規模以上的檔案數量,10K+節點規模
4、流式檔案訪問
一次性寫入,多次讀取,保證資料一致性
5、可構建在廉價機器上
通過多副本提高可靠性,提供了容錯和恢復機制
HDFS缺點
1、低延遲資料訪問
比如毫秒級,低延遲與高吞吐率
2、小檔案存取
佔用NameNode大量記憶體,尋道時間超過讀取時間
3、併發寫入、檔案隨機修改
一個檔案只能有一個寫者,僅支援append
二、HDFS基本架構和原理
HDFS架構
1、Namenode:
• 主Master(只有一個)
• 管理HDFS的名稱空間
• 管理資料塊對映資訊
• 配置副本策略
• 處理客戶端讀寫請求
2、SecondNameNode
• NameNode的熱備;
• 定期合併fsimage和fsedits,推送給NameNode;
• 當Active NameNode出現故障時,快速切換為新的NameNode。
3、Datanode
• Slave(有多個)
• 儲存實際的資料塊
• 執行資料塊讀/寫
4、Client
• 檔案切分
• 與NameNode互動,獲取檔案位置資訊;
• 與DataNode互動,讀取或者寫入資料;
• 管理HDFS;
• 訪問HDFS。
HDFS資料塊(block)
1、檔案被切分成固定大小的資料塊
預設資料塊大小為64MB,可配置,若檔案大小不到64MB,則單獨存成一個block
2、為何資料塊如此之大
資料傳輸時間超過尋道時間(高吞吐率)
3、一個檔案儲存方式
按大小被切分成若干個block,儲存到不同節點上,預設情況下每個block有三個副本
HDFS副本放置策略
問題:一個檔案劃分成多個block,每個block存多份,如何為每個block選擇節點儲存這幾份資料?
Block副本放置策略:
副本1: 同Client的節點上,
副本2: 不同機架中的節點上,
副本3: 與第二個副本同一機架的另一個節點上,
其他副本:隨機挑選
HDFS可靠性策略
1、檔案完整性:CRC32校驗,用其他副本取代損壞檔案
2、Heartbeat:Datanode 定期向Namenode發heartbeat
3、後設資料資訊:FSImage(檔案系統映象)、Editlog(操作日誌,多份儲存,主備NameNode實時切換
HDFS不適合儲存小檔案
1、元資訊儲存在NameNode記憶體中:一個節點的記憶體是有限的
2、存取大量小檔案消耗大量的尋道時間:類比拷貝大量小檔案與拷貝同等大小的一個大檔案
3、NameNode儲存block數目是有限的:一個block元資訊消耗大約150 byte記憶體,儲存1億個block,大約需要20GB記憶體,如果一個檔案大小為10K,則1億個檔案大小僅為1TB(但要消耗掉NameNode 20GB記憶體)
三、HDFS程式設計
HDFS訪問方式
1、HDFS Shell命令
2、HDFS Java API
3、HDFS REST API
4、HDFS Fuse:實現了fuse協議
5、HDFS lib hdfs:C/C++訪問介面
6、HDFS 其他語言程式設計API:使用thrift實現,支援C++、Python、php、C#等語言
HDFS Shell命令—檔案操作命令
1、將本地檔案上傳到HDFS上
bin/hadoop fs -copyFromLocal /local/data /hdfs/data
2、刪除檔案/目錄
bin/hadoop fs -rmr /hdfs/data
3、建立目錄
bin/hadoop fs -mkdir /hdfs/data
HDFS Shell命令—管理指令碼
1、在sbin目錄下
start-all.sh
start-dfs.sh
start-yarn.sh
hadoop-deamon(s).sh
2、單獨啟動某個服務
hadoop-deamon.sh start namenode
hadoop-deamons.sh start namenode(通過SSH登入到各個節點)
HDFS Shell命令—檔案管理命令fsck
1、檢查hdfs中檔案的健康狀況
2、查詢缺失的塊以及過少或過多副本的塊
3、檢視一個檔案的所有資料塊位置
4、刪除損壞的資料塊
HDFS Shell命令—資料均衡器balancer
1、資料塊重分佈
bin/start-balancer.sh -threshold <percentage ofdisk capacity>
2、percentage of disk capacity
HDFS達到平衡狀態的磁碟使用率偏差值,值越低各節點越平衡,但消耗時間也更長
HDFS Shell命令—設定目錄份額
1、限制一個目錄最多使用磁碟空間
bin/hadoop dfsadmin -setSpaceQuota 1t /user/username
2、限制一個目錄包含的最多子目錄和檔案數目
bin/hadoop dfsadmin -setQuota 10000 /user/username
HDFS Shell命令—增加/移除節點
1、加入新的datanode
步驟1:將已存在datanode上的安裝包(包括配置檔案等)拷貝到新datanode上;
步驟2:啟動新datanode:
sbin/hadoop-deamon.sh start datanode
2、移除舊datanode
步驟1:將datanode加入黑名單,並更新黑名單,在
NameNode上,將datanode的host或者ip加入配置選項
dfs.hosts.exclude指定的檔案中
步驟2:移除datanode:
bin/hadoop dfsadmin -refreshNodes
HDFS Java API介紹
1、Configuration類:該類的物件封裝了配置資訊,這些配置資訊來自core-*.xml;
2、FileSystem類:檔案系統類,可使用該類的方法對檔案/目錄進行操作。一般通過FileSystem的靜態方法get獲得一個檔案系統物件;
3、FSDataInputStream和FSDataOutputStream類:HDFS中的輸入輸出流。分別通過FileSystem的open方法和create方法獲得。
以上類均來自java包:org.apache.hadoop.fs
HDFS Java程式舉例
1、將本地檔案拷貝到HDFS上
Configuration config = new Configuration();
FileSystem hdfs = FileSystem.get(config);
Path srcPath = new Path(srcFile);
Path dstPath = new Path(dstFile);
hdfs.copyFromLocalFile(srcPath, dstPath);
2、建立HDFS檔案
//byte[] buff – 檔案內容
Configuration config = new Configuration();
FileSystem hdfs = FileSystem.get(config);
Path path = new Path(fileName);
FSDataOutputStream outputStream = hdfs.create(path);
outputStream.write(buff, 0, buff.length);
其他的就不在這詳述了,有興趣自己去找資料看看
四、Hadoop 2.0新特性
1、NameNode HA
2、NameNode Federation
3、HDFS 快照(snapshot)
4、HDFS 快取(in-memory cache)
5、HDFS ACL
6、異構層級儲存結構(Heterogeneous Storage
hierarchy)
異構層級儲存結構—背景
1、HDFS將所有儲存介質抽象成效能相同的Disk
<property>
<name>dfs.datanode.data.dir</name>
<value>/dir0,/dir1,/dir2,/dir3</value>
</property>
2、儲存介質種類繁多,一個叢集中存在多種異構介質:磁碟、SSD、RAM等
3、多種型別的任務企圖同時執行在同一個Hadoop叢集中
批處理,互動式處理,實時處理,不同效能要求的資料,最好儲存在不同類別的儲存介質上
異構層級儲存結構—原理
1、每個節點是由多種異構儲存介質構成的
<property>
<name>dfs.datanode.data.dir</name>
<value>[disk]/dir0,[disk]/dir1,[ssd]/dir2,[ssd]/dir3</value>
</property>
HDFS僅提供了一種異構儲存結構,並不知道儲存介質的效能;
HDFS為使用者提供了API,以控制目錄/檔案寫到什麼介質上;
HDFS為管理員提供了管理工具,可限制每個使用者對每種介質的可使用份額;但目前完成度不高
HDFS ACL—背景:現有許可權管理的侷限性
HDFS ACL—基於POSIX ACL的實現
啟動該功能:將dfs.namenode.acls.enabled置為true
使用方法;
hdfs dfs -setfacl -m user:tom:rw- /bank/exchange
hdfs dfs -setfacl -m user:lucy:rw- /bank/exchange
hdfs dfs -setfacl -m group:team2:r-- /bank/exchange
hdfs dfs -setfacl -m group:team3:r-- /bank/exchange
HDFS快照—背景
1、HDFS上檔案和目錄是不斷變化的,快照可以幫助使用者儲存某個時刻的資料;
2、HDFS快照的作用:防止使用者誤操作刪除資料,資料備份
HDFS快照—基本使用方法
1、一個目錄可以產生快照,當且僅當它是Snapshottable;
bin/hdfs dfsadmin allowSnapshot <path>
2、建立/刪除快照
bin/hdfs dfs -createSnapshot <path> [<snapshotName>]
bin/hdfs dfs -deleteSnapshot<path> [<snapshotName>]
3、快照存放位置和特點
特點:快照是隻讀的,不可修改
快照位置:
<snapshottable_dir_path>/.snapshot
<snapshottable_dir_path>/.snapshot/snap_name
HDFS快取—背景
1、HDFS自身不提供資料快取功能,而是使用OS快取:
容易記憶體浪費,eg.一個block三個副本同時被快取
2、多種計算框架共存,均將HDFS作為共享儲存系統
MapReduce:離線計算,充分利用磁碟
Impala:低延遲計算,充分利用記憶體
Spark:記憶體計算框架
3、HDFS應讓多種混合計算型別共存一個叢集中
合理的使用記憶體、磁碟等資源,比如,高頻訪問的特點檔案應被儘可能長期快取,防止置換到磁碟上
HDFS快取—實現情況
1、使用者需通過命令顯式的將一個目錄或檔案加入/移除快取
不支援塊級別的快取,不支援自動化快取,可設定快取失效時間
2、快取目錄:僅對一級檔案進行快取:不會遞迴快取所有檔案與目錄
3、以pool的形式組織快取資源:
藉助YARN的資源管理方式,將快取劃分到不同pool中
每個pool有類linux許可權管理機制、快取上限、失效時間等
4、獨立管理記憶體,未與資源管理系統YARN整合:
使用者可為每個DN設定快取大小,該值獨立於YARN
相關文章
- Hive簡介、應用場景及架構原理Hive架構
- ZooKeeper核心原理及應用場景
- HDFS架構及原理架構
- Zookeeper基礎原理&應用場景詳解
- 海外IP池的工作原理及應用場景
- Tornado原理淺析及應用場景探討
- StarRocks基本架構原理架構
- Redis的資料結構及應用場景Redis資料結構
- Mybatis-Plus的應用場景及注入SQL原理分析MyBatisSQL
- 堆排序原理及其應用場景排序
- redis應用場景及例項Redis
- RabbitMQ核心元件及應用場景MQ元件
- Webpack 下使用 web workers 及 基本原理 和 應用場景Web
- 圖資料庫及應用場景資料庫
- Flink基本原理與應用場景
- HDFS 01 - HDFS是什麼?它的適用場景有哪些?它的架構是什麼?架構
- HTAP資料庫及應用場景分析資料庫
- Pytest的斷言方式及應用場景
- redis資料型別及應用場景Redis資料型別
- Redis應用場景及快取問題Redis快取
- Redis的應用場景及優缺點Redis
- Fiddler(一)Fiddler介紹及應用場景
- Java反射詳解:入門+使用+原理+應用場景Java反射
- MyBatis 基礎搭建及架構概述MyBatis架構
- snapshot應用場景
- DDD應用場景
- Zookeeper應用場景
- ES 應用場景
- 3.4 應用場景
- IO多路複用原理&場景
- 【基礎梳理】cookie、session、sessionStorage、localStorage之間的區別及應用場景CookieSession
- Redis的資料結構與應用場景Redis資料結構
- Kotlin基礎:抽象屬性的應用場景Kotlin抽象
- 基於雲邊協同架構的五大應用場景革新架構
- 基於Apache Hudi構建資料湖的典型應用場景介紹Apache
- 裸金屬雲基礎架構的應用場景和趨勢解析架構
- Java 讀寫鎖 ReadWriteLock 原理與應用場景詳解Java
- RabbitMQ的應用場景以及基本原理介紹MQ