這篇文章將為大家詳細(xì)講解有關(guān)HDFS分布式文件系統(tǒng)如何設(shè)計(jì),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站企業(yè)建站,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁(yè)設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對(duì)于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁(yè)中充分展現(xiàn),通過(guò)對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。正文
HDFS的設(shè)計(jì)以及概念
HDFS集群是典型的 master/slave 架構(gòu),master 節(jié)點(diǎn)叫做 NameNode,salve 節(jié)點(diǎn)叫做 DataNode。最簡(jiǎn)單的 HDFS 集群便是一個(gè) NameNode 節(jié)點(diǎn)和多個(gè) DataNode 節(jié)點(diǎn),HDFS 集群的架構(gòu)圖如下:
Block:數(shù)據(jù)塊,HDFS 集群將存儲(chǔ)的文件劃分為多個(gè)分塊,塊作為獨(dú)立的存儲(chǔ)單元,默認(rèn)大小為為 128M。如果某個(gè)文件超過(guò)集群?jiǎn)螜C(jī)存儲(chǔ)容量,分塊可以解決該問題;其次按照塊進(jìn)行存儲(chǔ)、備份能簡(jiǎn)化系統(tǒng)的設(shè)計(jì)。默認(rèn)塊大小修改 hdfs-site.xml 文件中的 dfs.blocksize 配置。
NameNode:HDFS 集群的 Master 節(jié)點(diǎn),維護(hù)集群文件的目錄結(jié)構(gòu)(命名空間)和編輯日志文件,同時(shí)在內(nèi)存中記錄文件各個(gè)塊所在的數(shù)據(jù)節(jié)點(diǎn)的信息。
DataNode:HDFS 集群的 Slave 節(jié)點(diǎn),負(fù)責(zé)存儲(chǔ)實(shí)際的數(shù)據(jù)。根據(jù)需要存儲(chǔ)和檢索數(shù)據(jù)塊,并定期向 NameNode 發(fā)送他們所存儲(chǔ)的數(shù)據(jù)塊列表。為了實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的高可靠,HDFS 將一個(gè)塊存儲(chǔ)在不同的 DataNode 節(jié)點(diǎn), 默認(rèn)是 3 個(gè),可以通過(guò) hdfs-site.xml 文件中的 dfs.replication 配置修改默認(rèn)值。如果當(dāng)前 DataNode 中的數(shù)據(jù)塊損壞, 可以從其他 DataNode 節(jié)點(diǎn)復(fù)制一個(gè)正確的數(shù)據(jù)塊。
以上是架構(gòu)圖中顯而易見的幾個(gè)重要概念,接下來(lái)將結(jié)合架構(gòu)設(shè)計(jì)中的高可用、可擴(kuò)展性來(lái)介紹下架構(gòu)圖中隱藏的幾個(gè)重要概念。
聯(lián)邦 HDFS:這個(gè)主要是為了解決可擴(kuò)展性的問題,我們知道 NameNode 進(jìn)程的內(nèi)存中存放了數(shù)據(jù)與數(shù)據(jù)位置的對(duì)應(yīng)關(guān)系,對(duì)于一個(gè)文件數(shù)據(jù)量多的集群來(lái)說(shuō),NameNode 的內(nèi)存將成為集群規(guī)模擴(kuò)大的瓶頸。因此,單一 NameNode 的集群并不可取。Hadoop 2.x 的發(fā)行版引入了聯(lián)邦 HDFS 允許向集群中添加 NameNode 節(jié)點(diǎn)實(shí)現(xiàn)橫向擴(kuò)展。每一個(gè) NameNode 管理命名空間中的一部分,每個(gè) NameNode 維護(hù)一個(gè)命名空間卷(namespace volume),命名空間卷之間相互獨(dú)立,一個(gè) NameNode 失效不會(huì)影響其他 NameNode 維護(hù)的命名空間。
HDFS HA: 這個(gè)解決高可用,即 HDFS High Available。這一實(shí)現(xiàn)中配置了一對(duì)活動(dòng)-備用(active-standby)NameNode。當(dāng)活動(dòng)的 NameNode 失效,備用 NameNode 會(huì)接管相應(yīng)的任務(wù),這一過(guò)程對(duì)用戶透明。實(shí)現(xiàn)這一設(shè)計(jì),需要在架構(gòu)上做如下修改:
1. HA 的兩個(gè) NameNode 之間通過(guò)高可用共享存儲(chǔ)實(shí)現(xiàn)編輯日志的共享,目的是為了能夠使備用 NameNode 接管工作后實(shí)現(xiàn)與主 NameNode 狀態(tài)同步。QJM(日志管理器,quorum journal manager)是為提供一個(gè)高可用的日志編輯而設(shè)計(jì)的,被推薦用于大多數(shù) HDFS 集群中。QJM 以一組日志節(jié)點(diǎn)的形式運(yùn)行,一般是 3,每一次編輯必須寫入多數(shù)日志節(jié)點(diǎn),因此系統(tǒng)可以忍受任何一個(gè)節(jié)點(diǎn)丟失,日志節(jié)點(diǎn)便是 JournalNode。
2. DataNode 需要同時(shí)向 2 個(gè) NameNode 發(fā)送數(shù)據(jù)報(bào)告,因?yàn)閿?shù)據(jù)塊的映射信息存儲(chǔ)在 NameNode 的內(nèi)存中
3. 客戶端需要處理 NameNode 失效的問題,對(duì)用戶透明
HDFS的基本操作
命令行接口
命令行接口操作 HDFS 是最簡(jiǎn)單、最方便的方式。HDFS 的命令與 Linux 本地命令非常相似,可以通過(guò) hadoop fs help 命令查看 HDFS 所支持所有命令,接下來(lái)介紹下常用的命令:
hadoop fs -put
hadoop fs -ls
hadoop fs -cat
hadoop fs -text
hadoop fs -rm
以上是比較常用的 HDFS 命令,查看幫助文檔可以在每個(gè)命令上增加一些命令行選項(xiàng),輸出不同的信息。以 ls 命令為例,看一下 HDFS 輸出的文件信息。
hadoop fs -ls /hadoop-ex/wordcount/input
-rw-r--r-- 3 root supergroup 32 2019-03-03 01:34 /hadoop-ex/wordcount/input/words
-rw-r--r-- 3 root supergroup 28 2019-03-03 01:46 /hadoop-ex/wordcount/input/words2
可以發(fā)現(xiàn)輸出的內(nèi)容與 Linux 下 ls 命令類似。第 1 部分顯示文件類型與權(quán)限,第 2 部分是副本數(shù)量 3,第 3 、4部分是所屬的用戶和用戶組,第 5 部分是文件大小,若是目錄則為 0 ,第 6、7 部分是文件的修改日期和時(shí)間,第 8 部分是文件的路徑和名稱。 在 HDFS 中有個(gè)超級(jí)用戶,即 啟動(dòng) NameNode 的用戶。
Java 接口
相對(duì)于命令行接口,Java接口更加靈活,更強(qiáng)大。但用起來(lái)不是很方便,一般可以在 MR 或者 Spark 任務(wù)中使用 Java 接口讀取 HDFS 上的數(shù)據(jù)。本章僅舉一個(gè)讀取 HDFS 文件數(shù)據(jù)的例子介紹一下 Java 接口的使用方式,主要使用 FileSystem API 來(lái)實(shí)現(xiàn),更具體和更多的使用方法讀者可以自行查閱。
package com.cnblogs.duma.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
public class FileSystemEx {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
// uri 便是 core-site.xml 文件中 fs.defaultFS 配置的值
FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop0:9000"), conf);
InputStream in = null;
try {
// 指定打開的文件
in = fs.open(new Path("/hadoop-ex/wordcount/input/words"));
// 將輸入流拷貝到標(biāo)準(zhǔn)輸出流
IOUtils.copyBytes(in, System.out, 4096, false);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關(guān)閉輸入流
IOUtils.closeStream(in);
}
}
}
關(guān)于“HDFS分布式文件系統(tǒng)如何設(shè)計(jì)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。