目錄
第一章 概述
1.1大數(shù)據(jù)的特征(4V)
1.2 大數(shù)據(jù)的應用場景
1.3大數(shù)據(jù)的發(fā)展前景
1.4企業(yè)大數(shù)據(jù)的一般處理流程
1.4.1數(shù)據(jù)源
1.4.2數(shù)據(jù)采集或者同步
1.4.3數(shù)據(jù)存儲
1.4.4 數(shù)據(jù)清洗
1.4.5 數(shù)據(jù)分析
1.4.6數(shù)據(jù)展示
第二章 hadoop介紹
2.1.hadoop 目標
2.2 hadoop的介紹
2.3 hadoop起源
2.4 Hadoop版本
第三章 環(huán)境搭建
3.1單機點安裝:
3.1.1 jdk安裝
3.1.2 安裝hadoop
3.1.3 hadoop安裝目錄介紹
3.1.4 案例演示測試
3.2偽分布式安裝:
3.2.1.jdk及hadoop安裝同單機點安裝
3.2.2.關閉防火墻
3.2.3.修改host映射
3.2.4.確保ssh對localhost的免密登認證有效
3.2.5配置hadoop文檔
3.3完全分布式安裝
3.3.1 完全分布式介紹
3.3.2守護進程布局
3.3.3集群安裝
第四章 HDFS的shell操作
4.1 創(chuàng)建目錄
4.2 上傳命令
4.3 查看命令
4.4 下載命令
4.5 合并下載
4.6 刪除命令
4.7 拷貝命令
4.8 移動命令
4.9 創(chuàng)建空文件
4.10 向文件中追加內(nèi)容
4.11 修改文件權(quán)限
4.12 修改文件副本數(shù)量
4.13 文件測試
4.14 查看文件夾及子文件夾數(shù)量
4.15 查看磁盤利用率及文件大小
4.16 查看文件狀態(tài)
4.17 回收站
第五章 HDFS的塊
5.1 傳統(tǒng)型分布式文件系統(tǒng)的缺點
5.2 HDFS的塊
5.3 HDFS的塊大小
5.4 塊的相關參數(shù)設置
5.5 塊的存儲位置
5.6 HDFS的優(yōu)點
5.7 HDFS的缺點
第六章 HDFS的體系結(jié)構(gòu)
6.1 體系結(jié)構(gòu)解析
6.2 HDFS進行之NameNode
6.3 HDFS進行之DataNode
6.4 HDFS進程之SecondaryNamenode
6.5HDFS的Client接口
6.6 映像文件fsimage
6.7 日志文件edit
第七章 HDFS的工作流程
7.1 開機啟動Namenode過程
7.2 安全模式介紹
7.3 DataNode與NameNode通信(心跳機制)
7.4 SecondayNamenode的工作機制(檢查點機制)
7.5 讀流程的詳解
第八章 IDE遠程管理HDFS
8.1本地環(huán)境配置
(1) windows系統(tǒng)
(2) MacOS環(huán)境布署
8.2 創(chuàng)建pom文件
8.3 創(chuàng)建文件系統(tǒng)對象
8.4 文件的上傳與下載、文件夾的創(chuàng)建與刪除、重命名與存在
8.5 HDFS-IOUtils工具類的使用
8.6 文件狀態(tài)查看
第九章 HDFS的高級操作
9.1 磁盤檢測
-list-corruptfileblocks
9.2 動態(tài)上線
9.3 數(shù)據(jù)平衡
9.4 節(jié)點動態(tài)下線
9.5 磁盤平衡
9.6 分布式拷貝(需要調(diào)試)
9.7 歸檔
第一章 概述
1.1大數(shù)據(jù)的特征(4V)
Volume: 數(shù)據(jù)量非常大
Variety:數(shù)據(jù)類型多樣化,組成龐大的數(shù)據(jù)集的數(shù)據(jù),有結(jié)構(gòu)化的,半結(jié)構(gòu)化的非結(jié)構(gòu)化的數(shù)據(jù)。
Velocity:數(shù)據(jù)增長的速度非常快
Value: 數(shù)據(jù)的價值低
1.2 大數(shù)據(jù)的應用場景
共享單車故障報警
殺熟外賣會員
蘋果比安卓貴嗎
啤灑和尿不濕
猜你喜歡
貸款要看大數(shù)據(jù)
.....
1.3大數(shù)據(jù)的發(fā)展前景
大數(shù)據(jù)本身的價值體現(xiàn)在互聯(lián)網(wǎng)得到了廣泛的應用。
大數(shù)據(jù)不僅推動了互聯(lián)網(wǎng),還有金融、教育、醫(yī)療等諸多領域,尤其現(xiàn)有人工智能的發(fā)展
大數(shù)據(jù)形成一個較為完整的產(chǎn)業(yè)鏈,包括數(shù)據(jù)采集、整理、傳輸、存儲、分析、呈現(xiàn)和應用。
1.4企業(yè)大數(shù)據(jù)的一般處理流程
1.4.1數(shù)據(jù)源
數(shù)據(jù)的來源有如下內(nèi)容: 關系型數(shù)據(jù)庫、日志文件、三方數(shù)據(jù)
1.4.2數(shù)據(jù)采集或者同步
常用數(shù)據(jù)采集導入框架:
sqoop: 用于RDBMS與HDFS之間數(shù)據(jù)導入與導出
flume: 采集日志文件數(shù)據(jù)、動態(tài)采集日志文件、數(shù)據(jù)流; flume采集到的數(shù)據(jù),一份給HDFS, 用于做離線分析; 一分給Kafka, 實時處理
kafka: 主要用于實時的數(shù)據(jù)流處理, flume與kafka都有類似消息隊列的機制,來緩存大數(shù)據(jù)環(huán)境處理不了的數(shù)據(jù)。
1.4.3數(shù)據(jù)存儲
常用數(shù)據(jù)存儲框架: HDFS、HBase、ES
1.4.4 數(shù)據(jù)清洗
對數(shù)據(jù)進行過濾,得到具有一定格式的數(shù)據(jù)源: 常用框架(工具): MapReduce, Hive(ETL), SparkCore, sparksql等
1.4.5 數(shù)據(jù)分析
對經(jīng)過清洗后的數(shù)據(jù)進行分析,得到某個指標
常用框架(工具): MapReduce, Hive, SparkSQL, impala(impa:le), kylin
1.4.6數(shù)據(jù)展示
即將數(shù)據(jù)分析后的結(jié)果展示出來,也可以理解為數(shù)據(jù)的可視化, 以圖或者表具體的形式展示出來。
常用工具: metastor, javaweb, hcharts, echarts
第二章 hadoop介紹
2.1.hadoop 目標
-
數(shù)據(jù)快速增長超過硬件存儲及傳輸增長的速度
-
因硬件故障造成的數(shù)據(jù)丟失
-
讀取的數(shù)據(jù)的正確性
2.2 hadoop的介紹
hadoop是Apache基金會旗下一個開源的分布式存儲和分析計算平臺,使用java語言開發(fā),具有很好的跨平臺性,可以運行在商用(謙價)硬件上,用戶無需了解分布式底層細節(jié),就可以開發(fā)分布式程序,充分使用集群的高速計算和存儲。
2.3 hadoop起源
依賴三篇論文
2003年發(fā)表的《GFS》: 基于硬盤不夠大,數(shù)據(jù)存儲單份的安全隱患問題,提出了分布式文件系統(tǒng)用于存儲的理論思想。
解決了如何存儲大數(shù)據(jù)集的問題
2004年發(fā)表的《MapReduce》: 基于分布式文件系統(tǒng)的計算分析的編程框架模型,移動計算而非移動數(shù)據(jù),分而治之
解決了如何快速分析大數(shù)據(jù)集的問題
2006年發(fā)表的《BigTable》
針對于傳統(tǒng)型關系數(shù)據(jù)庫不適合存儲非結(jié)構(gòu)化數(shù)據(jù)的缺點,提出了另一種適合存儲大數(shù)據(jù)集的解決方案。
起源于Apache Nutch項目
2004年,基于《GFS》開始著手NDFS(Nutch的分布式文件系統(tǒng))
2006年,從Nutch項目移出,開成子項目Hadoop
2008年,打破世界紀錄,成為最快排序1TB數(shù)據(jù)的系統(tǒng),排序時間為209秒。
2009年,將時間提高到62秒。
2.4 Hadoop版本
Apache hadoop: 原生的
Cloudera Hadoop: CHD版 商業(yè)
Hortonworks Hadoop(HDP): 完全開源,安裝方便,提供了直觀的用戶安裝界面和配置工具。
官網(wǎng): Apache Hadoop
Hadoop生態(tài)系統(tǒng)介紹 (Hadoop生態(tài)系統(tǒng)介紹-CSDN博客) Hadoop是一個能夠?qū)Υ罅繑?shù)據(jù)進行分布式處理的軟件框架。具有可靠、高效、可伸縮的特點。 它使我們能用一種簡單的編程模型來處理存儲于集群上的大數(shù)據(jù)集??梢詰糜谄髽I(yè)中的數(shù)據(jù)存儲,日志分析,商業(yè)智能,數(shù)據(jù)挖掘等。
Hadoop的核心是HDFS、MapReduce、YARN。
Hadoop優(yōu)點:
高可靠性。Hadoop按位存儲和處理數(shù)據(jù)的能力值得人們信賴。 高擴展性。Hadoop是在可用的計算機集簇間分配數(shù)據(jù)并完成計算任務的,這些集簇可以方便地擴展到數(shù)以千計的節(jié)點中。 高效性。Hadoop能夠在節(jié)點之間動態(tài)地移動數(shù)據(jù),并保證各個節(jié)點的動態(tài)平衡,因此處理速度非??臁?高容錯性。Hadoop能夠自動保存數(shù)據(jù)的多個副本,并且能夠自動將失敗的任務重新分配。 低成本。與一體機、商用數(shù)據(jù)倉庫以及QlikView、Yonghong Z-Suite等數(shù)據(jù)集市相比,hadoop是開源的,項目的軟件成本因此會大大降低。 Hadoop帶有用Java語言編寫的框架,因此運行在 Linux 生產(chǎn)平臺上是非常理想的。Hadoop 上的應用程序也可以使用其他語言編寫,比如 C++。
hadoop的優(yōu)勢主要體現(xiàn)在高可靠性,高擴展性等方面。
高可靠性是指多副本的存儲機制和失敗作業(yè)的重新調(diào)度計算。
高擴展性是指資源不夠時很容易直接擴展機器。一個集群可以包含數(shù)以千計的節(jié)點。
其他優(yōu)勢還表現(xiàn)在:hadoop完全可以部署在普通廉價的機器上,成本低。同時它具有成熟的生態(tài)圈和開源社區(qū)。
狹義hadoop:指一個用于大數(shù)據(jù)分布式存儲(HDFS),分布式計算(MapReduce)和資源調(diào)度(YARN)的平臺,這三樣只能用來做離線批處理,不能用于實時處理,因此才需要生態(tài)系統(tǒng)的其他的組件。
廣義的hadoop:指的是hadoop的生態(tài)系統(tǒng),即其他各種組件在內(nèi)的一整套軟件。hadoop生態(tài)系統(tǒng)是一個很龐大的概念,hadoop只是其中最重要最基礎的部分,生態(tài)系統(tǒng)的每一個子系統(tǒng)只結(jié)局的某一個特定的問題域。不是一個全能系統(tǒng),而是多個小而精的系統(tǒng)。
HDFS 是Hadoop體系中數(shù)據(jù)存儲管理的基礎。它是一個高度容錯的系統(tǒng),能檢測和應對硬件故障,用于在低成本的通用硬件上運行。HDFS簡化了文件的一致性模型,通過流式數(shù)據(jù)訪問,提供高吞吐量應用程序數(shù)據(jù)訪問功能,適合帶有大型數(shù)據(jù)集的應用程序。
Block數(shù)據(jù)塊:
基本存儲單位,一般為64M(HDFS2.X以后的block默認128M)
減少搜尋時間,一般硬盤傳輸速度比尋道時間要快,大的塊可以減少尋道時間 減少管理塊的數(shù)據(jù)開銷,每個塊需要在NameNode有對應的記錄 對數(shù)據(jù)塊進行讀寫,減少建立網(wǎng)絡的連接成本 一個大文件會被拆分成一個個的塊,然后存儲于不同的機器。如果一個文件少于block大小,那么實際占用的空間為其文件的大小
基本的讀寫單位類似于磁盤的頁,每次都是讀寫一個塊
每個塊都會被復制到多臺機器,默認復制三份
NameNode:
存儲文件的metadata,運行時所有數(shù)據(jù)都保存到內(nèi)存,整個HDFS可存儲的文件數(shù)受限于NameNode的內(nèi)存大小
一個block在namenode中對應一條記錄(一般一個block占用150字節(jié)),如果是大量的小文件,會消耗大量內(nèi)存。同時map task的數(shù)量是由splits來決定的,所以MapReduce處理大量的小文件時,就會產(chǎn)生過多的map task,線程管理開銷將會增加作業(yè)時間。處理大量小文件的速度遠遠小于處理同等大小的大文件的速度。因此Hadoop建議存儲大文件
數(shù)據(jù)會定時保存到本地磁盤,但不保存block的位置信息,而是由datanode注冊時上報和運行時維護(namenode中與datanode相關的信息并不保存到namenode的文件系統(tǒng)中,而是namenode每次重啟后,動態(tài)重建)
namenode失效則整個hdfs都失效了,所以要保證namenode的可用性
Secondary NameNode:
定時與NameNode進行同步(定期合并文件系統(tǒng)鏡像和編輯日志,然后把合并后的傳給namenode,替換其鏡像,并清空編輯日志,類似于CheckPoint機制),但NameNode失效后仍需要手工將其設置成主機 DataNode:
保存具體的block數(shù)據(jù)
負責數(shù)據(jù)的讀寫操作和復制操作
datanode啟動時會向namenode報告當前存儲的數(shù)據(jù)塊信息,后續(xù)也會定時報告修改信息
datanode之間會進行通信,復制數(shù)據(jù)塊,保證數(shù)據(jù)的冗余性
MapReduce MapReduce是一種計算模型,用以進行大數(shù)據(jù)量的計算。其中Map對數(shù)據(jù)集上的獨立元素進行指定的操作,生成鍵-值對形式中間結(jié)果。Reduce則對中間結(jié)果中相同“鍵”的所有“值”進行規(guī)約,以得到最終結(jié)果。MapReduce這樣的功能劃分,非常適合在大量計算機組成的分布式并行環(huán)境里進行數(shù)據(jù)處理。
MapReduce主要是先讀取文件數(shù)據(jù),然后進行Map處理,接著Reduce處理,最后把處理結(jié)果寫到文件中
基本流程:
多節(jié)點詳細流程:
Yarn YARN (Yet Another Resource Negotiator,另一種資源協(xié)調(diào)者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統(tǒng),可為上層應用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了巨大好處。
YARN的基本思想是將JobTracker的兩個主要功能(資源管理和作業(yè)調(diào)度/監(jiān)控)分離,主要方法是創(chuàng)建一個全局的ResourceManager(RM)和若干個針對應用程序的ApplicationMaster(AM)。這里的應用程序是指傳統(tǒng)的MapReduce作業(yè)或作業(yè)的DAG(有向無環(huán)圖)。
該框架是hadoop2.x以后對hadoop1.x之前JobTracker和TaskTracker模型的優(yōu)化,而產(chǎn)生出來的,將JobTracker的資源分配和作業(yè)調(diào)度及監(jiān)督分開。該框架主要有ResourceManager,Applicationmatser,nodemanager。其主要工作過程如下:
ResourceManager主要負責所有的應用程序的資源分配, ApplicationMaster主要負責每個作業(yè)的任務調(diào)度,也就是說每一個作業(yè)對應一個ApplicationMaster。 Nodemanager是接收Resourcemanager 和ApplicationMaster的命令來實現(xiàn)資源的分配執(zhí)行體。 ResourceManager在接收到client的作業(yè)提交請求之后,會分配一個Conbiner,這里需要說明一下的是Resoucemanager分配資源是以Conbiner為單位分配的。第一個被分配的Conbiner會啟動Applicationmaster,它主要負責作業(yè)的調(diào)度。Applicationmanager啟動之后則會直接跟NodeManager通信。
在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調(diào)度器負責資源的分配,而NodeManager則負責資源的供給和隔離。ResourceManager將某個NodeManager上資源分配給任務(這就是所謂的“資源調(diào)度”)后,NodeManager需按照要求為任務提供相應的資源,甚至保證這些資源應具有獨占性,為任務運行提供基礎的保證,這就是所謂的資源隔離。
在Yarn平臺上可以運行多個計算框架,如:MR,Tez,Storm,Spark等計算框架。
Sqoop Sqoop是SQL-to-Hadoop的縮寫,主要用于傳統(tǒng)數(shù)據(jù)庫和Hadoop之間傳輸數(shù)據(jù)。數(shù)據(jù)的導入和導出本質(zhì)上是MapReduce程序,充分利用了MR的并行化和容錯性。其中主要利用的是MP中的Map任務來實現(xiàn)并行導入,導出。Sqoop發(fā)展到現(xiàn)在已經(jīng)出現(xiàn)了兩個版本,一個是sqoop1.x.x系列,一個是sqoop1.99.X系列。對于sqoop1系列中,主要是通過命令行的方式來操作。
sqoop1 import原理:從傳統(tǒng)數(shù)據(jù)庫獲取元數(shù)據(jù)信息(schema、table、field、field type),把導入功能轉(zhuǎn)換為只有Map的Mapreduce作業(yè),在mapreduce中有很多map,每個map讀一片數(shù)據(jù),進而并行的完成數(shù)據(jù)的拷貝。 sqoop1 export原理:獲取導出表的schema、meta信息,和Hadoop中的字段match;多個map only作業(yè)同時運行,完成hdfs中數(shù)據(jù)導出到關系型數(shù)據(jù)庫中。 Sqoop1.99.x是屬于sqoop2的產(chǎn)品,該款產(chǎn)品目前功能還不是很完善,處于一個測試階段,一般并不會應用于商業(yè)化產(chǎn)品當中。 Mahout Mahout起源于2008年,最初是Apache Lucent的子項目,它在極短的時間內(nèi)取得了長足的發(fā)展,現(xiàn)在是Apache的頂級項目。相對于傳統(tǒng)的MapReduce編程方式來實現(xiàn)機器學習的算法時,往往需要話費大量的開發(fā)時間,并且周期較長,而Mahout的主要目標是創(chuàng)建一些可擴展的機器學習領域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應用程序。
Mahout現(xiàn)在已經(jīng)包含了聚類、分類、推薦引擎(協(xié)同過濾)和頻繁集挖掘等廣泛使用的數(shù)據(jù)挖掘方法。除了算法,Mahout還包含數(shù)據(jù)的輸入/輸出工具、與其他存儲系統(tǒng)(如數(shù)據(jù)庫、MongoDB 或Cassandra)集成等數(shù)據(jù)挖掘支持架構(gòu)。
ZooKeeper 解決分布式環(huán)境下的數(shù)據(jù)管理問題:統(tǒng)一命名,狀態(tài)同步,集群管理,配置同步等。
HBase HBase是Apache的Hadoop項目的子項目,是Hadoop Database的簡稱。
HBase是建立在Hadoop文件系統(tǒng)(HDFS)之上的一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統(tǒng),利用HBase技術(shù)可在廉價PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲集群,通過利用Hadoop的文件系統(tǒng)提供容錯能力。
HBase不同于一般的關系數(shù)據(jù)庫,它是一個適合于非結(jié)構(gòu)化數(shù)據(jù)存儲的數(shù)據(jù)庫,HBase基于列的而不是基于行的模式。
Hive Hive是一個在Hadoop中用來處理結(jié)構(gòu)化數(shù)據(jù)的數(shù)據(jù)倉庫基礎工具。它架構(gòu)在Hadoop之上,用來進行數(shù)據(jù)提取、轉(zhuǎn)化、加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)的機制。hive數(shù)據(jù)倉庫工具能將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供SQL查詢功能,能將SQL語句轉(zhuǎn)變成MapReduce任務來執(zhí)行。
Hive特點
它存儲架構(gòu)在一個數(shù)據(jù)庫中并處理數(shù)據(jù)到HDFS。 它是專為OLAP設計。 它提供SQL類型語言查詢叫HiveQL或HQL。 它是低學習成本,快速和可擴展的。 Pig Pig是MapReduce的一個抽象,它是一個工具/平臺,用于分析較大的數(shù)據(jù)集,并將它們表示為數(shù)據(jù)流。Pig通常與 Hadoop 一起使用;我們可以使用Apache Pig在Hadoop中執(zhí)行所有的數(shù)據(jù)處理操作。
要編寫數(shù)據(jù)分析程序,Pig提供了一種稱為 Pig Latin 的高級語言。該語言提供了各種操作符,程序員可以利用它們開發(fā)自己的用于讀取,寫入和處理數(shù)據(jù)的功能。
要使用 Apache Pig 分析數(shù)據(jù),程序員需要使用Pig Latin語言編寫腳本。所有這些腳本都在內(nèi)部轉(zhuǎn)換為Map和Reduce任務。Apache Pig有一個名為 Pig Engine 的組件,它接受Pig Latin腳本作為輸入,并將這些腳本轉(zhuǎn)換為MapReduce作業(yè)。
通常用于進行離線分析。
Flume Flume是一種分布式,可靠且可用的服務,用于有效地收集,聚合和移動大量日志數(shù)據(jù)。它具有基于流數(shù)據(jù)流的簡單靈活的體系結(jié)構(gòu)。它具有可調(diào)整的可靠性機制以及許多故障轉(zhuǎn)移和恢復機制,具有強大的功能和容錯能力。它使用一個簡單的可擴展數(shù)據(jù)模型,允許在線分析應用程序。
Oozie Oozie是工作流調(diào)度用在Hadoop中。它是一個運行相關的作業(yè)工作流系統(tǒng)。這里,用戶被允許創(chuàng)建DAG工作流程,其可以在并列 Hadoop 并順序地運行。
提供Hadoop任務的調(diào)度和管理,不僅可以管理MapReduce任務,還可以管理pig、hive、sqoop、spark等任務,Oozie就是一個基于hadoop的工作流引擎。
Spark Spark是一個用于實時處理的開源集群計算框架,它建立在Hadoop MapReduce之上,它擴展了MapReduce模型以使用更多類型的計算。它使用內(nèi)存中緩存和優(yōu)化的查詢執(zhí)行方式,可針對任何規(guī)模的數(shù)據(jù)進行快速分析查詢。它提供使用 Java、Scala、Python 和 R 語言的開發(fā) API,支持跨多個工作負載重用代碼—批處理、交互式查詢、實時分析、機器學習和圖形處理等。
Spark 框架包括:
Spark Core 是該平臺的基礎
用于交互式查詢的 Spark SQL
用于實時分析的 Spark Streaming
用于機器學習的 Spark MLlib
用于圖形處理的 Spark GraphX
————————————————
第三章 環(huán)境搭建
3.1單機點安裝:
3.1.1 jdk安裝
平臺軟件 說明 | |
---|---|
宿主機操作系統(tǒng) windows | |
虛擬機操作系統(tǒng) Centos stream 8 | |
SSH工具 Windows: MobaXterm | |
虛擬機軟件 VMWare | |
軟件包上傳路徑 /root/softwares | |
軟件安裝路徑 /usr/local | |
JDK X64: jdk-8u321-linux-x64.tar.gz | |
Hadoop X64: hadoop-3.3.1.tar.gz | |
用戶 root |
(1)如果之前安裝其他jdk,請卸載
rpm -qa | grep jdk
rpm -e xxx ? --nodeps
(2)上傳后,解壓安裝
tar -zxvf jdk-8u321-linux-x64.tar.gz -C /usr/local/
(3)配置環(huán)境變量
vim /etc/profile
添加以下內(nèi)容
#java Environment
export JAVA_HOME=/usr/local/jdk1.8.0_321/ ? ?
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
(4)重新引導,使環(huán)境變量生效
source /etc/profile
(5)驗證jdk是否配置成功
java -version
3.1.2 安裝hadoop
(1) 解壓安培
tar -zxvf hadoop-3.3.1.tar.gz -C /usr/local/
(2)配置環(huán)境變量
vi /etc/profile
--添加
#Hadoop
export HADOOP_HOME=/usr/local/hadoop-3.3.1
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
(3) 使環(huán)境變量生效
source /etc/profile
(4)驗證
hadoop version
3.1.3 hadoop安裝目錄介紹
bin ? ? ? ? ? ? ? ? ? ? ? hadoop的二進制執(zhí)行命令文件存儲目錄
etc ? ? ? ? ? ? ? ? ? ? ? 配置文件存儲目錄
include ? ? ? ? ? ? ? ? ? 工具腳本存儲目錄
lib ? ? ? ? ? ? ? ? ? ? ? 資源庫存儲目錄
libexec ? ? ? ? ? ? ? ? ? ?
LICENSE-binary
licenses-binary
LICENSE.txt
NOTICE-binary
NOTICE.txt
README.txt
sbin ? ? ? ? ? ? ? ? ? ? 集群管理命令存儲目錄,例如服務啟停的命令
share ? ? ? ? ? ? ? ? ? 共享資源、開發(fā)工具和案例存儲目錄
3.1.4 案例演示測試
wordcount:
(1) 創(chuàng)建目錄,存放文本文件
for i in {1..1000}; do cat file1 >> file2; done
mkdir ~/input
(2) 執(zhí)行wordcount
cd /usr/local/hadoop-3.3.1/share/hadoop/mapreduce/
???????hadoop jar hadoop-mapreduce-examples-3.3.1.jar wordcount ~/input ~/output
(3) 查看結(jié)果
cat ~/output/*
注意:output不能自己創(chuàng)建,一定要hadoop自己創(chuàng)建
pi (直接計算)
hadoop jar hadoop-mapreduce-examples-3.3.1.jar pi 100 100
3.2偽分布式安裝:
偽分布式模式也是只需要一臺機器,但是與本地模式的不同,偽分布式使用的是分布式的思想,具有完整的分布式文件存儲和分布式計算的思想。只不過在進行存儲和計算的時候涉及到的相關的守護進程都運行在同一臺機器上,都是獨立的Java進程,因而稱為偽分布式集群。比本地模式多了代碼調(diào)試功能,允許檢查內(nèi)存使用情況、HDFS輸出輸出、以及其他的守護進程交互。
3.2.1.jdk及hadoop安裝同單機點安裝
3.2.2.關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
?
#關閉selinux
vi /etc/selinux/config
SELINUX=disabled
3.2.3.修改host映射
hostnamectl set-hostname --主機名稱
cat >> /etc/hosts << EOF
192.168.68.128 hadoopmaster
EOF
3.2.4.確保ssh對localhost的免密登認證有效
#1.使用rsa加密技術(shù),生成公鑰和私鑰
ssh-keygen -t rsa
#2.進入~/.ssh目錄下,使用ssh-copy-id命令
ssh-copy-id root@hadoopmaster
3.2.5配置hadoop文檔
(1).core-site.xml
<configuration>
<!--指定namenode的地址-->
<!--注意: hadoop1.x默認端口9000 hadoop2.x時代默認端口 9820-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopnode2:9820</value>
</property>
? <!--用來指定使用hadoop時產(chǎn)生文件的存放目錄-->
? <property>
? ? ? ? ? <name>hadoop.tmp.dir</name>
? ? ? ? ? <value>/usr/local/hadoop-3.3.1/tmp</value>
? </property>
? ? ? <!--用來設置檢查點備份日志的最長時間-->
? ? ? <name>fs.checkpoint.period</name>
? ? ? <value>3600</value>
</configuration>
(2).hdfs-site.xml
<configuration>
? <property>
? ? ? <name>dfs.replication</name>
? ? ? <value>1</value>
? </property>
? <!--secondarynamenode守護進程的http地址: 主機名和端口號。參考守護進程布局-->
? <property>
? ? ? <name>dfs.namenode.secondary.http-address</name>
? ? ? <value>hadoopmaster:9868</value>
? </property>
? <!--namenode守護進程的http地址: 主機名和端口號。參考守護進程布局-->
? <property>
? ? ? <name>dfs.namenode.http-address</name>
? ? ? <value>hadoopmaster:9870</value>
? </property>
</configuration>
(3).hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_321
#hadoop3中,需要添加如下配置,設置啟動集群角色的用戶是誰
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
注意:如果要使用偽分布式
vim workers
修改 localhost為主機名
(4)格式化集群
在core-site.xml中配置過hadoop.tmp.dir的路徑,在集群格式化的時候需要保證這個路徑不存在,如果之前存在數(shù)據(jù),先將其刪除,再進行格式化
hdfs namenode -format
(5) 啟動集群
start-dfs.sh
(6) WEBUI查看
在瀏覽器中輸入 http://192.168.86.131:9870
(7)驗證
hdfs dfs -put input/ / ? ? ? ? ? ? ? #將本地的數(shù)據(jù)上傳到分布式上集群上
hdfs dfs -ls -R / ? ? ? ? ? ? ? ? ? ? #數(shù)據(jù)檢查
手動命令來離開安全模式
hadoop dfsadmin -safemode leave
在分布式集群上刪除文件
hdfs dfs -rm -r -f /input/file4*
執(zhí)行分布式計算任務
hadoop jar hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output
查看結(jié)果
hdfs dfs -cat /output/*
3.3完全分布式安裝
3.3.1 完全分布式介紹
在真實的企業(yè)環(huán)境中,服務器集群會使用到多臺機器,共同配合,來構(gòu)建一個完整的分布式文件系統(tǒng),而在這樣的分布式文件系統(tǒng)中,HDFS相關的守護進程也會分布在不同的機器上,例如:
NameNode守護進程,盡可能的單獨部署在一臺硬件性能較好的機器上。
其他的每臺機器上都會部署一個DataNode守護進程,一般的硬件環(huán)境即可。
SecondaryNameNode守護進程最好不要和NameNode在同一臺機器上。
3.3.2守護進程布局
3.3.3集群安裝
1.總綱
(1) 三臺機器的防火墻必須關閉
(2) 確保三臺機器的網(wǎng)絡配置暢通(NAT模式,靜態(tài)IP, 主機名的配置)
(3)確保配置了三臺機器的免密登陸認證(克隆會更加方便)
(4)確保/etc/hosts文件配置了ip和hostname的映射關系
(5)確保所有機器時間同步
(6)jdk和hadoop的環(huán)境安裝配置
2.防火墻關閉、jdk安裝、hadoop安裝,及環(huán)境配置 同偽分布式
3.主機映射
cat >> /etc/hosts << EOF
192.168.68.128 hadoopmaster
192.168.68.129 hadoopnode1
192.168.68.130 hadoopnode2
EOF
4.免密登錄
1. 使用rsa加密技術(shù),生成公鑰和私鑰,一路回車即哥
ssh-keygen -t rsa
2.使用ssh-copy-id命令
ssh-copy-id root@hadmaster
ssh-coyp-id root@hadnode1
ssh-coyp-id root@hadnode2
3.驗證
ssh hadoopmaster
ssh hadoopnode1
ssh hadoopnode2
5.時間同步
#時間同步 -- centOS 7
yum install ntpdate -y
ntpdate time.windows.com
?
?
#設置時間同步 centos 8
#安裝chrony
yum install -y chrony
?
#啟動 chrony
systemctl start chronyd
?
#設為系統(tǒng)自動啟動
systemctl enable chronyd
?
#編輯配置/etc/chrony.conf
#注釋掉 pool
#添加 pool ntp.aliyun.com iburst
查看服務 chronyc sources
systemctl status chronyd
設置每分鐘同步網(wǎng)絡時間
#crontab -e
* * * * * /usr/sbin/ntpdate -u ntp.aliyun.com > /varnull 2>&1
6.安裝jdk, hadoop,及配置/etc/profile,使其生效,同單點安裝
7.編輯配置文件(/usr/local/hadoop-3.3.1/etc/hadoop)
(1) core-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
?Licensed under the Apache License, Version 2.0 (the "License");
?you may not use this file except in compliance with the License.
?You may obtain a copy of the License at
?
? ?http://www.apache.org/licenses/LICENSE-2.0
?
?Unless required by applicable law or agreed to in writing, software
?distributed under the License is distributed on an "AS IS" BASIS,
?WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
?See the License for the specific language governing permissions and
?limitations under the License. See accompanying LICENSE file.
-->
?
<!-- Put site-specific property overrides in this file. -->
?
<configuration>
<!--指定namenode的地址-->
? ? ? ?<!--注意: hadoop1.x默認端口9000 hadoop2.x時代默認端口 9820-->
? ? ? ?<property>
? ? ? ? ? ? ? ?<name>fs.defaultFS</name>
? ? ? ? ? ? ? ?<value>hdfs://hadoopmaster:9820</value>
? ? ? ?</property>
? <!--用來指定使用hadoop時產(chǎn)生文件的存放目錄-->
? <property>
? ? ? ? ? ?<name>hadoop.tmp.dir</name>
? ? ? ? ? ?<value>/usr/local/hadoop-3.3.1/tmp</value>
? </property>
?
</configuration>
(2)hdfs-site.xml
<configuration>
<property>
? ? ? ?<!-- 塊的副本數(shù)量 -->
? ? ? ?<name>dfs.replication</name>
? ? ? ?<value>3</value>
? ?</property>
? ?<!--secondarynamenode守護進程的http地址: 主機名和端口號。參考守護進程布局-->
? ?<property>
? ? ? ?<name>dfs.namenode.secondary.http-address</name>
? ? ? ?<value>hadoopnode1:9868</value>
? ?</property>
? ?<!--namenode守護進程的http地址: 主機名和端口號。參考守護進程布局-->
? ?<property>
? ? ? ?<name>dfs.namenode.http-address</name>
? ? ? ?<value>hadoopmaster:9870</value>
? ?</property>
</configuration>
(3)hadoop-env.sh
# server jvm.
# export HADOOP_REGISTRYDNS_SECURE_EXTRA_OPTS="-jvm server"
export JAVA_HOME=/usr/local/jdk1.8.0_321
#hadoop3中,需要添加如下配置,設置啟動集群角色的用戶是誰
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
(4)works
hadoopmaster
hadoopnode1
hadoopnode2
ps: scp -r 分發(fā)
scp -r jdk hadoop hadoopnode1:$PWD
8.格式化集群
hdfs namenode -format
錯誤處理
2023-10-25 04:15:56,715 ERROR namenode.NameNode: Failed to start namenode. java.lang.IllegalArgumentException: URI has an authority component
9.啟動集群
start-dfs.sh #啟動HDFS所有進程(NameNode, SecondaryNameNode, DataNode)
stop-dfs.sh #關閉HDFS所有進程(NameNode, SecondaryNameNode, DataNode)
#hdfs --daenon start 單獨啟動一個進程(當前節(jié)點)
hdfs --daemon start namenode #只開啟NameNode
hdfs --daemon start secondarynamenode #只開啟secondaryNameNode
hdfs --daemon start datanode #只開啟DataNode
#hdfs --daemon stop 單獨停止一個進程
hdfs --daemon stop namenode #只停止NameNode
hdfs --daemon stop secondarynamenode #只停止SecondaryNameNode
hdfs --daemon stop datanode #只停止DataNode
#hdfs --workers --daemon start 啟動所有的指定進程
hdfs --workers --daemon start datanode #開啟所有節(jié)點的DataNode
#hdfs --workers --daemon stop 停止所有的指定進程
hdfs --workers --daemon stop datanode #停止所有節(jié)點的DataNode
10.驗證
在瀏覽器欄輸入: http://192.168.68.128:9870/
注意:HDFS集群正常啟動,但Web頁面僅有一個DataNode 主節(jié)點的,是因為其他節(jié)點中core-site.xml中配置的項fs.defaultFS的值不一樣,統(tǒng)一修改成master節(jié)點一樣,即可解決。
11.進程查看:
jps #單機
多機或集群:
mkdir -r /opt/bin/jps-cluster.sh
#! /bin/bash
HOSTS=(hadoopmaster hadoopnode1 hadoopnode2)
#遍歷每一個節(jié)點
for HOST in ${HOSTS[@]}
do
#遠程登錄到指定節(jié)點,執(zhí)行jps命令
ssh -T $HOST << TERMINATER
echo "------------$HOST--------------"
jps | grep -iv jps
exit
TERMINATER
done
sudo chmod a+x jps-cluster.sh
ln -s /opt/bin/jps-cluster.sh /usr/bin/
12 啟動日志查看
HDFS的角色有三個,Name Node、SecondaryName、DataNode,啟動的時候也會有對應的日志文件生成,如果在啟動腳本執(zhí)行之后, 發(fā)現(xiàn)對應的角色沒有啟動起來,那就可以去查看日志文件,查看錯誤詳情,解決問題。
日志的位置: $HADOOP_HOME/logs
日志的命名:hadoop-username-daemon-host.log
13 常見問題
常見格式集群時,報錯原因
-當前用戶使用不當 -/etc/hosts里的映射關系填寫錯誤 -免密登錄認證錯誤 -jdk環(huán)境變量配置錯誤 -防火墻沒有關閉
namenode進程沒有啟動的原因
-當前用戶使用不當 -重新格式化,忘記刪除${hadoop.tmp.dir}目錄下的內(nèi)容 -網(wǎng)絡震蕩,造成edit日志文件的事務ID序號不連續(xù)
datanode出現(xiàn)問題的原因
-/etc/hosts里的映射關系寫錯誤 -免密登錄異常 -重新格式化時,忘記刪除${hadoop.tmp.dir}目錄下的內(nèi)容,造成datanode的唯一標識符不在新集群中。
上述問題暴力解決,重新格式化.
如果想重新格式化,那么需要先刪除每臺機器上的${hadoop.tmp.dir}指定路徑下的所有內(nèi)容,然后再格式化,最好也把logs目錄下的內(nèi)容也清空,因為日志內(nèi)容已經(jīng)是前一個廢棄集群的日志信息,留著也無用。
3.3.4 案例演示 : wordcount
1.準備數(shù)據(jù)
mkdir input && cd input
echo "hello world hadoop Linux hadoop" >> file1
echo "hadoop Linux hadoop Linux hello" >> file1
echo "hadoop Linux mysql Linux hadop" >> file1
echo "hadoop Linux hadoop Linux hello" >> file1
echo "Linux hadoop good programmer" >> file2
echo "good programmer studystudydayday good" >>file2
2.上傳到集群
hdfs dfs -put ~/input/ /
#檢查是否已經(jīng)上傳成功
hdfs dfs -ls -R /
3.執(zhí)行任務
hadoop jar /$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input/ /output
4.查看結(jié)果
hdfs dfs -cat /output/*
第四章 HDFS的shell操作
HDFS是一個分布式文件系統(tǒng),可以使用一些命令來操作HDFS集群上的文件
例如: 文件上傳、下載、移動、拷貝等操作。
HDFS的shell操作命令都是hdfs dfs,其他的操作直接向后拼接即可。
4.1 創(chuàng)建目錄
[-mkdir [-p] <path> ...] #在分布式文件系統(tǒng)上創(chuàng)建目錄,-p, 多層級創(chuàng)建
調(diào)用格式: hdfs dfs -mkdir /data
例如:
? hdfs dfs -mkdir /data
? hdfs dfs -mkdir -p /data/a/b/c
4.2 上傳命令
[-put [-f][-p][-l] <localsrc>...<dst>] ? #將本地文件系統(tǒng)的文件上傳到分布式文件系統(tǒng)
調(diào)用格式: hdfs dfs -put /本地文件 /分布式文件系統(tǒng)路徑
注意: 直接寫/是省略了文件系統(tǒng)的名稱hdfs://ip:port
例如:
hdfs dfs -put /root/a.txt /data
hdfs dfs -put /root/logs/* /data
其他指令:
[-moveFromLocal <localsrc>...<dst>] #將本地文件系統(tǒng)的文件上傳到分布式文件系統(tǒng)
[-copyFromLocal [-f][-p][-l] <localsrc>...<dst>]
4.3 查看命令
[-ls [-d] [-h] [-R] [<path> ...]] ? #查看分布式文件系統(tǒng)的目錄里內(nèi)容
調(diào)用格式: hdfs dfs -ls /
?
[-cat [-ignoreCrc] <src> ...] ? ? ? #查看分布式文件系統(tǒng)的文件內(nèi)容
調(diào)用格式: hdfs dfs -cat /xxx.txt
?
[-tail [-f] <file>] ? ? ? ? ? ? ? ? #查看分布式文件系統(tǒng)的文件內(nèi)容
調(diào)用模式: hdfs dfs -tail /xxx.txt
4.4 下載命令
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
注意:本地路徑的文件夾可以不存在
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localhost>]
調(diào)用模式:同copyToLocal
hdfs dfs -copyToLocal /input/file1 ~/
4.5 合并下載
hdfs dfs [generic options] -getmerge [-nl] <src> <localhost>
調(diào)用格式:hdfs dfs -getmerge hdfs 上面的路徑 本地路徑
實例:hdfs dfs -getmerge /hadoopdata/*.xml /root/test.test
4.6 刪除命令
[-rm [-f] [-r | -R] [-skipTrash] <src> ...]
注意:如果刪除文件夾時需要加-r
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
注意:必須是空文件夾,如果非空必須使用rm刪除
4.7 拷貝命令
hdfs dfs [generic options] -cp [-f] [-p | -p[topax]] <src> ... <dst>
調(diào)用格式:hdfs dfs -cp /hdfs路徑_1 /hdfs路徑_2
實例:hdfs dfs -cp /input /input2
4.8 移動命令
hdfs dfs [generic options] -mv <src> ... <dst>
調(diào)用模式:hdfs dfs -mv /hdfs路徑_1 /hdfs路徑_2
實例: hdfs dfs -mv /aaa /bbb
4.9 創(chuàng)建空文件
hdfs dfs [generic options] -touchz <path> ...
調(diào)用格式: hdfs dfs touchz /hadooptest.txt
4.10 向文件中追加內(nèi)容
HDFS的文件系統(tǒng)上的文件,不允許進行文件中的數(shù)據(jù)插入、刪除、修改操作,只支持向文件的末尾追加內(nèi)容
例如:刪除文件的第10行數(shù)據(jù),在第11行中插入數(shù)據(jù),修改第12行數(shù)據(jù)等,這些都是不允許的。
[-appendToFile <localsrc> ... <dst>]
調(diào)用格式: hdfs dfs -appendToFile 本地文件 hdfs上的文件
注意: 不支持在中間隨意增刪改操作
4.11 修改文件權(quán)限
跟本地的操作一致,-R是讓子目錄或文件也進行相應的修改
[-chgrp [-R] GROUP PATH ...]
[-chmod [-R] <MODE[, MODE]...| OCTALMODE> PATH ...]
[-chown [-R] [OWNER][:[GROUP]] PATH ...]
?
實例:hdfs dfs -chmod 777 /input
4.12 修改文件副本數(shù)量
[-setrep [-R] [-w] <rep> <path> ...]
調(diào)用格式:hdfs dfs -setrep 3 / 將hdfs根目錄及子目錄下的內(nèi)容設置成3個副本
注意:當設置的副本數(shù)量與初始化時默認的副本數(shù)量不一致時,集群會作出反應,比原來多了會自動進行復制。
4.13 文件測試
hdfs dfs [generic options] -test -[defsz] <path>
參數(shù)說明:-e:文件是否存在, 存在返回0, ? -z:文件是否為空,為空返回0 ? -d:是否是路徑(目錄),是返回0
調(diào)用格式: hdfs dfs -test -d 文件
實例: hdfs dfs -test -d /shelldata/111.txt && echo "OK" || echo "no"
解釋:測試當前的內(nèi)容是否是文件夾,如果是返回ok,如果不是返回no
4.14 查看文件夾及子文件夾數(shù)量
hdfs dfs [generic options] -count [-q] [-h] <path> ...
調(diào)用格式:hdfs dfs -count /hadoop
4.15 查看磁盤利用率及文件大小
[-df [-h] [<path> ... ]] 查看分布式系統(tǒng)的磁盤使用情況
[-du [-s] [-h] <path> ... ] #查看分布式系統(tǒng)上當前路徑下文件的情況, -h:human 以人類可讀的方式顯示
4.16 查看文件狀態(tài)
hdfs dfs [generic options] -stat [format] <path> ...
命令的作用:當向hdfs上寫文件時,可以通過dfs.blocksize配置項來設置文件的block的大小。這就導致了hdfs上的不同的文件block的大小是不相同的。有時候想知道hdfs上某個文件的block大小,可以預先估算一下計算的task的個數(shù)。stat的意義:可以查看文件的一些屬性。
調(diào)用格式:hdfs dfs -stat [format] 文件路徑
format的形式:
%b: 打印文件的大小(目錄大小為0)
%n: 打印文件名
%o: 打印block的size
%r: 打印副本數(shù)
%y: utc時間 yyyy-MM-dd HH:mm:ss
%Y: 打印自1970年1月1日以來的utc的微秒數(shù)
%F: 目錄打印directory, 文件打印regular file
?
注意:
1)當使用-stat命令但不指定format時,只打印創(chuàng)建時間,相當于%y
2)-stat 后面只跟目錄, %r, %o 等打印的都是0,只有文件才有副本和大小
實例:
hdfs dfs -stat %b-%n-%o-%r /input/file1
4.17 回收站
-
修改core-site.xml文件
<!--設置檢查點刪除的時間間隔,單位是分鐘,如果設置為0表示不啟用回收站. --> <property> <name>fs.trash.interval</name> <value>1440</value> </property> <!-- 這是檢查點創(chuàng)建的時間間隔,單位是分鐘. --> <!-- 這個值應該小于或等于fs.trash.interval, 如果設置為0, 則會將這個設置為 fs.trash.interval的值--> <property> <name>fs.trash.checkpoint.interval</name> <value>0</value> </property>
-
基本操作
#刪除文件目錄, 刪除之后會將文件移動到回收站 hdfs dfs -rm -r /test #清空回收站的數(shù)據(jù) hdfs dfs -expunge #直接刪除文件目錄,不進入回收站 hdfs dfs -rm -r -skipTrash /test2 #找回文件 hdfs dfs -mv /user/root/.Trash/Current/test /test
第五章 HDFS的塊
5.1 傳統(tǒng)型分布式文件系統(tǒng)的缺點
現(xiàn)在想象一下這種情況,有四個文件 0.5TB的file1, 2TB的file2, 50GB的file3, 100GB的file4, 有7個服務器,每個服務器上有10個1TB的硬盤.
在存儲方式上, 我們可以將這四個文件存儲在同一個服務器上(當然大于1TB文件需要切分),我們需要將一個文件來記錄這種存儲的映射關系吧。用戶是可以通過這種映射關系來找到節(jié)點硬盤相應的文件的。那么缺點也就暴露子出來。
第一、 負載不均衡
因為文件大小不一致,勢必會導致有的節(jié)點磁盤的利用率高,有的節(jié)點磁盤利用率低。
第二、網(wǎng)絡瓶頸問題
一個過大的文件存儲在一個節(jié)點磁盤上,當有并行處理時,每個線程都需要從這個節(jié)點磁盤上讀取這個文件的內(nèi)容,那么就會出現(xiàn)網(wǎng)絡瓶頸,不利于分布式的數(shù)據(jù)處理。
5.2 HDFS的塊
HDFS與其他普通文件系統(tǒng)一樣,同樣引入了塊(block)的概念,并且塊的大小是固定的,但是不像普通文件系統(tǒng)那樣小,而是根據(jù)實際需求可以自定義的。塊是HDFS系統(tǒng)當中的最小存儲單位,在hadoop2.0中默認大小為128MB(Hadoop1.x中的塊大小為64M)。在HDFS上的文件會被拆分成多個塊,每個塊作為獨立的單元進行存儲。多個塊存放在不同的DataNode上,整個過程中HDFS系統(tǒng)會保證一個塊存儲在一個數(shù)據(jù)節(jié)點上。但值得注意的是,如果某文件大小或者文件的最后一個塊沒有達到128M,則不會占據(jù)整個空間。
我們來看看HDFS的設計思想:以下圖為例,來進行解釋。
5.3 HDFS的塊大小
HDFS上的塊大小為什么會遠遠大于傳統(tǒng)文件?
1.目的是為了最小化尋址開銷時間。 在I/O開銷中, 機械硬盤的尋址時間是最耗時的部分。一旦找到第一條記錄,剩下的順序讀取效率是非常高的,因此以塊為單位讀寫數(shù)據(jù),可以盡量減少總的磁盤尋道時間。 HDFS尋址開銷不僅包括磁盤尋道開銷,還包換數(shù)據(jù)塊的定位開銷,當客戶端需要訪問一個文件時,首先從名稱節(jié)點獲取組成這個文件的數(shù)據(jù)塊的位置列表,然后根據(jù)位置列表獲取實際存儲各個數(shù)據(jù)塊的數(shù)據(jù)節(jié)點的位置。最后,數(shù)據(jù)節(jié)點根據(jù)數(shù)據(jù)塊信息在本地Linux文件系統(tǒng)中找到對應的文件,并把數(shù)據(jù)返回給客戶端,設計成一個比較大的塊,可以減少每個塊兒中數(shù)據(jù)的總的尋址開銷,相對降低了單位數(shù)據(jù)的尋址開銷。 磁盤的尋址時間大約在5-15ms之間,平均值為10ms,而最小化尋址開銷時間普遍認為點1鈔的百分之一是最優(yōu)的,那么塊大小的選擇就參考1鈔釧的傳輸速度,比如2010年硬盤的傳輸速率是100M/s,那么就選擇塊大小為128M。 2.為了節(jié)省內(nèi)存的使用率 一個塊的元數(shù)據(jù)大約150個字節(jié),1億個塊,不論大小,都會占用20G左右的內(nèi)存,因此塊越大,集群相對存儲的數(shù)據(jù)就越多。所以暴露了HDFS一個缺點,不適合存儲小文件。
不適合存儲小文件解釋: 1.從存儲能力出發(fā)(固定內(nèi)存) 因為HDFS的文件是以塊為單位存儲的,且如果文件大小不到128M的時候,是不會占用整個塊的空間的。但是,這個塊依然會在內(nèi)存中占用150個字節(jié)的元數(shù)據(jù)。因此,同樣的內(nèi)存占用的情況下,大量的小文件會導致集群的存儲能力不足。 例如:同樣是128G的內(nèi)存,最多可存儲9.2億個塊。如果都是小文件,例如1M,則集群存儲的數(shù)據(jù)大小為9.2億*1M = 877TB的數(shù)據(jù)。但是如果存儲的都是128M的文件,則集群存儲的數(shù)據(jù)大小為109.6P的數(shù)據(jù)。存儲能力大不相同。 2.從內(nèi)存占用出發(fā)(固定存儲能力) 同樣假設存儲1M和128M的文件對比,同樣存儲1PB的數(shù)據(jù), 如果是1M的小文件存儲,占用的內(nèi)存空間為1PB/1MB*150Byte=150G的內(nèi)存,如果存儲的是128M的文件存儲,占用的內(nèi)存空間為1PB/128M*150Byte=1.17G的內(nèi)存占用。可以看到,同樣存儲1PB的數(shù)據(jù),小文件的存儲比起大文件占用更多的內(nèi)存。
5.4 塊的相關參數(shù)設置
當然塊大小在默認配置文件hdfs-default.xml中有相關配置,我們可以在hdfs-size.xml中進行重置。
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>默認塊大小,以字節(jié)為單位??梢允褂靡韵潞缶Y(不區(qū)分大小寫): k, m, g, t, p, e以重新指定大小(例如128k,512m,1g等)</description>
</property>
?
<property>
<name>dfs.namenode.fs-limits.min-block-size</name>
<value>1048576</value>
<description>以字節(jié)為單位的最小塊大小,由Namenode在創(chuàng)建時強制執(zhí)行時間,這可以防止意外創(chuàng)建帶有小塊的文件降低性能。</description>
</property>
?
<property>
<name>dfs.namenode.fs-limits.max-blocks-per-file</name>
<value>1048576</value>
<description>每個文件的最大塊數(shù),由寫入時的Namenode執(zhí)行,這可以防止創(chuàng)建降低性能的超大文件</description>
</property>
5.5 塊的存儲位置
<!-- 確定DFS數(shù)據(jù)節(jié)點應該將其塊存儲在本地文件系統(tǒng)的何處 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</>
</property>
5.6 HDFS的優(yōu)點
1.高容錯性(硬件故障是常態(tài)): 數(shù)據(jù)自動保存多個副本,副本丟失后,會自動恢復 2.適合大數(shù)據(jù)集:GB、TB、甚至PB級數(shù)組、千萬規(guī)模以上的文件數(shù)量,1000以上節(jié)點規(guī)模。 3.數(shù)據(jù)訪問:一次性寫入,多次讀取,保證數(shù)據(jù)一致性,安全性 4.構(gòu)建成本低,可以構(gòu)建在廉價機器上。 5.多種軟硬件平臺中的可移植性 6.高效性:hadoop能夠在節(jié)點之間動態(tài)地移動數(shù)據(jù),并保證各個節(jié)點的動態(tài)平衡,因此處理速度非???。 7.高可靠性: Hadoop的存儲和處理數(shù)據(jù)的能力值得人們依賴
5.7 HDFS的缺點
1.不適合做低延遲數(shù)據(jù)訪問: HDFS的設計目標有一點是:處理大型數(shù)據(jù)集,高吞吐率,這一點勢必要以高延遲為代價的。因此HDFS不適合處理用戶要求的毫秒級的低延遲應用請示。 2.不適合小文件存?。? 一個是大量小文件需要消耗大量的尋址時間,違反了HDFS的盡可能尋址時間比例的設計目標。第二個是內(nèi)存有限,一個block元數(shù)據(jù)大內(nèi)存消耗大約150個字節(jié),存儲一億個block和存儲一億個小文件都會消耗20G內(nèi)存,因此相對來說,大文件更省內(nèi)存。 3.不適合并發(fā)寫入,文件隨機修改: HDFS上的文件只能擁有一個寫者,僅僅支持append操作。不支持多用戶對同一個文件的寫操作,以及在文件任意位置進行修改。
第六章 HDFS的體系結(jié)構(gòu)
6.1 體系結(jié)構(gòu)解析
HDFS采用的是master/slaves這種主從的結(jié)構(gòu)模型來管理數(shù)據(jù),這種結(jié)構(gòu)模型主要由四個部分組成,分別是Client(客戶端)、Namenode(名稱節(jié)點)、Datanode(數(shù)據(jù)節(jié)點)和SecondaryNameNode。真正的一個HDFS集群包括一個Namenode和若干數(shù)目的Datanode. Namenode是一個中心服務器,負責管理文件系統(tǒng)的命名空間(Namespace),它在內(nèi)存中維護著命名空間的最新狀態(tài),同時并持久性文件(fsimage和edit)進行備份,防止宕機后,數(shù)據(jù)丟失。namenode還負責管理客戶端對文件的訪問,比如權(quán)限驗證等。 集群中的Datanode一般是一個節(jié)點支行一個Datanode進行,真正負責管理客戶端的讀寫請求,在Namenode的統(tǒng)一調(diào)度下進行數(shù)據(jù)塊的創(chuàng)建、刪除和復制等操作。數(shù)據(jù)塊實際上都是保存在Datanode本地的Linux文件系統(tǒng)中的。每個Datanode會定期的向Namenode發(fā)送數(shù)據(jù),報告自已的狀態(tài)(我們稱之為心跳機制)。沒有按時發(fā)送心跳信息的Datanode會被Namenode標記為“宕機”,不會再給他分配任何I/O請求。 用戶在使用Client進行I/O操作時,仍然可以像使用普通文件系統(tǒng)那樣,使用文件名去存儲和訪問文件,只不過,在HDFS內(nèi)部,一個文件會被切分成若干個數(shù)據(jù)塊,然后被分布存儲在若干個Datanode上。 比如,用戶在Client上需要訪問一個文件時,HDFS的實際工作流程如此:客戶端先把文件名發(fā)送給Namenode,Namenode根據(jù)文件名找到對應的數(shù)據(jù)塊信息及其每個數(shù)據(jù)塊所在的Datanode位置,然后把這些信息發(fā)送給客戶端。之后,客戶端就直接與這些Datanode進行通信,來獲取數(shù)據(jù)(這個過程,Namenode并不參與數(shù)據(jù)塊的傳輸)。這種設計方式,實現(xiàn)了并發(fā)訪問,大大提高了數(shù)據(jù)的訪問速度。 HDFS集群中只有唯一的一個Namenode,負責所有元數(shù)據(jù)的管理工作。這種方式保證了Datanode不會脫離Namenode的控制,同時,用戶數(shù)據(jù)也永遠不會經(jīng)過Namenode,大大減輕了Namenode的工作負擔,使之更方便管理工作。通常在部署集群中,我們要選擇一臺性能較好的機器來作為Namenode。當然,一臺機器上也可以運行多個Datanode,甚至Namenode和Datanode也可以在一臺機器上,只不過實際部署中,通常不會這么做的
參考:HDFS Architecture
6.2 HDFS進行之NameNode
- namenode進程只有一個(HA除外) - 管理HDFS的命名空間,并以fsimage和edit進行持久化保存 - 在內(nèi)存中維護數(shù)據(jù)塊的映射信息 - 實施副本冗余策略 - 處理客戶端的訪問請求
6.3 HDFS進行之DataNode
- 存儲真正的數(shù)據(jù)(塊進行存儲) - 執(zhí)行數(shù)據(jù)塊的讀寫操作 - 心跳機制(3秒)
6.4 HDFS進程之SecondaryNamenode
- 幫助NameNode合并fsimage和edits文件 - 不能實時同步,不能作為熱備份節(jié)點
6.5HDFS的Client接口
- HDFS實際上提供了各種語言操作HDFS的接口 - 與NameNode進行交互,獲取文件的存儲位置(讀/取兩種操作) - 與DataNode進行交互,讀取時分片進行讀取
6.6 映像文件fsimage
命名空間指的就是文件系統(tǒng)樹及整棵樹內(nèi)的所有文件和目錄的元數(shù)據(jù),每個Namenode只能管理唯一的一命名空間。HDFS暫不支持軟鏈接和硬連接。Namenode會在內(nèi)存里維護文件系統(tǒng)的元數(shù)據(jù),同時還使用fsimage和edit日志兩個文件來輔助管理元數(shù)據(jù),并持久化到本地磁盤上。
- fsimage
命名空間鏡像文件,它是文件系統(tǒng)元數(shù)據(jù)的一個完整的永久檢查點,內(nèi)部維護的是最近一次檢查點的文件系統(tǒng)樹和整棵樹內(nèi)部的所有文件和目錄的元數(shù)據(jù),如修改時間,訪問時間,訪問權(quán)限,副本數(shù)據(jù),塊大小,文件的塊列表信息等等。
fsimage默認存儲兩份,是最近的兩次檢查點。
- 使用XML格式查看fsimage文件
hdfs oiv -i [fsimage_xxxxx] -o [目標文件路徑] -p XML
hdfs oiv -i fsimage_0000000052 -o ~/fs52.xml -p XML
6.7 日志文件edit
集群正常運行時,客戶端的所有更新操作(如打開、關閉、刪除、重命名等)除了在內(nèi)存中維護外,還會被寫到edit日志文件中,而不是直接寫入fsimage映像文件。
因為對于分布式文件系統(tǒng)而言,fsimage映像文件通常都很龐大,如果客戶端所有的更新操作都直接往fsimage文件中添加,那么系統(tǒng)的性能一定越來越差。相對而言,edit日志文件通常都要遠遠小于fsimage,一個edit日志文件最大64M,更新操作寫入到EditLog是非常高效的。
那么edit日志文件里存儲的到底是什么信息呢,我們可以將edit日志文件轉(zhuǎn)成xml文件格式,進行查看
查看editlog文件的方式:
查看editlog文件的方式:
hdfs oev -i [edits_inprogress_xxx] -o [目標文件路徑] -p XML
參考xml文件后,我們可以知道日志文件里記錄的內(nèi)容有:
行為代碼:比如 打開、創(chuàng)建、刪除、重命名、關閉
事務id
inodeid
副本個數(shù)
修改時間
訪問時間
塊大小
客戶端信息
權(quán)限等
塊id等
第七章 HDFS的工作流程
7.1 開機啟動Namenode過程
-
非第一次啟動集群的啟動流程
我們應該知道,在啟動namenode之前,內(nèi)存里是沒有任何元數(shù)據(jù)的信息的,那么啟動集群的過程是怎樣的呢?下面來敘述一下:
第一步: Namenode在啟動時,會先加載name目錄下最近的fsimage文件 將fsimage里保存的元數(shù)據(jù)加載到內(nèi)存當中,這樣內(nèi)存里就有了之前檢查點里存儲的所有元數(shù)據(jù)。但是還少了從最近一次檢查時間點到關閉系統(tǒng)時的部分數(shù)據(jù),也就是edit日志文件里存儲的數(shù)據(jù). 第二步: 加載剩下的edit日志文件 將從最近一次檢查點到目前為止的所有的日志文件加載到內(nèi)存里,重演一次客戶端的操作,這樣,內(nèi)存里就是最新的文件系統(tǒng)的所有元數(shù)據(jù)了。 第三步: 進行檢查點設置(滿足條件會進行) namenode會終止之前正在使用的edit文件,創(chuàng)建一個空的edit日志文件,然后將所有的未合并過的edit日志文件和fsimage文件進行合并,產(chǎn)生一個新的fsimage。 第四步: 處于安全模式下,等待datanode節(jié)點的心跳反饋,當收到99.9%的塊的至少一個副本后,退出安全模式,開始轉(zhuǎn)為正常狀態(tài)。
不是第一次啟動,直接加載編輯日志和edit文件的情況展示:
-
小知識
(1)滾動編輯日志(前提必須啟動集群) 1.可以強制滾動 hdfs dfs admin -rollEdits 2.可以等到edits.inprogress滿64m生成edits文件 3.可以等操作數(shù)量達到100萬次 4.時間到了,默認1小時 注意:在2,3,4時產(chǎn)生滾動,會進行checkpoint (2)鏡像文件什么時候產(chǎn)生 可以在namenode啟動時加載鏡像文件和編輯日志 也可以在secondarynamenode生成的fsimage.chkpoint文件重新替換namenode原來的fsimage文件時。 (3)namenode目錄說明
7.2 安全模式介紹
Namenode啟動時,首先要加載fsimage文件到內(nèi)存,并逐條執(zhí)行editlog文件里的事務操作,在這個期間一但在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)的映像,就會新創(chuàng)建一個fsimage文件(該操作不需要SecondaryNamenode)和一個空的editlog文件。在這個過程中,namenode是運行在安全模式下的,Namenode的文件系統(tǒng)對于客戶端來說是只讀的,文件修改操作如寫,刪除,重命名等均會失敗。 系統(tǒng)中的數(shù)據(jù)塊的位置并不是由namenode維護的,而是以塊列表的形式存儲在datanode中。 在系統(tǒng)的正常操作期間,namenode會在內(nèi)存中保留所有塊位置的映射信息。在安全模式下,各個datanode會向namenode發(fā)送最新的塊列表信息,如果滿足"最小副本條件",namenode會在30秒鐘之后就退出安全模式,開始高效運行文件系統(tǒng),所謂的最小副本條件指的是在整個文件系統(tǒng)中99.9%的塊滿足最小副本級別(默認值dfs.replication.min=1)。 PS:啟動一個剛剛格式化完的集群時,HDFS還沒有任何操作呢,因此Namenode不會進入安全模式。
-
系統(tǒng)離開安全模式,需要滿足哪些條件?
當namenode收到來自datanode的狀態(tài)報告后,namenode根據(jù)配置確定。 1.可用的block占總數(shù)的比例 2.可用的數(shù)據(jù)節(jié)點數(shù)量符合要求之后,離開安全模式。 1、2兩個條件滿足后維持的時間達到配置的要求。 注意:如果有必要,也可以通過命令強制離開安全模式。
-
與安全模式相關的主要配置在hdfs-site.xml文件中,主要有下面幾個屬性
1.dfs.namenode.replication.min 最小的文件block副本數(shù)量,默認為1 2.dfs.namenode.safemode.threshold-pct: 副本數(shù)達到最小要求的block占系統(tǒng)總block數(shù)的百分比,當實際比例超過該配置后,才能離開安全模式(但是還需要其他條件也滿足)。默認為0.999f,也就是說符合最小副本數(shù)要求的block占比超過99.9%時,并且其他條件也滿足才能離開安全模式。如果為小于等于0,則不會等待任何副本可達到要求即可離開。如果大于1,則永遠處于安全模式. 3.dfs.namenode.safemode.min.datanode: 離開安全模式的最小可用(alive)datanode數(shù)量要求,默認為0,也就是即使所有datanode都不可用,仍然可以離開安全模式。 4.dfs.namenode.safemode.extension: 當集群可用block比例,可用datanode都達到要求之后,如果在extension配置的時間段之后依然能滿足要求,此時集群才離開安全模式。單位為毫秒,默認為1。也就是當滿足條件并且能夠維持1毫秒之后,離開安全模式。這個配置主要是對集群的穩(wěn)定程度做進一步的確認。避免達到要求后馬上有不符合安全標準。
-
相關命令
-
查看namenode是否處于安全模式
hdfs dfsadmin -safemode get
-
管理員可以隨時讓Namenode進入或開安全模式,這項功能在維護和升級集群時非常關鍵
hdfs dfsadmin -safemode enter hdfs dfsadmin -safemode leave
-
將大下的屬性的值設置為大于1,將永遠不會離開安全模式
<property> <name>dfs.namenode.safemode.threshold-pct</name> <value>0.999f</value> </property>
-
有時,在安全模式下, 用戶想要執(zhí)行某條命令,特別是在腳本中,此時可以先讓安全模式進入等待狀態(tài)。
hdfs dfsadmin -safemode wait
-
7.3 DataNode與NameNode通信(心跳機制)
1.hdfs是master/slave結(jié)構(gòu),master包括namenode和resourcemanager,slave包括datanode和nodemanager 2.master啟動時會開啟一個IPC服務,等待slave連接 3.slave啟動后,會主動連接IPC服務,并且每隔3秒鏈接一次,這個時間是可以調(diào)整的,設置hearbeat,這個每隔一段時間連接一次的機制,稱為心跳機制。slave通過心跳給master匯報自己信息,master通過心跳下達命令。 4.Namenode通過心跳得知datanode狀態(tài)。Resourcemanager通過心跳得知nodemanager狀態(tài) 5.當master長時間沒有收到slave信息時,就認為slave掛掉了。
注意:超長時間計算結(jié)果:默認為10分鐘30秒
屬性:dfs.namenode.hearbeat.recheck-interval 的默認值為5分鐘 #Recheck的時間單位為毫秒 屬性:dfs.hearbeat.interval 的默認值時3秒, ? #heartbeat的時間單位為秒 ? 計算公式:2 * recheck + 10 * heartbeat
7.4 SecondayNamenode的工作機制(檢查點機制)
SecondaryNamenode,是HDFS集群中的重要組成部分,它可以輔助Namenode進行editlog的合并工作,減小editlog文件大小,以便縮短下次Namenode的重啟時間,能盡快退出安全模式。
兩個文件的合并周期,稱之為檢查點機制(checkpoint),是可以通過hdfs-default.xml配置文件進行修改(hdfs-site.xml)的:
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
<description>兩次檢查點間隔的秒數(shù),默認是1個小時</description>
</property>
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>txid執(zhí)行的次數(shù)達到100w次,也執(zhí)行checkpoint</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description>60秒一檢查txid的執(zhí)行次數(shù)</description>
</property>
通過上圖,可以總結(jié)如下:
1. SecondaryNamenode請求Namenode停止使用正在編輯的editlog文件,Namenode會創(chuàng)建新的editlog文件,同時更新seed_txid文件。 2. SecondaryNamenode通過HTTP協(xié)議獲取Namenode上的fsimage和editlog文件。 3. SecondaryNamenode將fsimage讀進內(nèi)存當中,并逐步分析editlog文件里的數(shù)據(jù),進行合并操作,然后寫入新文件fsimage_x.ckpt文件中。 4. SecondaryNamenode將新文件fsimage_x.ckpt通過HTTP協(xié)議發(fā)送回Namenode。 5. Namenode再進行更名操作。
7.5 讀流程的詳解
讀操作
-hdfs dfs -get /file02 ./file02
-hdfs dfs -copyToLocal /file02 ./file02
-FSDataInputStream fsis = fs.open("/input/a.txt");
-fsis.read(byte[] a);
-fs.copyToLocal(path1, path2);
1.客戶端通過調(diào)用FileSystem對象的open()方法來打開希望讀取的文件,對于HDFS來說,這個對象是DistrbutedFileSystem,它通過使用遠程過程調(diào)用(RPC)來調(diào)用namenode,以確定文件起始塊的位置。 2.對于第一個塊,Namenode返回存有該副本的DataNode地址,并根據(jù)距離客戶端的遠近來排序。 3.DistributedFileSystem實例會返回一個FSDataInputStream對象(支持文件定位功能)給客戶端以便讀取數(shù)據(jù),接著客戶端對這個輸入流調(diào)用read()方法。 4.FSDataInputStream隨即連接距離最近的文件中第一個塊所在的DataNode,通過對數(shù)據(jù)流反復調(diào)用read()方法,可以將數(shù)據(jù)從DataNode傳輸?shù)娇蛻舳恕?5.當讀取到塊的末端時,F(xiàn)SInputStream關閉與該DataNode的連接,然后尋找下一個塊的最佳DataNode 6.客戶端從流中讀取數(shù)據(jù)時,塊是按照打開FSInputStream與DataNode的新建連接的順序讀取的。它也會根據(jù)需要詢問NameNode來檢索下一批數(shù)據(jù)塊的DataNode的位置。一旦客戶端完成讀取,就對FSInputStream調(diào)用close方法。 注意:在讀取數(shù)據(jù)的時候,如果FSInputStream與DataNode通信時遇到錯誤,會嘗試從這個塊的最近的DataNode讀取數(shù)據(jù),并且記住那個故障的DataNode,保證后續(xù)不會反復讀取該節(jié)點上后續(xù)的塊。FInputStream也會通過校驗和確認從DataNode發(fā)來的數(shù)據(jù)是否完整。如果發(fā)現(xiàn)有損壞的塊,F(xiàn)SInputStream會從其他的塊讀取副本,并且將損壞的塊通知給NameNode。
7.6 寫流程的詳解
寫操作
- hdfs dfs -put ./file02 /file02
- hdfs dfs -copyFromLocal ./file02 /file02
- FSDataOutputStream fsout = fs.create(path);
fsout.write(byte[]);
- fs.copyFromLocal(path1, path2);
詳細圖解
實現(xiàn)過程
在圖的1和2,客戶端(操作者)通過調(diào)用DistributedFileSystem對象的create()方法(內(nèi)部會調(diào)用HDFSClient對象的create()方法),實現(xiàn)在namenode上創(chuàng)建新的文件并返回一個FSDataOutputSteam對象. 1)DistributedFileSystem要通過RPC調(diào)用namenode去創(chuàng)建一個沒有blocks關聯(lián)的新文件,此時該文件中還沒有相應的數(shù)據(jù)塊信息。 2)但是在新文件創(chuàng)建之前,namenode執(zhí)行各種不同的檢查,以確保這個文件不存在以及客戶端有新建該文件的權(quán)限。如果檢查通過,namenode就會為創(chuàng)建新文件記錄一條事務記錄(否則,文件創(chuàng)建失敗并向客戶端拋出一個IOException異常)。DistributedFileSystem向客戶端返回一個FSDataOutputStream對象。 3)FSDataOutputStream被封裝成DFSOutputStream.DFSOutputSteam能夠協(xié)調(diào)namenode和datanode??蛻舳碎_始寫數(shù)據(jù)到DFSOutputSteam,DFSOutputStream會把數(shù)據(jù)分析成一個個的數(shù)據(jù)包(packet).并寫入一個內(nèi)部隊列,這個隊列稱為"數(shù)據(jù)對列"(dataqueue); 4)DataStream會去處理接受Data queue,它先詢問namenode這個新的block最適合存儲的在哪幾個datanode里(比方副本數(shù)量3,那么就找到3個最適合的datanode),把他們排成一個pipeline,DataStream把packet組成,作用是等待datanode完全接收完數(shù)據(jù)后接收響應。 5)datanode寫入數(shù)據(jù)成功之后,會為ResponseProcessor線程發(fā)送一個寫入成功的信息回執(zhí),當收到管理中所有的datanode確認信息后,ResponseProcessor線程會將該數(shù)據(jù)包確認從隊列中刪除。 6)客戶端寫完數(shù)據(jù)后調(diào)用 close()方法,關閉寫入流。 7)DataStreamer把剩余的包都刷到pipeline里,然后等待ack信息,收到最后一個ack后,客戶端通過調(diào)用DistributedFileSystem對象的complete()方法來告知namenode數(shù)據(jù)傳輸完成。
注意點1:如果任何datanode在寫入數(shù)據(jù)期間發(fā)生故障,則執(zhí)行以下操作:
1.首先關閉管道,把確認隊列中的所有數(shù)據(jù)包都添加回數(shù)據(jù)隊列的最前端,以確保故障節(jié)點下游的datanode不會漏掉任何一個數(shù)據(jù)包。 2.為存儲在另一正常datanode的當前數(shù)據(jù)塊制定一個新標識,并將該標識傳送給namenode,以便故障datanode在恢復后可以刪除存儲的部分數(shù)據(jù)塊 3.從管道中刪除故障datanode,基于兩個正常datanode構(gòu)建一條新管道,余下數(shù)據(jù)塊寫入管道中正常的datanode 4.namenode注意到塊副本不足時,會在一個新的Datanode節(jié)點上創(chuàng)建一個新的副本。
注意點2:
注意:在一個塊被寫入期間可能會有多個datanode同時發(fā)生故障,但概率非常低,只要寫入了dfs.namenode.replication.min的副本數(shù)(默認1),寫操作就會成功,并且這個塊可以在集群中異步復制,直到達到其目標副本數(shù)dfs.replication的數(shù)量(默認3);
注意點3:
client運行write操作后,寫完的block才是可見的,正在見的block對client是不可見的,僅僅有調(diào)用sync方法。client才確保該文件的寫操作已經(jīng)全部完畢。當client調(diào)用close方法時,會默認調(diào)用sync方法。
第八章 IDE遠程管理HDFS
布署本地Hadoop環(huán)境
8.1本地環(huán)境配置
(1) windows系統(tǒng)
1.解壓hadoop壓縮包到指定路徑 注意:hadoop解壓的路徑不要存在空格。
如:This command was run using /D:/BigData/hadoop-3.3.1/share/hadoop/common/hadoop-common-3.3.1.jar
2.新建系統(tǒng)變量 HADOOP_HOME
3. 加入windows支持
Hadoop本身對Windows的支持并不友好,如果需要完整使用,需要將winutils.exe和hadoop.dll兩個文件移動到%HADOOP_HOME%\bin目錄
4.編輯%HADOOP_HOME%\etc/hadoop\hadoop-env.cmd, 設置JAVA_HOME
在HADOOP_IDENT_STRING后面加引號
如出現(xiàn)下面問題,注意檢查上面的JAVA_HOME的配置路徑
驗證:
(2) MacOS環(huán)境布署
-
解壓包
tar -zxvf hadoop-3.3.1-aarch64 -C /opt/softwares
-
配置hadoop-env.sh
export JAVA_HOME=`/usr/libexec/java_home
`
-
配置環(huán)境變量
vim ~/.bash_profile ? export HADOOP_HOME=/opt/softwares/hadoop-3.3.1 export PATH+$PATH;$HADOOP_HOME/bin;$HADOOP_HOME/sbin;
-
驗證
hadoop version
8.2 創(chuàng)建pom文件
<dependencies>
? ? ? <dependency>
? ? ? ? ? <groupId>org.apache.hadoop</groupId>
? ? ? ? ? <artifactId>hadoop-common</artifactId>
? ? ? ? ? <version>3.3.1</version>
? ? ? </dependency>
? ? ? <dependency>
? ? ? ? ? <groupId>org.apache.hadoop</groupId>
? ? ? ? ? <artifactId>hadoop-client</artifactId>
? ? ? ? ? <version>3.3.1</version>
? ? ? </dependency>
? ? ? <dependency>
? ? ? ? ? <groupId>org.apache.hadoop</groupId>
? ? ? ? ? <artifactId>hadoop-hdfs</artifactId>
? ? ? ? ? <version>3.3.1</version>
? ? ? </dependency>
</dependencies>
8.3 創(chuàng)建文件系統(tǒng)對象
/*
? ? ? 文件系統(tǒng)對象的獲取
? ? */
? @Test
? public void getFileSystemTest() throws IOException {
? ? ? //創(chuàng)建配置文件對象,加載配置文件上的配置信息
? ? ? //默認讀取core-default.xml, hdfs-default.xml, mapred-default.xml yarn-default.xml
? ? ? //如果項目中有配置文件,則繼續(xù)讀取項目中的配置文件 core-site.xml, hdfa-site.xml, mapred-site.xml yarn-site.xml
? ? ? //讀取完成之后,也可以自己去配置信息
? ? ? //屬性優(yōu)先級: 代碼中的設置 > *-site.xml > *-default.xml
? ? ? Configuration conf = new Configuration();
?
? ? ? //配置屬性
? ? ? conf.set("fs.defaultFS", "hdfs://192.168.68.128:9820");
? ? ? FileSystem fs = FileSystem.get(conf);
? ? ? System.out.println(fs.getClass().getName());
? }
8.4 文件的上傳與下載、文件夾的創(chuàng)建與刪除、重命名與存在
/**
* 我們對HDFS進行使嘴使舌,使用的用戶都是當前系統(tǒng)登錄的用戶。
* 因此,如果使用不正確的用戶來進行HDFS的寫操作的時候,會出現(xiàn)權(quán)限不足的情況。
* 解決方案:
* ? ? 1. 修改需要操作的路徑權(quán)限,權(quán)限改成777
* ? ? 2. 修改需要操作的路徑所屬用戶
* ? ? 3. 可以設置操作集群的用戶是誰
*/
public class HDFSApi {
?
? private FileSystem fs;
? /*
? ? ? 文件系統(tǒng)對象的獲取
? ? */
? @Before
? public void getFileSystemTest() throws IOException {
?
? ? ? System.out.println("before...............................................");
? ? ? //設置操作HADOOP的用戶是誰
? ? ? System.setProperty("HADOOP_USER_NAME", "root");
? ? ? //創(chuàng)建配置文件對象,加載配置文件上的配置信息
? ? ? //默認讀取core-default.xml, hdfs-default.xml, mapred-default.xml yarn-default.xml
? ? ? //如果項目中有配置文件,則繼續(xù)讀取項目中的配置文件 core-site.xml, hdfa-site.xml, mapred-site.xml yarn-site.xml
? ? ? //讀取完成之后,也可以自己去配置信息
? ? ? //屬性優(yōu)先級: 代碼中的設置 > *-site.xml > *-default.xml
? ? ? Configuration conf = new Configuration();
?
? ? ? //配置屬性
? ? ? conf.set("fs.defaultFS", "hdfs://192.168.68.128:9820");
? ? ? fs = FileSystem.get(conf);
? ? ? System.out.println(fs.getClass().getName());
? }
?
? @After
? public void closeFileSystem() throws IOException {
? ? ? System.out.println("after..........................................");
? ? ? fs.close();
? }
? /**
? ? * 文件上傳
? ? */
? @Test
? public void uploadTest() throws IOException {
? ? ? //需要操作的兩個路徑,本地源文件的路徑和HDFS的路徑
? ? ? Path src = new Path("F:/p50d/tools/redis-5.0.9.tar.gz");
? ? ? Path dst = new Path("/");
? ? ? //直接調(diào)用方法上傳文件即可
? ? ? fs.copyFromLocalFile(src, dst);
? }
?
? /**
? ? * 文件下載
? ? */
? @Test
? public void downloadTest() throws IOException {
? ? ? //需要設置兩個路徑,HDFS的文件路徑和本地存儲的文件路徑
? ? ? Path src = new Path("/redis-5.0.9.tar.gz");
? ? ? Path dst = new Path("d:/BigData/redis-5.0.9.tar.gz");
? ? ? //直接調(diào)用方法下載文件即可
? ? ? fs.copyToLocalFile(src, dst);
? }
?
? /**
? ? * 創(chuàng)建文件夾
? ? */
? @Test
? public void createDirTest() throws IOException {
? ? ? fs.mkdirs(new Path("/apiTest"));
? }
?
? /**
? ? * 刪除文件夾
? ? */
? @Test
? public void delDirTest() throws IOException {
? ? ? boolean delete = fs.delete(new Path("/output"), true);
? }
?
? /**
? ? * 重命名
? ? */
? @Test
? public void renameTest() throws IOException {
? ? ? fs.rename(new Path("/input"), new Path("/newInput"));
? }
?
? /**
? ? * 測試存在
? ? */
? @Test
? public void existsTest() throws IOException {
? ? ? boolean isExists = fs.exists(new Path("/input"));
? ? ? System.out.println(isExists ? "存在" : "不存在");
? }
}
8.5 HDFS-IOUtils工具類的使用
?
@Test
? public void ioUtilsTest() throws IOException {
? ? ? System.setProperty("HADOOP_USER_NAME", "root");
? ? ? Configuration configuration = new Configuration();
? ? ? configuration.set("fs.defaultFS", "hdfs://192.168.68.128:9820");
? ? ? FileSystem fileSystem = FileSystem.get(configuration);
?
? ? ? //IOUtils上傳
? ? ? FileInputStream input = new FileInputStream("D:\\Android\\android-sdk\\build-tools\\32.0.0\\NOTICE.txt");
? ? ? FSDataOutputStream output = fileSystem.create(new Path("/NOTICE.txt"));
? ? ? IOUtils.copyBytes(input, output, configuration);
? ? ? IOUtils.closeStream(input);
? ? ? IOUtils.closeStream(output);
?
? ? ? //IOUtils下載
? ? ? FSDataInputStream downInput = fileSystem.open(new Path("/NOTICE.txt"));
? ? ? FileOutputStream downOutput = new FileOutputStream("E:\\360Downloads\\Software\\NOTICE.txt");
? ? ? IOUtils.copyBytes(downInput, downOutput, configuration);
? ? ? IOUtils.closeStream(input);
? ? ? IOUtils.closeStream(output);
? ? ? fileSystem.close();
? }
8.6 文件狀態(tài)查看
?
/**
? ? * 文件狀態(tài)信息查看
? ? */
? @Test
? public void listFileStatusTest() throws IOException {
? ? ? //獲取每一個文件的狀態(tài)信息列表,迭代器對象
? ? ? RemoteIterator<LocatedFileStatus> iterator = fs.listLocatedStatus(new Path("/CentOS-Stream-8-x86_64-20220328-dvd1.iso"));
?
? ? ? while(iterator.hasNext())
? ? ? {
? ? ? ? ? //獲取當前遍歷到的文件
? ? ? ? ? LocatedFileStatus fileStatus = iterator.next();
? ? ? ? ? System.out.println("基本信息:" + fileStatus.getBlockLocations());
? ? ? ? ? //獲取所有塊的信息
? ? ? ? ? BlockLocation[] blockLocations = fileStatus.getBlockLocations();
? ? ? ? ? for(BlockLocation blockLocation : blockLocations)
? ? ? ? ? {
? ? ? ? ? ? ? System.out.println("當前塊的所有副本信息:" + Arrays.toString(blockLocation.getHosts()));
? ? ? ? ? ? ? System.out.println("當前塊大?。? + blockLocation.getLength());
? ? ? ? ? ? ? System.out.println("當前塊的副本的IP地址:" + Arrays.toString(blockLocation.getNames()));
? ? ? ? ? }
? ? ? ? ? System.out.println("系統(tǒng)的塊大?。? + fileStatus.getBlockSize());
? ? ? ? ? System.out.println("當前文件的總大小: " + fileStatus.getLen());
? ? ? }
? }
第九章 HDFS的高級操作
9.1 磁盤檢測
在HDFS上所有的文件都是以Block的形式存在的,如果在HDFS上存儲了海量的數(shù)據(jù)文件,就會對應有海量的Block的存在,而這些Block難免會因為存在損壞的情況。有什么方法可以去發(fā)現(xiàn)哪些塊出現(xiàn)了問題呢?可以使用fsck命令。
fsck的選項
選項 | 描述 |
---|---|
-move | 移動損壞的文件到/lost+found目錄下 |
-delete | 刪除損壞的文件 |
-files | 輸出正在被檢測的文件 |
-openforwrite | 輸出檢測的正在被寫入的文件 |
-includeSnapshots | 檢測的文件包括系統(tǒng)snapShot快照目錄下的 |
-list-corruptfileblocks | 輸出損壞的塊及所屬的文件 |
-blocks | 輸出block的詳細報告 |
-locations | 輸出block的位置信息 |
-racks | 輸出block的網(wǎng)絡拓撲結(jié)構(gòu) |
-storagepolicies | 輸出block的存儲策略 |
-blockId | 輸出指定blockId所屬塊的信息 |
常見用法:
-
檢查文件系統(tǒng)健康狀態(tài)
hdfs fsck /
這個命令會檢查整個文件系統(tǒng)的所有文件的健康狀態(tài),正常情況下,最后會看到"The filesystem under path '/' is HEALTHY"
-
-files
-files 選項可以列舉出來被檢查的文件都有誰,以及健康狀態(tài)信息,例如:
hdfs fsck /test -files /test <dir> /test/hadoop-3.3.1.tar.gz 605187279 bytes, replicated: replication=3, 5 block(s): OK
-
-blocks
-blocks 選項可以列舉出來被檢查的每一個文件的Block信息,例如:
hdfs fsck /test -files -blocks Connecting to namenode via http://hadoopmaster:9870/fsck?ugi=root&files=1&blocks=1&path=%2Ftest FSCK started by root (auth:SIMPLE) from /192.168.68.128 for path /test at Tue Jan 23 02:59:52 EST 2024 ? /test <dir> /test/hadoop-3.3.1.tar.gz 605187279 bytes, replicated: replication=3, 5 block(s): OK 0. BP-516840995-192.168.68.128-1698222078689:blk_1073742006_1182 len=134217728 Live_repl=3 1. BP-516840995-192.168.68.128-1698222078689:blk_1073742007_1183 len=134217728 Live_repl=3 2. BP-516840995-192.168.68.128-1698222078689:blk_1073742008_1184 len=134217728 Live_repl=3 3. BP-516840995-192.168.68.128-1698222078689:blk_1073742009_1185 len=134217728 Live_repl=3 4. BP-516840995-192.168.68.128-1698222078689:blk_1073742010_1186 len=68316367 Live_repl=3
-
-locations
-locations 選項可以列舉出來每一個 Block 的位置信息,例如
hdfs fsck /test -files -blocks -locations
-
-list-corruptfileblocks
-list-corruptfileblocks 選項可以列舉出來損壞的 block 的信息,例如
hdfs fsck /test -list-corruptfileblocks
9.2 動態(tài)上線
HDFS支持在廉價硬件上部署分布式文件系統(tǒng),來存儲海量的數(shù)據(jù),并且支持擴容。如果已有HDFS的集群容量已經(jīng)不能滿足存儲數(shù)據(jù)的需求,此時可以在原有集群的基礎上動態(tài)添加新的DataNode節(jié)點,來實現(xiàn)對集群的動態(tài)擴容。
-
集群規(guī)模規(guī)劃
擴容之前的集群如下:
IP地址 hostname 角色進程 192.168.68.128 hadoop master NameNode DataNode 192.168.68.129 hadoop node1 SecondaryNameNode, DataNode 192.168.68.130 hadoop node2 Datanode 擴容之后的集群如下:
IP地址 | hostname | 角色進程 |
---|---|---|
192.168.68.128 | hadoop master | NameNode DataNode |
192.168.68.129 | hadoop node1 | SecondaryNameNode, DataNode |
192.168.68.130 | hadoop node2 | Datanode |
192.168.68.131 | hadoop node3 | Datanode |
2. 動態(tài)上線過程
????????2.1 準備一臺新的虛擬機,準備職下工作:
1. 設置IP地址為192.168.68.131
2. 設置hostname為 hadoopnode3 ? ? ? ? ? ? #vi /etc/hostname
3. 設置防火墻關閉
4. 設置時間同步
5. 安裝JDK并設置JDK的環(huán)境變量(可以直接從已有節(jié)點拷貝)
6. 安裝hadoop并設置Hadoop的環(huán)境變量
????????2.2.在hadoopmaster節(jié)點進行修改操作,添加對hadoopnode3的host映射,并同步給每一個節(jié)點
#編輯 hadoopmaster節(jié)點上的 /etc/hosts文件,添加映射
192.168.68.131 hadoopnode3
?
#分發(fā)給其他的節(jié)點
scp /etc/hosts hadoopnode1:/etc
scp /etc/hosts hadoopnode2:/etc
scp /etc/hosts hadoopnode3:/etc
????????2.3.設置hadoopmaster到hadoopnode3節(jié)點的免密登錄
#將hadoopmaster節(jié)點生成的公鑰拷貝到hadoopnode3節(jié)點
ssh-copy-id hadoopnode3
????????2.4.修改hadoopmaster節(jié)點上的Hadoop配置文件中的workers文件,添加hadoopnode3
#編輯 workers 文件
vim /usr/local/hadoop-3.3.1/etc/hadoop/workers
#添加hadoopnode3
3. 將編輯之后的workers文件分發(fā)到hadoopnode1, hadoopnode2, hadoopnode3等節(jié)點
4. 將hadoopmaster節(jié)點的Hadoop的配置文件直接拷貝到hadoopmaster節(jié)點
cd /usr/Local/hadoop-3.3.1/etc
scp -r hadoop/ hadoopnode3:$PWD
5. 在hadoopnode3節(jié)點啟動DataNode
hdfs --daemon start datanode
6. 打開WebUI查看DataNodes,發(fā)現(xiàn)hadoopnode3節(jié)點已經(jīng)上線
9.3 數(shù)據(jù)平衡
雖然現(xiàn)在已經(jīng)上線了hadoopnode3節(jié)點,但是我們會發(fā)現(xiàn)這個新上線的節(jié)點上沒有數(shù)據(jù)存儲??梢栽赪ebUI的DataNodes界面查看到這個新的節(jié)點上的Blocks的數(shù)量為0,這樣就使用集群的負載不均衡。因此我們需要對HDFS進行節(jié)點之間的數(shù)據(jù)均衡。
通過balancer可以實現(xiàn)這個效果!在主節(jié)點hadoopmaster上執(zhí)行的balancer命令,實現(xiàn)均衡不同的DataNodes之間的負載。
使用balancer的時候需要設置threshold參數(shù),表示均衡的閾值。默認的閾值是10,表示10%的閾值。這個閾值表示balancer在進行數(shù)據(jù)均衡的時候,將保證每個DataNode上的磁盤使用量與集群的總體使用量的差值不超過這個閾值。
例如: 將閾值設置為10%
那么在做數(shù)據(jù)平衡的時候,如果集群中所有的DataNode節(jié)點總的使用占全部磁盤的40%,那么就確保每一個DataNode的磁盤使用率在30%到40%之間.
為了能夠更加方便看到效果,我們可以使用1來設置平衡:
hdfs balancer -threshold 1
9.4 節(jié)點動態(tài)下線
節(jié)點的動態(tài)下線比起動態(tài)上線來說,稍微麻煩一些. 因為動態(tài)下線的時候需要提前將數(shù)據(jù)移動到其他節(jié)點才可以.Hadoop雖然提供了動態(tài)下線的功能,但是有一個前提條件就是需要再在hdfs-site.xml文件中配置屬性: dfs.hosts.exclude.這個屬性的值需要指向一個文件,也就是需要下線的文件.也就是一個黑名單,在這個文件中的機器,會被NameNode移除集群.
但是這個hdfs-site.xml文件修改之后是需要重啟集群才生效的.因此在生產(chǎn)環(huán)境中,我們需要提前將這個屬性配置好,因為生產(chǎn)環(huán)境中的集群是不允許隨意的關閉、重啟的。在學習階段,就簡單多了,直接修改這個文件,然后重啟集群即可。
1.準備工作
1.修改hadoopmaster節(jié)點的hdfs-site.xml文件
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop-3.3.1/etc/hadoop/exclude</value>
</property>
2.創(chuàng)建這個exclude文件
# 這個文件是一個黑名單文件,為了操作起來方便、合理,我們將它放在Hadoop的配置文件目錄中
touch /usr/local/hadoop-3.3.1/etc/hadoop/exclude
3.重啟HDFS集群
stop-dfs.sh
start-dfs.sh
2.動態(tài)下線過程
1.將需要下線的節(jié)點,添加到exclude文件中
echo "hadoopnode3" > /usr/local/hadoop-3.3.1/etc/hadoop/exclude
注意事項:下線之后的節(jié)點數(shù)量,不能少于副本數(shù)量,例如副本因子為 3 , 在線的節(jié)點數(shù)量是小于等于3的,此時是無法下線的。如果需要下線,需要修改副本數(shù)這后再下線。
-
刷新節(jié)點(需要在NameNode節(jié)點操作)
hdfs dfsadmin -refreshNodes
-
在WebUI查看節(jié)點狀態(tài)民
-
退役完成,此時我們就可以放心的停止hadoopnode3節(jié)點上的服務了
hdfs --daemon stop datanode
-
其他節(jié)點的數(shù)據(jù)不果不均衡的話,使用balancer命令平衡一下即可
hdfs balancer
注:
如果這個節(jié)點下線之后,從此就不再使用,我們可以修改workers文件,從中刪除掉這個節(jié)點,再修改exclude文件,將其從中刪除即可。
9.5 磁盤平衡
HDFS提供了一個balance命令,可以實現(xiàn)DataNode之間的負載均衡。但是一個DataNode節(jié)點上可能存在多個磁盤,而banlancer是無法實現(xiàn)單個節(jié)點上的磁盤之間的均衡的。
在HDFS中,DataNode是真正負責數(shù)據(jù)均的存儲的,最終數(shù)據(jù)以Block的形式存儲在機器的磁盤上。在寫入新的Block的時候,DataNode將根據(jù)指定的策略,選擇將數(shù)據(jù)塊存儲在什么磁盤上:
-
循環(huán)策略 round-robin:這種策略會將新的 Block 均勻的分布在可用的磁盤上。默認使用這個策略。
-
可用空間策略 avaliable space: 這種策略會將新的 Block 會按照磁盤占用百分比,寫入具有更多可用空間的磁盤上。
如果在長期運行的集群中采用默認的循環(huán)策略,可能會出現(xiàn)由于大量的刪除操作,或者更換磁盤,而導致數(shù)據(jù)不均勻的填充在磁盤上。而使用可用空間策略的話,新增的數(shù)據(jù)塊都會往新的磁盤上寫,在此期間,其他的磁盤都處于空閑狀態(tài)。那么這個新的磁盤將會是整個HDFS的瓶頸。
在Hadoop3中新增了一個Disk Balance的工具,這個工具就是用來平衡BataNode中的數(shù)據(jù)在不同磁盤之間分布的。
-
磁盤平衡實現(xiàn)
前提1:在hadoopnode2節(jié)點上掛載一塊新的硬盤為例,在hadoopnode2節(jié)點掛載了一塊新的硬盤,并將其掛載在/mnt/disk目錄:
詳見:VMware虛擬機添加新硬盤以及對磁盤進行分區(qū)掛載 VMware虛擬機添加新硬盤以及對磁盤進行分區(qū)掛載_51CTO博客_vmware虛擬機添加硬盤的步驟
查看磁盤情況(新加載磁盤為/dev/sdb):
查看分區(qū)情況:lsblk
使用命令: fdisk /dev/sdb
n 新建分區(qū)
其他默認
分區(qū)掛載
-
修改增加磁盤節(jié)點的hdfs-site.xml
-
在 hadoopnode2節(jié)點上,現(xiàn)在有兩塊硬盤,并且兩塊磁盤的數(shù)據(jù)并不均衡。此時可以使用磁盤平衡工具,來平衡兩塊磁盤。磁盤平衡工具 diskbalancer 在使用的時候分為 3 步:
-
生成平衡計劃
# 平衡的時候,默認的閾值是10%,表示平衡之后的磁盤間的數(shù)據(jù)使用占比差值不會超過10% # 這個閾值可以使用 -thresholdPercentage 來設置 hdfs diskbalancer -plan hadoopnode2 # 可以從輸出的日志中,看到生成了磁盤平衡計劃,以 JSON 的形式保存在了 HDFS 的指定目錄下 INFO balancer.NameNodeConnector: getBlocks calls for hdfs://hadoopnode2:9820 will be rate-limited to 20 per second INFO planner.GreedyPlanner: Starting plan for Node : hadoopnode2:9867 INFO planner.GreedyPlanner: Disk Volume set e003df25-b249-4f06-91d9-ef0116ce552e - Type : DISK plan completed. INFO planner.GreedyPlanner: Compute Plan for Node : :9867 took 9 ms INFO command.Command: Writing plan to: INFO command.Command: /system/diskbalancer/2023-三月-02-16-42-00/hadoopnode2.plan.json Writing plan to: /system/diskbalancer/XXX/qianfeng03.plan.json
-
執(zhí)行平衡操作
# 在需要平衡磁盤的節(jié)點上執(zhí)行 hdfs diskbalancer -execute /system/diskbalancer/XXX/hadoopnode2.plan.json
-
查看平衡結(jié)果
# -execute開始執(zhí)行平衡操作的時候,HDFS 會啟動一個線程來完成這個操作。 # 我們可以使用 -query 來查看這個進度 hdfs diskbalancer -query hadoopnode2 ? # 出現(xiàn)如下的 Result,說明正在執(zhí)行中,還沒有結(jié)束 Plan File: /system/diskbalancer/XXX/hadoopnode2.plan.json Plan ID: 63d55420750b6657e608a67db7571ad171dfd5d8 Result: PLAN_UNDER_PROGRESS ? # 出現(xiàn)如下的 Result,說明磁盤平衡結(jié)束了 Plan File: /system/diskbalancer/XXX/hadoopnode2.plan.json Plan ID: 63d55420750b6657e608a67db7571ad171dfd5d8 Result: PLAN_DONE
磁盤平衡結(jié)束后,我們可以使用 df -h 來查看各個磁盤的使用情況:
會發(fā)現(xiàn)兩者之間被平衡到了 10% 的閾值以內(nèi),這個也是默認的閾值。磁盤平衡完成!
-
9.6 分布式拷貝(需要調(diào)試)
-
distcp的介紹
distcp其實是兩個單詞的縮寫拼接而成的:Distributed Copy. 即分布式拷貝。可以實現(xiàn)將一個分布式集群的數(shù)據(jù)拷貝到另外的一個分布式集群! distcp命令的拷貝過程本質(zhì)依然是MapReduce的任務,使用MapReduce實現(xiàn)文件分發(fā),錯誤處理和恢復,報告生成,以文件或目錄的列表作為MapTask的輸入,每個MapTask都會拷貝原文件列表中指定路徑下的文件。
應用場景:數(shù)據(jù)遷移、異地容災等。
使用distcp命令做分布式拷貝有如下優(yōu)點:
-
可以使用 bandwidth 參數(shù)為每一個MapTask限流,控制MapTask并發(fā)數(shù)量以控制整個個拷貝任務的帶寬,防止出現(xiàn)拷貝任務將帶寬占滿,影響其他的業(yè)務。
-
支持多種拷貝模式:
-
overwrite: 覆蓋寫,無條件覆蓋目標文件
-
update: 增量寫,如果目標文件的名稱和大小與源文件不同,則覆蓋;如果目標文件的名稱和大小與源文件相同,則路過
-
delete:刪除寫,刪除目標路徑存在而原路徑中不存在的文件。
-
-
distcp的使用
1.基礎使用
distcp最基礎的使用,就是直接在兩個集群之間進行文件的拷貝。
hadoop distcp hdfs://old:9820/{path} hdfs://new:9820/{path}
-
多數(shù)據(jù)源目錄
-
在拷貝的時候,也可以指定多個源路徑
hadoop distcp hdfs://hadoopmaster:9820/src1 hdfs://hadoopmaster:9820/src2 hdfs://hadoopmaster:9820/dst
如果需要拷貝的源路徑比較多,不方便直接寫到命令中的,也可以將其做成文件
# 1. 在 HDFS 上創(chuàng)建一個文件,用來存儲源路徑 # ? 例如在 hdfs://namenode01:9820/distcp/src 文件中書寫 hdfs://hadoopmaster:9820/src1 hdfs://hadoopmaster:9820/src2 hdfs://hadoopmaster:9820/src3
?
# 2. 執(zhí)行拷貝操作
hadoop distcp -f hdfs://old:9820/{path} hdfs://new:9820/{path}
3. 常用選項
選項 | 描述 | 備注 |
---|---|---|
-i | 忽略錯誤 | |
-log <logdir> | 生成日志到logdir目錄中 | 這里其實就是 MapTask 的輸出 |
-m <num_maps> | 最大同時拷貝的數(shù)量 | 可以確定 MapTask 的數(shù)量 |
-bandwidth | 為每個 MapTask 設置帶寬,單位是MB/s | |
-overwrite | 覆蓋目標路徑 | 會改變源目錄復制到目標目錄的路徑 |
-update | 跳過目標路徑下的同名、同大小的文件 | 會改變源目錄復制到目標目錄的路徑 |
-delete | 刪除目標路徑存在、源路徑不存在的文件 |
9.7 歸檔
-
archives命令介紹
HDFS在使用的時候有一個缺點:不適合小文件存儲.因為每一個小文件都會占用一個塊來存儲,而每一個塊也都會有固定的大小的元數(shù)據(jù)需要保存在NameNode的內(nèi)存中。如果HDFS中有大量的小文件的話,會帶來非常大的內(nèi)存開銷,此時就可以用archives來處理這個問題。
archives就是歸檔的意思,它可以將HDFS的多個文件歸檔成為一個擴展名為.har的文件,而且歸檔之后的文件還可以透明的訪問每一個文件,并且可以作為MapReduce任務的輸入。
-
創(chuàng)建歸檔 2.1 創(chuàng)建歸檔語法
歸檔的用法:
hadoop archive -archiveName name -p <parent> [-r <replication factor>] <src>* <dest>
2.2 創(chuàng)建歸檔操作
#1.準備工作: 在HDFS的 /little_files 目錄下,上傳了若干小文件 file1, file2, file3, file4, file5 #2.將file1、file2歸檔到一起,歸檔文件存放于 /archives hadoop archive -archiveName file12.har -p /little_files -r file1 file2 /archives/ #3.如果需要將某個文件夾下的所有文件都進行歸檔,可以直接這樣做 hadoop archive -arciveName files.har -p /little_files /archive
創(chuàng)建歸檔的時候,會生成一個MapReduce的任務,如果已經(jīng)設置了YARN調(diào)度,需要保證YARN是啟動的狀態(tài)。最終會在目標路徑下生成歸檔文件。
歸檔文件在HDFS的體現(xiàn)形式其實是一個文件夾,其中包含了元數(shù)據(jù)信息(_index, _masterindex)和數(shù)據(jù)文件(part_xxx)
注意:創(chuàng)建歸檔之后,原來的小文件不會被刪除!
2.3 查看歸檔
如果要查看某一個歸檔文件中都有什么文件,需要通過特定的URI進行查看。在HDFS中,歸檔文件默認使用的是 har://
hdfs dfs -ls -R har:///archives/files.har
2.4 解歸檔
歸檔文件在HDFS的映射是一個文件夾,可以透明的訪問其中的文件。因此如果我們需要將歸檔文件中的小文件解出來的話,直接進行拷貝即可,但是需要注意歸檔文件的URI是har://
# 1. 在HDFS上創(chuàng)建一個文件夾,用來接收解歸檔之后的文件 hdfs dfs -mkdir /unarchive # 2. 拷貝歸檔中的文件到指定目錄 hdfs dfs -cp har:///archives/files.har/file1 har:///archives/files.har/file2 /unarchive # 3. 也可以使用分布式拷貝命令實現(xiàn)拷貝 hadoop distcp har:///archives/files.har/* /unarchive
2.5 歸檔特性總結(jié)
-
-archiveName: 指定歸檔后文件的名稱,需要以.har結(jié)尾
-
-p: 指定需要歸檔的文件的父級路徑
-
-r: 指定歸檔文件的副本因子,默認是 3
-
<src>: 指定所有需要歸檔的文件
-
<dest>: 指定歸檔后的文件存放的位置
-
歸檔文件本身不支持壓縮
-
創(chuàng)建歸檔的時候使用到的小文件和目錄都不會自動刪除,如果需要刪除,需要手動刪除
-
歸檔文件是不可變的,如果想要在歸檔文件中新增小文件或者刪除小文件,需要重新創(chuàng)建歸檔文件
-
歸檔文件只是用來減少小文件帶來的NameNode過高的內(nèi)存占用,對于MapReduce來說沒有優(yōu)化,并不會減少分片的數(shù)量,也就無法減少MapTask的數(shù)量
-
附1:分布式文件系統(tǒng)(HDFS和FastDFS)
(分布式文件系統(tǒng)(HDFS和FastDFS)-騰訊云開發(fā)者社區(qū)-騰訊云)
HDFS和FastDFS對比
測試項 | HDFS | FastDFS |
---|---|---|
25個小文件上傳 | 13599ms | 1949ms |
318個圖片上傳 | 63460ms | 9585ms |
3個700m視頻上傳 | 62092ms | 58137ms |
3個2g視頻上傳 | 171743ms | 131861ms |
25個小文件下載 | 13008ms | 1218ms |
318個圖片下載 | 24942ms | 7051ms |
3個700m視頻下載 | 69266ms | 36144ms |
3個2g視頻下載 | 192315ms | 138215ms |
25個小文件刪除 | 10517ms | 62ms |
318個圖片刪除 | 12828ms | 811ms |
3個700m視頻刪除 | 10286ms | 150ms |
3個2g視頻刪除 | 10594ms | 255ms |
結(jié)論
-
FastDFS客戶端底層連接服務端使用的是Socket,本身速度就要快很多。
-
HDFS在做刪除測試時,明顯較慢的地方是在創(chuàng)建到服務端的連接上,實際刪除文件的速度很快。由于每次測試都需要先創(chuàng)建到服務端的連接,HDFS在這塊消耗較大,在實際場景下,差距應該沒有這么大。
-
兩者的適用場景確有不同,F(xiàn)astDFS更適合小文件的高效存取,而HDFS更適合超大文件上傳后使用Mapreduce去做大數(shù)據(jù)處理
簡介
概要
FastDFS 是一個開源的高性能分布式文件系統(tǒng)(DFS)。 它的主要功能包括:文件存儲,文件同步和文件訪問,以及高容量和負載平衡。主要解決了海量數(shù)據(jù)存儲問題,特別適合以中小文件(建議范圍:4KB < file_size <500MB)為載體的在線服務。
FastDFS 系統(tǒng)有三個角色:跟蹤服務器(Tracker Server)、存儲服務器(Storage Server)和客戶端(Client)。
Tracker Server:跟蹤服務器,主要做調(diào)度工作,起到均衡的作用;負責管理所有的 storage server和 group,每個 storage 在啟動后會連接 Tracker,告知自己所屬 group 等信息,并保持周期性心跳。
Storage Server:存儲服務器,主要提供容量和備份服務;以 group 為單位,每個 group 內(nèi)可以有多臺 storage server,數(shù)據(jù)互為備份。
Client:客戶端,上傳下載數(shù)據(jù)的服務器,也就是我們自己的項目所部署在的服務器。
FastDFS開源地址:https://github.com/happyfish100
封裝的FastDFS Java API:https://github.com/bojiangzhou/lyyzoo-fastdfs-java
文件上傳
文件同步
寫文件時,客戶端將文件寫至group內(nèi)一個storage server即認為寫文件成功,storage server寫完文件后,會由后臺線程將文件同步至同group內(nèi)其他的storage server。
每個storage寫文件后,同時會寫一份binlog,binlog里不包含文件數(shù)據(jù),只包含文件名等元信息,這份binlog用于后臺同步,storage會記錄向group內(nèi)其他storage同步的進度,以便重啟后能接上次的進度繼續(xù)同步;進度以時間戳的方式進行記錄,所以最好能保證集群內(nèi)所有server的時鐘保持同步。
storage的同步進度會作為元數(shù)據(jù)的一部分匯報到tracker上,tracke在選擇讀storage的時候會以同步進度作為參考。
文件下載
img
安裝FastDFS環(huán)境
操作環(huán)境:CentOS7 X64
我把所有的安裝包下載到/softpackages/
下,解壓到當前目錄。
1. 下載安裝 libfastcommon
libfastcommon是從 FastDFS 和 FastDHT 中提取出來的公共 C 函數(shù)庫,基礎環(huán)境,安裝即可 。
① 下載libfastcommon
cd /softpackages wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
復制
② 解壓
tar -zxvf V1.0.7.tar.gz cd libfastcommon-1.0.7
復制
③ 編譯、安裝
./make.sh ./make.sh install
復制
④ libfastcommon.so 安裝到了/usr/lib64/libfastcommon.so,但是FastDFS主程序設置的lib目錄是/usr/local/lib,所以需要創(chuàng)建軟鏈接。
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
復制
2. 下載安裝FastDFS
① 下載FastDFS
cd /softpackages wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
復制
② 解壓
tar -zxvf V5.05.tar.gz cd fastdfs-5.05
復制
③ 編譯、安裝
./make.sh ./make.sh install
復制
④ 默認安裝方式安裝后的相應文件與目錄 A、服務腳本:
/etc/init.d/fdfs_storaged /etc/init.d/fdfs_tracker
B、配置文件(這三個是作者給的樣例配置文件) :
/etc/fdfs/client.conf.sample /etc/fdfs/storage.conf.sample /etc/fdfs/tracker.conf.sample
C、命令工具在 /usr/bin/ 目錄下:
fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_crc32 fdfs_delete_file fdfs_download_file fdfs_file_info fdfs_monitor fdfs_storaged fdfs_test fdfs_test1 fdfs_trackerd fdfs_upload_appender fdfs_upload_file stop.sh restart.sh
⑤ FastDFS 服務腳本設置的 bin 目錄是 /usr/local/bin
, 但實際命令安裝在 /usr/bin/
下。
建立 /usr/bin
到 /usr/local/bin
的軟鏈接,我是用這種方式?! ?/p>
ln -s /usr/bin/fdfs_trackerd ? /usr/local/bin ln -s /usr/bin/fdfs_storaged ? /usr/local/bin ln -s /usr/bin/stop.sh ? ? ? ? /usr/local/bin ln -s /usr/bin/restart.sh ? ? ?/usr/local/bin
復制
3. 配置FastDFS跟蹤器(Tracker)
配置文件詳細說明參考:FastDFS 配置文件詳解
① 進入 /etc/fdfs,復制 FastDFS 跟蹤器樣例配置文件 tracker.conf.sample,并重命名為 tracker.conf。
cd /etc/fdfs cp tracker.conf.sample tracker.conf vi tracker.conf
復制
② 編輯tracker.conf ,標紅的需要修改下,其它的默認即可。
# 配置文件是否不生效,false 為生效 disabled=false # 提供服務的端口 port=22122 # Tracker 數(shù)據(jù)和日志目錄地址(根目錄必須存在,子目錄會自動創(chuàng)建) base_path=/data/fastdfs/tracker # HTTP 服務端口 http.server_port=8080
復制
③ 創(chuàng)建tracker基礎數(shù)據(jù)目錄,即base_path對應的目錄
mkdir -p /data/fastdfs/tracker
復制
④ 防火墻中打開跟蹤端口(默認的22122)
vi /etc/sysconfig/iptables
復制
添加如下端口行:
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22122 -j ACCEPT
重啟防火墻:
service iptables restart
復制
⑤ 啟動Tracker
初次成功啟動,會在 /data/fdfsdfs/tracker/ (配置的base_path)下創(chuàng)建 data、logs 兩個目錄。
# 可以用這種方式啟動 /etc/init.d/fdfs_trackerd start ? # 也可以用這種方式啟動,前提是上面創(chuàng)建了軟鏈接,后面都用這種方式 service fdfs_trackerd start
復制
查看 FastDFS Tracker 是否已成功啟動 ,22122端口正在被監(jiān)聽,則算是Tracker服務安裝成功。
netstat -unltp|grep fdfs
復制
img
關閉Tracker命令:
service fdfs_trackerd stop
復制
⑥ 設置Tracker開機啟動
chkconfig fdfs_trackerd on
復制
或者
vi /etc/rc.d/rc.local
復制
加入配置
/etc/init.d/fdfs_trackerd start
⑦ tracker server 目錄及文件結(jié)構(gòu)
Tracker服務啟動成功后,會在base_path下創(chuàng)建data、logs兩個目錄。目錄結(jié)構(gòu)如下:
${base_path} ?|__data ?| ? |__storage_groups.dat:存儲分組信息 ?| ? |__storage_servers.dat:存儲服務器列表 ?|__logs ?| ? |__trackerd.log: tracker server 日志文件
復制
4. 配置 FastDFS 存儲 (Storage)
① 進入 /etc/fdfs 目錄,復制 FastDFS 存儲器樣例配置文件 storage.conf.sample,并重命名為 storage.conf
cd /etc/fdfs cp storage.conf.sample storage.conf vi storage.conf
復制
② 編輯storage.conf
標紅的需要修改,其它的默認即可。
# 配置文件是否不生效,false 為生效 disabled=false ? # 指定此 storage server 所在 組(卷) group_name=group1 ? # storage server 服務端口 port=23000 ? # 心跳間隔時間,單位為秒 (這里是指主動向 tracker server 發(fā)送心跳) heart_beat_interval=30 ? # Storage 數(shù)據(jù)和日志目錄地址(根目錄必須存在,子目錄會自動生成) base_path=/data/fastdfs/storage ? # 存放文件時 storage server 支持多個路徑。這里配置存放文件的基路徑數(shù)目,通常只配一個目錄。 store_path_count=1 ? ? # 逐一配置 store_path_count 個路徑,索引號基于 0。 # 如果不配置 store_path0,那它就和 base_path 對應的路徑一樣。 store_path0=/data/fastdfs/file ? # FastDFS 存儲文件時,采用了兩級目錄。這里配置存放文件的目錄個數(shù)。 # 如果本參數(shù)只為 N(如: 256),那么 storage server 在初次運行時,會在 store_path 下自動創(chuàng)建 N * N 個存放文件的子目錄。 subdir_count_per_path=256 ? # tracker_server 的列表 ,會主動連接 tracker_server # 有多個 tracker server 時,每個 tracker server 寫一行 tracker_server=file.psvmc.cn:22122 # 允許系統(tǒng)同步的時間段 (默認是全天) 。一般用于避免高峰同步產(chǎn)生一些問題而設定。 sync_start_time=00:00 sync_end_time=23:59 # 訪問端口 http.server_port=8888
復制
tracker_server不能寫127.0.0.1或localhost
③ 創(chuàng)建Storage基礎數(shù)據(jù)目錄,對應base_path目錄
mkdir -p /data/fastdfs/storage # 這是配置的store_path0路徑 mkdir -p /data/fastdfs/file
復制
④ 防火墻中打開存儲器端口(默認的 23000)
vi /etc/sysconfig/iptables
復制
添加如下
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
復制
重啟防火墻:
service iptables restart
復制
img
⑤ 啟動 Storage
啟動Storage前確保Tracker是啟動的。初次啟動成功,會在 /data/fastdfs/storage 目錄下創(chuàng)建 data、 logs 兩個目錄。
# 可以用這種方式啟動 /etc/init.d/fdfs_storaged start ? # 也可以用這種方式,后面都用這種 service fdfs_storaged start
復制
查看 Storage 是否成功啟動,23000 端口正在被監(jiān)聽,就算 Storage 啟動成功。
netstat -unltp|grep fdfs
復制
img
關閉Storage命令:
service fdfs_storaged stop
復制
查看Storage和Tracker是否在通信:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
復制
微信截圖_20201013170934
⑥ 設置 Storage 開機啟動
chkconfig fdfs_storaged on
復制
或者:
vi /etc/rc.d/rc.local
復制
加入配置:
/etc/init.d/fdfs_storaged start
復制
⑦ Storage 目錄
同 Tracker,Storage 啟動成功后,在base_path 下創(chuàng)建了data、logs目錄,記錄著 Storage Server 的信息。
在 store_path0 目錄下,創(chuàng)建了N*N個子目錄:
img
5. 文件上傳測試
① 修改 Tracker 服務器中的客戶端配置文件
cd /etc/fdfs cp client.conf.sample client.conf vi client.conf
復制
修改如下配置即可,其它默認。
# Client 的數(shù)據(jù)和日志目錄 base_path=/data/fastdfs/client ? # Tracker端口 tracker_server=file.psvmc.cn:22122
復制
② 上傳測試
在linux內(nèi)部執(zhí)行如下命令上傳 namei.jpeg 圖片
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf namei.jpeg
復制
上傳成功后返回文件ID號:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
img
返回的文件ID由group、存儲目錄、兩級子目錄、fileid、文件后綴名(由客戶端指定,主要用于區(qū)分文件類型)拼接而成。
img
安裝Nginx
上面將文件上傳成功了,但我們無法下載。因此安裝Nginx作為服務器以支持Http方式訪問文件。同時,后面安裝FastDFS的Nginx模塊也需要Nginx環(huán)境。
Nginx只需要安裝到StorageServer所在的服務器即可,用于訪問文件。我這里由于是單機,TrackerServer和StorageServer在一臺服務器上。
1. 安裝Nginx所需環(huán)境
① gcc 安裝
yum install gcc-c++
復制
② PCRE pcre-devel 安裝
yum install -y pcre pcre-devel
復制
③ zlib 安裝
yum install -y zlib zlib-devel
復制
④ OpenSSL 安裝
yum install -y openssl openssl-devel
復制
2. 安裝Nginx
① 下載nginx
cd /softpackages wget -c https://nginx.org/download/nginx-1.12.1.tar.gz
復制
② 解壓
tar -zxvf nginx-1.12.1.tar.gz cd nginx-1.12.1
復制
③ 使用默認配置
./configure
復制
④ 編譯、安裝
make && make install
復制
配置文件路徑
vi /usr/local/nginx/conf/nginx.conf
⑤ 啟動nginx
cd /usr/local/nginx/sbin/ ./nginx
復制
其它命令
./nginx -s stop ./nginx -s quit ./nginx -s reload
復制
⑥ 設置開機啟動
vi /etc/rc.local
復制
添加一行
/usr/local/nginx/sbin/nginx
復制
設置執(zhí)行權(quán)限
chmod 755 /etc/rc.local
復制
⑦ 查看nginx的版本及模塊
/usr/local/nginx/sbin/nginx -V
復制
⑧ 防火墻中打開Nginx端口(默認的 80)
添加后就能在本機使用80端口訪問了。
vi /etc/sysconfig/iptables
復制
添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
復制
重啟防火墻
service iptables restart
復制
3. 訪問文件
簡單的測試Nginx是否安裝成功,下述操作可以跳過,直接配置Nginx的FastDFS模塊
① 修改nginx.conf
vi /usr/local/nginx/conf/nginx.conf
復制
添加如下行,將 /group1/M00 映射到 /data/fastdfs/file/data
location /group1/M00 { ? ?alias /data/fastdfs/file/data; }
復制
重啟nginx
/usr/local/nginx/sbin/nginx -s reload
復制
② 在瀏覽器訪問之前上傳的圖片、成功。
http://file.psvmc.cn/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
4. 安裝配置Nginx模塊
① fastdfs-nginx-module 模塊說明
FastDFS 通過 Tracker 服務器,將文件放在 Storage 服務器存儲, 但是同組存儲服務器之間需要進行文件復制, 有同步延遲的問題。
假設 Tracker 服務器將文件上傳到了 192.168.51.128,上傳成功后文件 ID已經(jīng)返回給客戶端。
此時 FastDFS 存儲集群機制會將這個文件同步到同組存儲 192.168.51.129,在文件還沒有復制完成的情況下,客戶端如果用這個文件 ID 在 192.168.51.129 上取文件,就會出現(xiàn)文件無法訪問的錯誤。
而 fastdfs-nginx-module 可以重定向文件鏈接到源服務器取文件,避免客戶端由于復制延遲導致的文件無法訪問錯誤。
② 下載 fastdfs-nginx-module、解壓
cd /softpackages # 這里為啥這么長一串呢,因為最新版的master與當前nginx有些版本問題。 wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip ? # 解壓 unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip ? # 重命名 mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 ?fastdfs-nginx-module-master
復制
③ 配置Nginx
在nginx中添加模塊
# 先停掉nginx服務 /usr/local/nginx/sbin/nginx -s stop ? # 進入解壓包目錄 cd /softpackages/nginx-1.12.1/ ? # 添加模塊 ./configure --add-module=../fastdfs-nginx-module-master/src ? # 重新編譯、安裝 make && make install
復制
④ 查看Nginx的模塊
/usr/local/nginx/sbin/nginx -V
復制
有下面這個就說明添加模塊成功
img
⑤ 復制 fastdfs-nginx-module 源碼中的配置文件到/etc/fdfs 目錄, 并修改
cd /softpackages/fastdfs-nginx-module-master/src ? cp mod_fastdfs.conf /etc/fdfs/
復制
修改如下配置,其它默認
# 連接超時時間 connect_timeout=10 ? # Tracker Server tracker_server=file.psvmc.cn:22122 # StorageServer 默認端口 storage_server_port=23000 ? # 如果文件ID的uri中包含/group**,則要設置為true url_have_group_name = true ? # Storage 配置的store_path0路徑,必須和storage.conf中的一致 store_path0=/data/fastdfs/file
復制
⑥ 復制 FastDFS 的部分配置文件到/etc/fdfs 目錄
cd /softpackages/fastdfs-5.05/conf/ ? cp anti-steal.jpg http.conf mime.types /etc/fdfs/
復制
⑦ 配置nginx,修改nginx.conf
vi /usr/local/nginx/conf/nginx.conf
復制
修改配置,其它的默認
在80端口下添加fastdfs-nginx模塊
location ~/group([0-9])/M00 { ? ?ngx_fastdfs_module; }
復制
img
注意:
listen 80 端口值是要與 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相對應。如果改成其它端口,則需要統(tǒng)一,同時在防火墻中打開該端口。
location 的配置,如果有多個group則配置location ~/group([0-9])/M00 ,沒有則不用配group。
⑧ 在/data/fastdfs/file 文件存儲目錄下創(chuàng)建軟連接,將其鏈接到實際存放數(shù)據(jù)的目錄,這一步可以省略。
ln -s /data/fastdfs/file/data/ /data/fastdfs/file/data/M00
復制
⑨ 啟動nginx
/usr/local/nginx/sbin/nginx
復制
打印處如下就算配置成功
img
⑩ 在地址欄訪問。
能下載文件就算安裝成功。注意和第三點中直接使用nginx路由訪問不同的是,這里配置 fastdfs-nginx-module 模塊,可以重定向文件鏈接到源服務器取文件。
http://file.psvmc.cn/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
最終部署結(jié)構(gòu)圖:可以按照下面的結(jié)構(gòu)搭建環(huán)境。
img
Java客戶端
前面文件系統(tǒng)平臺搭建好了,現(xiàn)在就要寫客戶端代碼在系統(tǒng)中實現(xiàn)上傳下載,這里只是簡單的測試代碼。
1. 搭建Java開發(fā)環(huán)境
① 項目中使用maven進行依賴管理,可以在pom.xml中引入如下依賴即可:
<dependency> ? <groupId>net.oschina.zcx7878</groupId> ? <artifactId>fastdfs-client-java</artifactId> ? <version>1.27.0.0</version> </dependency>
復制
其它的方式,參考官方文檔:https://github.com/happyfish100/fastdfs-client-java
② 引入配置文件
可直接復制包下的 fastdfs-client.properties.sample 或者 fdfs_client.conf.sample,到你的項目中,去掉.sample。
img
我這里直接復制 fastdfs-client.properties.sample 中的配置到項目配置文件 config.properties 中,修改tracker_servers。只需要加載這個配置文件即可
img
2. 客戶端API
個人封裝的FastDFS Java API以同步到github:https://github.com/bojiangzhou/lyyzoo-fastdfs-java.git
權(quán)限控制
前面使用nginx支持http方式訪問文件,但所有人都能直接訪問這個文件服務器了,所以做一下權(quán)限控制。
FastDFS的權(quán)限控制是在服務端開啟token驗證,客戶端根據(jù)文件名、當前unix時間戳、秘鑰獲取token,在地址中帶上token參數(shù)即可通過http方式訪問文件。
① 服務端開啟token驗證
修改http.conf
vi /etc/fdfs/http.conf
復制
按如下配置
# 設置為true表示開啟token驗證 http.anti_steal.check_token=true # 設置token失效的時間單位為秒(s) http.anti_steal.token_ttl=1800 # 密鑰,跟客戶端配置文件的fastdfs.http_secret_key保持一致 http.anti_steal.secret_key=FASTDFS1234567890 ? # 如果token檢查失敗,返回的頁面 http.anti_steal.token_check_fail=/data/fastdfs/page/403.html
復制
記得重啟服務。
② 配置客戶端
客戶端只需要設置如下兩個參數(shù)即可,兩邊的密鑰保持一致。
# token 防盜鏈功能 fastdfs.http_anti_steal_token=true # 密鑰 fastdfs.http_secret_key=FASTDFS1234567890
復制
③ 客戶端生成token
訪問文件需要帶上生成的token以及unix時間戳,所以返回的token是token和時間戳的拼接。
之后,將token拼接在地址后即可訪問:file.psvmc.cn/group1/M00/00/00/wKgzgFnkaXqAIfXyAAEoRmXZPp878.jpeg?token=078d370098b03e9020b82c829c205e1f&ts=1508141521
/** * 獲取訪問服務器的token,拼接到地址后面 * * @param filepath 文件路徑 group1/M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg * @param httpSecretKey 密鑰 * @return 返回token,如: token=078d370098b03e9020b82c829c205e1f&ts=1508141521 */ public static String getToken(String filepath, String httpSecretKey){ ? ?// unix seconds ? ?int ts = (int) Instant.now().getEpochSecond(); ? ?// token ? ?String token = "null"; ? ?try { ? ? ? ?token = ProtoCommon.getToken(getFilename(filepath), ts, httpSecretKey); ? } catch (UnsupportedEncodingException e) { ? ? ? ?e.printStackTrace(); ? } catch (NoSuchAlgorithmException e) { ? ? ? ?e.printStackTrace(); ? } catch (MyException e) { ? ? ? ?e.printStackTrace(); ? } ? ? ?StringBuilder sb = new StringBuilder(); ? ?sb.append("token=").append(token); ? ?sb.append("&ts=").append(ts); ? ? ?return sb.toString(); }
復制
④ 注意事項
如果生成的token驗證無法通過,請進行如下兩項檢查: A. 確認調(diào)用token生成函數(shù)(ProtoCommon.getToken),傳遞的文件ID中沒有包含group name。傳遞的文件ID格式形如:M00/00/00/wKgzgFnkTPyAIAUGAAEoRmXZPp876.jpeg
B. 確認服務器時間基本是一致的,注意服務器時間不能相差太多,不要相差到分鐘級別。
⑤ 對比下發(fā)現(xiàn),如果系統(tǒng)文件隱私性較高,可以直接通過fastdfs-client提供的API去訪問即可,不用再配置Nginx走http訪問。配置Nginx的主要目的是為了快速訪問服務器的文件(如圖片),如果還要加權(quán)限驗證,則需要客戶端生成token,其實已經(jīng)沒有多大意義。
附2: 分布式文件系統(tǒng)(Distributed File System,DFS)(分布式文件系統(tǒng)(Distributed File System,DFS)_什么是分布式文件系統(tǒng)-CSDN博客)
分布式文件系統(tǒng)(Distributed File System,DFS)
一、什么是分布式文件系統(tǒng)
1、文件系統(tǒng)的定義: 硬盤是計算機最主要的存儲設備,數(shù)據(jù)按扇區(qū)存放在硬盤上。硬盤屬于硬件,用戶無法直接對其進行操作,由操作系統(tǒng)幫我們管理。文件系統(tǒng)是操作系統(tǒng)用于明確存儲設備或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu);即在存儲設備上組織文件的方法。操作系統(tǒng)中負責管理和存儲文件信息的軟件機構(gòu)稱為文件管理系統(tǒng),簡稱文件系統(tǒng)。文件系統(tǒng)由三部分組成:文件系統(tǒng)的接口,對對象操縱和管理的軟件集合,對象及屬性。從系統(tǒng)角度來看,文件系統(tǒng)是對文件存儲設備的空間進行組織和分配,負責文件存儲并對存入的文件進行保護和檢索的系統(tǒng)。通俗地說,文件系統(tǒng)就是一個軟件,它負責為用戶建立文件,存入、讀出、修改、轉(zhuǎn)儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。
2、一般文件系統(tǒng): 在我們?nèi)粘I罟ぷ髦?,自己使用的電腦上都會安裝操作系統(tǒng),比如Windows。我們經(jīng)常進行的操作如新建文件夾、新建文件、刪除文件等等,都是文件系統(tǒng)在幫助我們工作,Windows文件系統(tǒng)有FATFS、VFATFS、NTFS等。除了Windows外,Linux也有ext、vfs等等文件系統(tǒng),像這種一臺計算機,單個存儲節(jié)點、一個操作系統(tǒng),一個具體的文件系統(tǒng)的場景稱之為一般文件系統(tǒng)。
3、分布式文件系統(tǒng): 分布式文件系統(tǒng)中的數(shù)據(jù)存儲在多臺機器上,這些專門用來存儲數(shù)據(jù)的機器稱之為存儲節(jié)點,由多個節(jié)點構(gòu)成分布式集群,節(jié)點上的小的分布式文件系統(tǒng)組合成總的分布式文件系統(tǒng),由主服務器對總的文件系統(tǒng)進行管理。用戶任意訪問某一臺主機,都能獲取到自己想要的目標文件。
4、一般文件系統(tǒng)與分布式文件系統(tǒng)的比較: 一般文件系統(tǒng) 分布式文件系統(tǒng) 存儲方式 集中存儲在一臺機器 分散地存儲在多臺機器 訪問方式 系統(tǒng)總線IO 網(wǎng)絡IO 特點 系統(tǒng)級別的文件系統(tǒng),數(shù)據(jù)集中存放在一臺機器,對數(shù)據(jù)的訪問,修改和刪除比較方便快速,存儲服務器成為系統(tǒng)性能的瓶頸,伸縮性較差,擴展有限 應用級別的文件系統(tǒng),分布式網(wǎng)絡存儲系統(tǒng)采用可擴展的系統(tǒng)結(jié)構(gòu),利用多臺存儲服務器分擔存儲負荷,利用位置服務器定位存儲信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴展 適用場景 小數(shù)據(jù)量的存儲 海量數(shù)據(jù)的存儲 設計目標 高性能、可用性 高性能、可伸縮性、可靠性以及可用性
二、常見的分布式文件系統(tǒng)
常見的分布式文件系統(tǒng)有,GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。各自適用于不同的領域。它們都不是系統(tǒng)級的分布式文件系統(tǒng),而是應用級的分布式文件存儲服務。
1、GFS(Google File System) Google GFS文件系統(tǒng),一個面向大規(guī)模數(shù)據(jù)密集型應用的、可伸縮的分布式文件系統(tǒng)。GFS雖然運行在廉價的普遍硬件設備上,但是它依然了提供災難冗余的能力,為大量客戶機提供了高性能的服務。GFS是一個為Google內(nèi)部設計的大數(shù)據(jù)分布式存儲框架,由2003年Google發(fā)表的論文提出,遺憾的是Google并沒有將其開源,但是基于GFS的設計理念,誕生了很多優(yōu)秀的開源類GFS文件系統(tǒng)。
2、HDFS(Hadoop Distributed File System) HDFS是Hadoop(Apache開源項目)的專用文件系統(tǒng), Hadoop是一個大數(shù)據(jù)計算框架,它允許使用簡單的編程模型跨計算機集群分布式處理大型數(shù)據(jù)集,是Google發(fā)表的MapReduce算法的實現(xiàn),HDFS是GFS的開源實現(xiàn)。
3、Ceph Ceph是加州大學Santa Cruz分校的Sage Weil(DreamHost的聯(lián)合創(chuàng)始人)專為博士論文設計的新一代自由軟件分布式文件系統(tǒng),并使用Ceph完成了他的論文。Ceph的主要目標是設計成基于POSIX的沒有單點故障的分布式文件系統(tǒng),使數(shù)據(jù)能容錯和無縫的復制。與其它分布式文件系統(tǒng)相比,ceph 性能最高,因為其使用C++編寫而成。 由于 ceph 使用 btrfs 文件系統(tǒng), 而btrfs 文件系統(tǒng)需要 Linux 2.6.34 以上的內(nèi)核才支持。自2007年畢業(yè)之后,Sage開始全職投入到Ceph開 發(fā)之中,使其能適用于生產(chǎn)環(huán)境,經(jīng)過十幾年的發(fā)展,Ceph已經(jīng)趨向于成熟。
4、Lustre Lustre是一個開源、分布式并行文件系統(tǒng)軟件平臺,具有高可擴展、高性能、高可用等特點。Lustre的構(gòu)造目標是為大規(guī)模計算系統(tǒng)提供一個全局一致的POSIX兼容的命名空間,這些計算系統(tǒng)包括了世界上包含最強大的高性能計算系統(tǒng)。它支持數(shù)百PB數(shù)據(jù)存儲空間,支持數(shù)百GB/s乃至數(shù)TB/s并發(fā)聚合帶寬。
5、GridFS GridFS 是MongDB的分布式存儲系統(tǒng),用于存儲和恢復那些超過16M(BSON文件限制)的文件(如:圖片、音頻、視頻等)。GridFS 也是文件存儲的一種方式,但是它是存儲在MonoDB的集合中。GridFS 可以更好的存儲大于16M的文件。GridFS 會將大文件對象分割成多個小的chunk(文件片段),一般為256k/個,每個chunk將作為MongoDB的一個文檔(document)被存儲在chunks集合中。GridFS 用兩個集合來存儲一個文件:fs.files與fs.chunks。每個文件的實際內(nèi)容被存在chunks(二進制數(shù)據(jù))中,和文件有關的meta數(shù)據(jù)(filename,content_type,還有用戶自定義的屬性)將會被存在files集合中。
6、MogileFS MogileFS是一個開源的分布式文件存儲系統(tǒng),是由LiveJournal旗下的Danga Interactive公司開發(fā)。目前使用MogileFS的公司非常多,如日本排名先前的幾個互聯(lián)公司以及國內(nèi)的Yupoo(又拍)、digg、豆瓣、大眾點評、搜狗等,分別為所在的組織或公司管理著海量的圖片。以大眾點評為例,用戶全部圖片均有MogileFS存儲,數(shù)據(jù)量已經(jīng)達到500TB以上
7、FastDFS(Fast Distributed File System) FastDFS是一個開源的分布式文件系統(tǒng),由純C編寫,性能很高。她對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件為載體的在線服務,如相冊網(wǎng)站、視頻網(wǎng)站等等。
8、TFS(Taobao File System) TFS是一個高可擴展、高可用、高性能、面向互聯(lián)網(wǎng)服務的分布式文件系統(tǒng),主要針對海量的非結(jié)構(gòu)化數(shù)據(jù),它構(gòu)筑在普通的Linux機器集群上,可為外部提供高可靠和高并發(fā)的存儲訪問。TFS為淘寶提供海量小文件存儲,通常文件大小不超過1M,滿足了淘寶對小文件存儲的需求,被廣泛地應用在淘寶各項應用中。它采用了HA架構(gòu)和平滑擴容,保證了整個文件系統(tǒng)的可用性和擴展性。同時扁平化的數(shù)據(jù)組織結(jié)構(gòu),可將文件名映射到文件的物理地址,簡化了文件的訪問流程,一定程度上為TFS提供了良好的讀寫性能。
三、下一代分布式文件系統(tǒng) 1、預想 隨著5G、AI、云技術(shù)的快速普及和發(fā)展,數(shù)據(jù)的產(chǎn)生呈幾何級數(shù)增長,必然會帶來更大的挑戰(zhàn),勢必會催生出下一代分布式文件系統(tǒng)。會在解決最基本的數(shù)據(jù)存儲問題后,我認為分布式文件系統(tǒng)需要解決的問題是如何針對當前系統(tǒng)架構(gòu)缺點的改進,主要圍繞在數(shù)據(jù)的多元化存儲、更靈活的適用場景、系統(tǒng)的性價比提升、更強的適用性和更方便的運維等方面。其實,對大數(shù)據(jù)的操作有90%是對元數(shù)據(jù)進行操作,HDFS的元數(shù)據(jù)存儲在內(nèi)存,雖然性能高,但是內(nèi)存的容量有限,系統(tǒng)支持的文件數(shù)量較少。Ceph將元數(shù)據(jù)保存在RADOS,IO操作多,路徑長,性能不理想。
數(shù)據(jù)存儲在內(nèi)存,雖然性能高,但是內(nèi)存的容量有限,系統(tǒng)支持的文件數(shù)量較少。Ceph將元數(shù)據(jù)保存在RADOS,IO操作多,路徑長,性能不理想。
人類的智慧是無限的,相信隨著時間的發(fā)展,在不斷地實踐和改進后,“數(shù)據(jù)革命”必然會取得勝利,分布式文件系統(tǒng)也必然會綻放更加絢麗的花??! ———————————————— 版權(quán)聲明:本文為CSDN博主「愛吃土豆的松鼠」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。 原文鏈接:分布式文件系統(tǒng)(Distributed File System,DFS)_什么是分布式文件系統(tǒng)-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-839171.html
???????文章來源地址http://www.zghlxwxcb.cn/news/detail-839171.html
到了這里,關于HADOOP HDFS詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!