一、HDFS的組成
1、NameNode
- 存儲(chǔ)整個(gè)HDFS集群的元數(shù)據(jù)(metaData) —— 整個(gè)集群中存儲(chǔ)的目錄和文件的索引
- 管理整個(gè)HDFS集群
- 接收客戶端的請(qǐng)求
- 負(fù)責(zé)節(jié)點(diǎn)的故障轉(zhuǎn)移
2、DataNode
- 存儲(chǔ)數(shù)據(jù),是以block塊的形式進(jìn)行數(shù)據(jù)的存放。
- 默認(rèn)情況下block塊的大小是128M。
- blocksize大小的計(jì)算公式:
- 尋址時(shí)間:下載文件時(shí)找到文件的時(shí)間;尋址時(shí)間是傳輸時(shí)間的1%的時(shí)候是最佳的狀態(tài);hdfs的尋址時(shí)間平均是10ms
- 數(shù)據(jù)傳輸速度:100M/s
- 定時(shí)負(fù)責(zé)匯總整個(gè)節(jié)點(diǎn)上存儲(chǔ)的block塊的信息,然后給NN匯報(bào)。
- 負(fù)責(zé)和客戶端連接進(jìn)行文件的讀寫操作。
3、SecondaryNameNode
- 輔助NameNode去完成edits編輯日志和fsimage鏡像文件的合并操作。
4、客戶端:命令行/Java API
- 負(fù)責(zé)和HDFS集群進(jìn)行通信實(shí)現(xiàn)文件的增刪改查
- 負(fù)責(zé)進(jìn)行block塊的分割
二、HDFS的基本使用
HDFS是一個(gè)分布式文件存儲(chǔ)系統(tǒng),可以存儲(chǔ)數(shù)據(jù)(文件數(shù)據(jù)),HDFS既然是一個(gè)文件系統(tǒng),那么就可以進(jìn)行文件的上傳、下載、刪除、創(chuàng)建文件夾等等
HDFS給我們提供了兩種操作的方式:①命令行來操作②通過Java API來進(jìn)行操作
1、命令行操作
命令行操作
hdfs dfs -xxxx xxxxx 或者 hadoop fs -xxxx xxxxx
查看 —— hdfs dfs -ls/
新建 —— hdfs dfs -mkdir /demo
上傳 —— hdfs dfs -put jdk-8u371-linux-x64.tar.gz /demo
上傳并刪除Linux本地內(nèi)容 —— hdfs dfs -moveFromLocal hadoop-3.1.4.tar.gz /demo
下載 —— hdfs dfs -getToLocal /demo/hadoop-3.1.4.tar.gz /opt/software
下載 —— hdfs dfs -copyToLocal /demo/hadoop-3.1.4.tar.gz /opt/software
刪除 —— hdfs dfs -rm -r /demo
2、Java API操作
引入Hadoop的編程依賴(hadoop-client、hadoop-hdfs)到pom.xml中:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kang</groupId>
<artifactId>hdfs-study</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hdfs-study</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<hadoop.version>3.1.4</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
</project>
- hdfs的基本操作
/**
* HDFS的編程流程
* 1、創(chuàng)建Hadoop的配置文件對(duì)象,配置文件對(duì)象指定HDFS的相關(guān)連接配置
* 配置文件對(duì)象等同于hadoop的etc/hadoop目錄下的哪些xxx.xml配置
* 2、根據(jù)配置獲取和HDFS的連接
* 3、連接去操作HDFS集群
*/
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class Demo {
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
//1、創(chuàng)建Hadoop的配置文件Configuration對(duì)象
Configuration conf = new Configuration();
//2、根據(jù)配置文件獲取HDFS的連接 FileSystem
FileSystem system = FileSystem.get(new URI("hdfs://192.168.31.104:9000"), conf, "root");
//3、根據(jù)System去操作HDFS集群了
RemoteIterator<LocatedFileStatus> listedFiles = system.listFiles(new Path("/"), false);
while(listedFiles.hasNext()){
LocatedFileStatus fileStatus = listedFiles.next();
System.out.println("文件的路徑" + fileStatus.getPath());
System.out.println("文件的所屬用戶" + fileStatus.getOwner());
System.out.println("文件的權(quán)限" + fileStatus.getPermission());
System.out.println("文件的blocksize" + fileStatus.getBlockSize());
}
}
}
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* 單元測(cè)試
*/
public class HDFSTest {
public FileSystem fileSystem;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
//1、創(chuàng)建Hadoop的配置文件Configuration對(duì)象
Configuration conf = new Configuration();
conf.set("dfs.replication","1");
//2、根據(jù)配置文件獲取HDFS的連接 FileSystem
fileSystem = FileSystem.get(new URI("hdfs://192.168.31.104:9000"), conf, "root");
}
/**
* 1、通過JavaAPI實(shí)現(xiàn)文件的上傳
*/
@Test
public void test01() throws IOException {
fileSystem.copyFromLocalFile(new Path("D:\\2023PracticalTraining\\software\\InstallPackage\\PowerDesginer16.5.zip"),new Path("/demo"));
System.out.println("上傳成功!");
//fileSystem.copyToLocalFile();
}
/**
* 2、下載文件
* 在Windows上遠(yuǎn)程操作HDFS或者是在Windows上操作MapReduce代碼的時(shí)候,有些情況下要求windows上也必須有hadoop的軟件環(huán)境
* 但是hadoop只能在Linux上安裝,因此,Windows上安裝的hadoop其實(shí)是一個(gè)假的環(huán)境
* 報(bào)錯(cuò):exitcode=-107xxxxxxx 原因是因?yàn)殡娔X缺少C語言的運(yùn)行環(huán)境
*/
@Test
public void test02() throws IOException {
fileSystem.copyToLocalFile(new Path("/jdk-8u371-linux-x64.tar.gz"),new Path("D:\\Desktop"));
System.out.println("下載成功!");
}
/**
* 3、刪除文件的方法
*/
@Test
public void test03() throws IOException {
boolean delete = fileSystem.delete(new Path("/demo"), true);
System.out.println(delete);
}
}
test01:
test02:
會(huì)顯示報(bào)錯(cuò):HADOOP_HOME and hadoop.home.dir are unset.
在Windows上遠(yuǎn)程操作HDFS或者是在Windows上操作MapReduce代碼的時(shí)候,有些情況下要求windows上也必須有hadoop的軟件環(huán)境;
但是hadoop只能在Linux上安裝,因此,Windows上安裝的hadoop其實(shí)是一個(gè)假的環(huán)境
將發(fā)給Linux的hadoop-3.1.4.tar.gz這個(gè)安裝包先解壓為hadoop-3.1.4.tar再解壓為hadoop-3.1.4
解壓時(shí)會(huì)報(bào)錯(cuò),此報(bào)錯(cuò)不予理會(huì)
解壓后,將文件中的bin目錄下的所有文件均作替換,替換文件可在百度上搜索下載
配置環(huán)境變量
編輯系統(tǒng)變量中的Path
再次運(yùn)行程序即可成功!
test03:
package com.kang;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* hdfs查看某個(gè)路徑下的所有文件和文件夾的信息
*/
public class Demo01 {
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.31.104:9000"), conf, "root");
/**
*
*/
FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : fileStatuses) {
System.out.println(fileStatus.getPath());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getGroup());
}
}
}
package com.kang;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* hdfs的相關(guān)判斷類型的JavaAPI操作
*/
public class Demo02 {
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.31.104:9000"), conf, "root");
boolean b = fs.isDirectory(new Path("/demo"));
System.out.println(b);
boolean b1 = fs.isFile(new Path("/demo"));
System.out.println(b1);
boolean exists = fs.exists(new Path("/a"));
System.out.println(exists);
}
}
package com.kang;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* hdfs的創(chuàng)建相關(guān)的JavaAPI
*/
public class Demo03 {
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.31.104:9000"), conf, "root");
boolean mkdirs = fs.mkdirs(new Path("/a/b"));
System.out.println(mkdirs);
boolean newFile = fs.createNewFile(new Path("/a/a.txt"));
System.out.println(newFile);
}
}
package com.kang;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* hdfs提供了一個(gè)可以借助JavaIO流讀取數(shù)據(jù)的方法
* 上傳fs.create 下載fs.open
*/
public class Demo04 {
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.31.104:9000"), conf, "root");
FSDataInputStream inputStream = fs.open(new Path("/jdk-8u371-linux-x64.tar.gz"));
inputStream.seek(128*1024*1024);
FileOutputStream fos = new FileOutputStream("D:\\Desktop\\block2");
int read = 0;
while((read = inputStream.read())!=-1){
fos.write(read);
}
System.out.println("第二個(gè)數(shù)據(jù)塊讀取完成");
}
}
- HDFS不適用于大量小文件的常量、HDFS不能對(duì)存儲(chǔ)的文件進(jìn)行修改操作
三、HDFS的工作流程問題(HDFS的原理性內(nèi)容)
1、HDFS上傳數(shù)據(jù)的流程
客戶端在和DN建立連接的時(shí)候,是和距離它最近的某一個(gè)DN建立連接
怎么判斷DN距離客戶端的距離:網(wǎng)絡(luò)拓?fù)湓瓌t
客戶端和HDFS的節(jié)點(diǎn)在同一個(gè)集群上
- 客戶端向namenode請(qǐng)求上傳文件,namenode檢查目標(biāo)文件是否已存在,父目錄是否存在。
- namenode返回是否可以上傳。
- 客戶端請(qǐng)求第一個(gè) block上傳到哪幾個(gè)datanode服務(wù)器上。
- namenode返回3個(gè)datanode節(jié)點(diǎn),分別為dn1、dn2、dn3。
- 客戶端請(qǐng)求dn1上傳數(shù)據(jù),dn1收到請(qǐng)求會(huì)繼續(xù)調(diào)用dn2,然后dn2調(diào)用dn3,將這個(gè)通信管道建立完成。
- dn1、dn2、dn3逐級(jí)應(yīng)答客戶端。
- 客戶端開始往dn1上傳第一個(gè)block(先從磁盤讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存),以packet為單位,dn1收到一個(gè)packet就會(huì)傳給dn2,dn2傳給dn3;dn1每傳一個(gè)packet會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答。
- 當(dāng)一個(gè)block傳輸完成之后,客戶端再次請(qǐng)求namenode上傳第二個(gè)block的服務(wù)器。(重復(fù)執(zhí)行3-7步)
2、HDFS下載數(shù)據(jù)的流程
- 客戶端向namenode請(qǐng)求下載文件,namenode通過查詢?cè)獢?shù)據(jù),找到文件塊所在的datanode地址。
- 挑選一臺(tái)datanode(就近原則,然后隨機(jī))服務(wù)器,請(qǐng)求讀取數(shù)據(jù)。
- datanode開始傳輸數(shù)據(jù)給客戶端(從磁盤里面讀取數(shù)據(jù)放入流,以packet為單位來做校驗(yàn))。
- 客戶端以packet為單位接收,先在本地緩存,然后寫入目標(biāo)文件。
3、HDFS副本備份機(jī)制
數(shù)據(jù)上傳的時(shí)候,會(huì)根據(jù)配置進(jìn)行block塊的備份,備份的時(shí)候,選擇哪些節(jié)點(diǎn)進(jìn)行數(shù)據(jù)備份?
機(jī)架感知原則進(jìn)行備份
低版本Hadoop副本節(jié)點(diǎn)選擇:
第一個(gè)副本在client所處的節(jié)點(diǎn)上。如果客戶端在集群外,隨機(jī)選一個(gè)。
第二個(gè)副本和第一個(gè)副本位于不相同機(jī)架的隨機(jī)節(jié)點(diǎn)上。
第三個(gè)副本和第二個(gè)副本位于相同機(jī)架,節(jié)點(diǎn)隨機(jī)。
Hadoop2.8.5副本節(jié)點(diǎn)選擇:
第一個(gè)副本在client所處的節(jié)點(diǎn)上。如果客戶端在集群外,隨機(jī)選一個(gè)。
第二個(gè)副本和第一個(gè)副本位于相同機(jī)架,隨機(jī)節(jié)點(diǎn)。
第三個(gè)副本位于不同機(jī)架,隨機(jī)節(jié)點(diǎn)。
4、HDFS中NameNode和SecondaryNameNode的工作機(jī)制
這個(gè)工作機(jī)制就是NameNode如何管理元數(shù)據(jù)的機(jī)制
元數(shù)據(jù):指的是HDFS存儲(chǔ)文件/文件夾的類似的目錄結(jié)構(gòu),目錄中記錄著每一個(gè)文件的大小、時(shí)間、每一個(gè)文件的block塊的份數(shù),block塊存儲(chǔ)的節(jié)點(diǎn)列表信息…
NameNode默認(rèn)的元數(shù)據(jù)內(nèi)存是1000M,可以存儲(chǔ)管理百萬個(gè)block塊的元數(shù)據(jù)信息
兩個(gè)和元數(shù)據(jù)有關(guān)的文件 —— 再次啟動(dòng)HDFS之后恢復(fù)元數(shù)據(jù)的機(jī)制
edits編輯日志文件:記錄客戶端對(duì)HDFS集群的寫入和修改操作
fsimage鏡像文件:理解為HDFS元數(shù)據(jù)的持久點(diǎn)檢查文件
HDFS的安全模式(safemode)
HDFS啟動(dòng)之后會(huì)先進(jìn)入安全模式,安全模式就是將edits和fsimage文件加載到nn內(nèi)存的這一段時(shí)間,dn向NN注冊(cè)的這一段時(shí)間
安全模式下無法操作HDFS集群的,安全模式會(huì)自動(dòng)退出,NN的內(nèi)存加載好了(元數(shù)據(jù)加載好了),同時(shí)HDFS集群還滿足節(jié)點(diǎn)數(shù)的啟動(dòng)
SNN的作用就是對(duì)NN進(jìn)行checkpoint(檢查點(diǎn)機(jī)制)操作
-
checkpoint什么時(shí)候觸發(fā)
- 檢查點(diǎn)時(shí)間到了 —— 1小時(shí)
dfs.namenode.checkpoint.period 3600s - HDFS距離上一次檢查點(diǎn)操作數(shù)到達(dá)100萬次
dfs.namenode.checkpoint.txns 1000000
- 檢查點(diǎn)時(shí)間到了 —— 1小時(shí)
-
SNN每隔1分鐘會(huì)詢問一次NN是否要進(jìn)行checkponit操作
dfs.namenode.checkpoint.check.period 60s
NameNode的出現(xiàn)故障之后,元數(shù)據(jù)的恢復(fù)方式
-
因?yàn)樵獢?shù)據(jù)的核心是edits和fsimage文件,同時(shí)snn工作的時(shí)候會(huì)把nn的文件復(fù)制到snn當(dāng)中,因此如果NN的元數(shù)據(jù)丟失,我們可以從SNN中把這些文件再復(fù)制到NN的目錄下 進(jìn)行元數(shù)據(jù)的恢復(fù)(恢復(fù)可能會(huì)導(dǎo)致一部分的元數(shù)據(jù)丟失)
SNN的目錄: h a d o o p . t m p . d i r / d f s / n a m e s e c o n d a r y / c u r r e n t n n 的目錄: {hadoop.tmp.dir}/dfs/namesecondary/current nn的目錄: hadoop.tmp.dir/dfs/namesecondary/currentnn的目錄:{hadoop.tmp.dir}/dfs/name/current -
元數(shù)據(jù)還有一種恢復(fù)方式:配置HDFS的namenode的多目錄保存(HDFS的編輯日志和鏡像文件在多個(gè)目錄下保存相同的備份)
這種方式只能使用在同一個(gè)節(jié)點(diǎn)上
這種方式存在的問題:如果整個(gè)節(jié)點(diǎn)宕機(jī),無法恢復(fù)了
dfs.namenode.name.dir 多個(gè)路徑hdfs-site.xml <property> <name>dfs.namenode.name.dir</name> <value>/opt/app/hadoop/data/dfs/name1,/opt/app/hadoop/data/dfs/name2</value> </property>
-
最好把HDFS重新格式化一下,或者手動(dòng)把目錄創(chuàng)建一份
-
HA高可用模式
5、HDFS中NameNode和DataNode之間的工作機(jī)制
- 詳細(xì)流程
- 一個(gè)數(shù)據(jù)塊在datanode上以文件形式存儲(chǔ)在磁盤上,包括兩個(gè)文件,一個(gè)是數(shù)據(jù)本身,一個(gè)是元數(shù)據(jù)包括數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳。
- DataNode啟動(dòng)后向namenode注冊(cè),通過后,周期性(1小時(shí))的向namenode上報(bào)所有的塊信息。
- 心跳是每3秒一次,心跳返回結(jié)果帶有namenode給該datanode的命令如復(fù)制塊數(shù)據(jù)到另一臺(tái)機(jī)器,或刪除某個(gè)數(shù)據(jù)塊。如果超過10分鐘沒有收到某個(gè)datanode的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。
- 集群運(yùn)行中可以安全加入和退出一些機(jī)器。
DataNode上存儲(chǔ)的block塊除了數(shù)據(jù)本身以外,還包含數(shù)據(jù)的長度、數(shù)據(jù)校驗(yàn)和、時(shí)間戳…
數(shù)據(jù)校驗(yàn)和是為了保證block塊的完整性和一致性的,校驗(yàn)和機(jī)制,創(chuàng)建block塊的時(shí)候會(huì)根據(jù)數(shù)據(jù)本身計(jì)算一個(gè)校驗(yàn)和,以后每一次DN進(jìn)行block匯總的時(shí)候會(huì)再進(jìn)行一次校驗(yàn)和的計(jì)算,如果兩次校驗(yàn)和不一致則認(rèn)為block塊損壞了。
DataNode和NameNode心跳,默認(rèn)三秒心跳一次,默認(rèn)值可以調(diào)整
dfs.heartbeat.interval 3s
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>單位毫秒
</property>
<property>
<name> dfs.heartbeat.interval </name>
<value>3</value>單位秒
</property>
修改此配置時(shí)需關(guān)閉HDFS,但是不需要重新格式化
心跳的作用有兩個(gè):1、檢測(cè)DN是否活著 2、把NN讓DN做的事情告訴DN
NN如何知道DN掉線 - 死亡 - 宕機(jī)了(掉線的時(shí)限):NN如果在某一次心跳中沒有收到DN的心跳,NN不會(huì)認(rèn)為DN死亡了,而是會(huì)繼續(xù)心跳,如果超過掉線的時(shí)限的時(shí)間還沒有心跳成功,NN才會(huì)認(rèn)為DN死亡了,然后啟動(dòng)備份恢復(fù)機(jī)制
掉線時(shí)限的時(shí)長是有一個(gè)計(jì)算公式:
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。
dfs.namenode.heartbeat.recheck-interval 心跳檢測(cè)時(shí)間 5分鐘
dfs.heartbeat.interval 心跳時(shí)間 3s
默認(rèn)情況下,如果超過10min30s沒有收到DN的心跳 認(rèn)為DN死亡了
DataNode每隔一段時(shí)間(默認(rèn)6小時(shí))會(huì)向NameNode匯報(bào)一次節(jié)點(diǎn)上所有的block塊的信息
dfs.blockreport.intervalMsec 21600000ms 每隔6小時(shí)向NN匯報(bào)一次DN的block塊的信息
dfs.datanode.directoryscan.interval 21600s 每隔6小時(shí)DN自己掃描一下DN上的block塊信息
四、HDFS、YARN的新節(jié)點(diǎn)的服役和舊節(jié)點(diǎn)的退役 —— 在namenode所在節(jié)點(diǎn)的hadoop中配置
1、概念
HDFS是一個(gè)分布式文件存儲(chǔ)系統(tǒng),HDFS身為一個(gè)大數(shù)據(jù)軟件,基本上都是7*24小時(shí)不停機(jī)的,那如果HDFS集群的容量不夠用了,那么我們需要增加一個(gè)新的數(shù)據(jù)節(jié)點(diǎn),因?yàn)镠DFS不能停止,因此我們需要在HDFS集群運(yùn)行過程中動(dòng)態(tài)的增加一個(gè)數(shù)據(jù)節(jié)點(diǎn)(新節(jié)點(diǎn)的服役操作);舊節(jié)點(diǎn)的退役。
2、新節(jié)點(diǎn)服役操作
服役新節(jié)點(diǎn)之前,需要?jiǎng)?chuàng)建一臺(tái)新的虛擬節(jié)點(diǎn),并且配置Java、Hadoop環(huán)境、SSH免密登錄、ip、主機(jī)映射、主機(jī)名
1、在Hadoop的配置文件目錄創(chuàng)建一個(gè)dfs.hosts文件,文件中聲明Hadoop集群的從節(jié)點(diǎn)的主機(jī)名
2、在Hadoop的hdfs-site.xml文件中,增加一個(gè)配置項(xiàng)
dfs.hosts 值:文件的路徑
<!--dfs.hosts代表改文件中的地址都為白名單,可以訪問NameNode節(jié)點(diǎn),與NameNode節(jié)點(diǎn)通信-->
<property>
<name>dfs.hosts</name>
<value>/opt/app/hadoop-3.1.4/etc/hadoop/dfs.hosts</value>
</property>
3、在HDFS開啟的狀態(tài)下刷新從節(jié)點(diǎn)的信息
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
4、只需要在新節(jié)點(diǎn)啟動(dòng)datanode和nodemanager即可成功實(shí)現(xiàn)節(jié)點(diǎn)的服役
hadoop-daemon.sh start datanode
hadoop-daemon.sh start nodemanager
3、舊節(jié)點(diǎn)退役操作(如果第一次增加退役文件,必須重啟HDFS集群)
1、在Hadoop的配置目錄創(chuàng)建一個(gè)文件dfs.hosts.exclude,文件中編寫退役的主機(jī)名
2、在Hadoop的hdfs-site.xml配置文件中聲明退役的節(jié)點(diǎn)文件
dfs.hosts.exclude 值 文件的路徑
<!--dfs.hosts.exculde文件代表namenode訪問的黑名單 需要退役的數(shù)據(jù)節(jié)點(diǎn)
黑名單加入的數(shù)據(jù)節(jié)點(diǎn)如果也在dfs.hosts文件存在的話 不會(huì)立即退出 而是先把數(shù)據(jù)塊轉(zhuǎn)移到其他數(shù)據(jù)節(jié)點(diǎn) 然后再退役
-->
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/app/hadoop-3.1.4/etc/hadoop/dfs.hosts.exclude</value>
</property>
3、同時(shí)需要在服役節(jié)點(diǎn)文件中把退役節(jié)點(diǎn)刪除了在dfs.hosts中
4、刷新節(jié)點(diǎn)信息狀態(tài)
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes文章來源:http://www.zghlxwxcb.cn/news/detail-704224.html
【注意】退役的時(shí)候,會(huì)先把退役節(jié)點(diǎn)的block塊復(fù)制到?jīng)]有退役的節(jié)點(diǎn)上,然后才會(huì)下線,而且退役的時(shí)候,必須保證退役之后剩余集群的節(jié)點(diǎn)數(shù)大于等于副本數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-704224.html
到了這里,關(guān)于Hadoop的分布式文件存儲(chǔ)系統(tǒng)HDFS組件的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!