溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HDFS基本原理及如何進行數(shù)據(jù)存取

發(fā)布時間:2021-12-01 15:11:26 來源:億速云 閱讀:114 作者:柒染 欄目:云計算

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān) HDFS基本原理及如何進行數(shù)據(jù)存取,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、HDFS簡介

Hadoop分布式文件系統(tǒng)(HDFS)被設(shè)計成適合運行在通用硬件(commodity hardware)上的分布式文件系統(tǒng)。HDFS體系結(jié)構(gòu)中有兩類節(jié)點,一類是NameNode,又叫"元數(shù)據(jù)節(jié)點";另一類是DataNode,又叫"數(shù)據(jù)節(jié)點"。這兩類節(jié)點分別承擔(dān)Master和Worker具體任務(wù)的執(zhí)行節(jié)點??偟脑O(shè)計思想:分而治之——將大文件、大批量文件,分布式存放在大量獨立的服務(wù)器上,以便于采取分而治之的方式對海量數(shù)據(jù)進行運算分析。

HDFS是一個主/從(Mater/Slave)體系結(jié)構(gòu),從最終用戶的角度來看,它就像傳統(tǒng)的文件系統(tǒng)一樣,可以通過目錄路徑對文件執(zhí)行CRUD(Create、Read、Update和Delete)操作。但由于分布式存儲的性質(zhì),HDFS集群擁有一個NameNode和一些DataNode。NameNode管理文件系統(tǒng)的元數(shù)據(jù),DataNode存儲實際的數(shù)據(jù)??蛻舳送ㄟ^同NameNode和DataNodes的交互訪問文件系統(tǒng)。客戶端聯(lián)系NameNode以獲取文件的元數(shù)據(jù),而真正的文件I/O操作是直接和DataNode進行交互的。
HDFS一般是用來“一次寫入,多次讀取”,不適合做實時交互性很強的事情,不適合存儲大量小文件(當然,如果你偏要存大量小文件的話本文末尾會有解決方案).

二、HDFS工作原理

2.1基本原理

1 分布式文件系統(tǒng),它所管理的文件是被切塊存儲在若干臺datanode服務(wù)器上.

2 hdfs提供了一個統(tǒng)一的目錄樹來定位hdfs中的文件,客戶端訪問文件時只要指定目錄樹的路徑即可,不用關(guān)心文件的具體物理位置.

3 每一個文件的每一個切塊,在hdfs集群中都可以保存多個備份(默認3份),在hdfs-site.xml中,dfs.replication的value的數(shù)量就是備份的數(shù)量.

4 hdfs中有一個關(guān)鍵進程服務(wù)進程:namenode,它維護了一個hdfs的目錄樹及hdfs目錄結(jié)構(gòu)與文件真實存儲位置的映射關(guān)系(元數(shù)據(jù)).而datanode服務(wù)進程專門負責(zé)接收和管理"文件塊"-block.默認大小為128M(可配置),(dfs.blocksize).(老版本的hadoop的默認block是64M的)


2.2 常用操作

hdfs的根目錄,通過這條命令可以查看hdfs存儲的文件,在hadoop的安裝目錄下面:

bin/hdfs dfs -ls /<pre name="code" class="html">hdfs dfs -chmod 600 /test.txt    //設(shè)置文件權(quán)限


bin/hdfs dfs -df -h /    //查看磁盤空間


bin/hdfs dfs -mkdir /aaa   //新建文件夾


bin/hdfs dfs  -tail       //查看文件尾部

hdfs塊的存儲位置位于:(在hadoop的根目錄下面的tmp文件夾中)hadoop-2.5.2/tmp/hadoop/dfs/data/current/BP-33587274-127.0.0.1-1465370300743/current/finalized

HDFS基本原理及如何進行數(shù)據(jù)存取

從圖中我們可以看到hdfs存儲的塊的,當然這里面的兩個塊通過合并可以形成一個新的文件,然后可以通過解壓進行驗證。

touch full hadoop.tar.gz
cat blk_1073741825 >> hadoop.tar.gz
cat blk_1073741826 >> hadoop.tar.gz
tar -xvzf  hadoop.tar.gz


同樣,在hadoop的安裝目錄中,直接用命令來存取文件可以通過下面的命令:

存文件:
./hdfs dfs -put /home/admin1/桌面/test.txt  hdfs://localhost:9000/
取文件:
./hdfs dfs -get hdfs://localhost:9000/test.txt


hdfs的權(quán)限控制:

客戶端的操作命令

bin/hdfs dfs -chown  aa:bgroup  /test.txt


//將test.txt文件的權(quán)限改為aa用戶的bgroup組.

(因為我根本就沒有這個組和用戶,但是也可以修改成功,所以說明hadoop本身對權(quán)限的控制不是很嚴格)

2.3 HDFS的shell操作

--appendToFile  ----追加一個文件到已經(jīng)存在的文件末尾

-->hadoop fs  -appendToFile  ./hello.txt hdfs://hadoop-server01:9000/hello.txt

可以簡寫為:

Hadoop fs  -appendToFile  ./hello.txt /hello.txt

-cat  ---顯示文件內(nèi)容 

-->hadoop fs -cat /hello.txt

-chgrp

-chmod

-chown

上面三個跟linux中的用法一樣

-->hadoop fs -chmod 666 /hello.txt

-copyFromLocal    #從本地文件系統(tǒng)中拷貝文件到hdfs路徑去

-->hadoop fs  -copyFromLocal  ./jdk.tar.gz /aaa/

-copyToLocal      #從hdfs拷貝到本地

Eg: hadoop fs -copyToLocal /aaa/jdk.tar.gz

-count         #統(tǒng)計一個指定目錄下的文件節(jié)點數(shù)量

-->hadoop fs -count /aaa/

-cp              #從hdfs的一個路徑拷貝hdfs的另一個路徑

hadoop fs -cp/aaa/jdk.tar.gz /bbb/jdk.tar.gz.2

-createSnapshot

-deleteSnapshot

-renameSnapshot

以上三個用來操作hdfs文件系統(tǒng)目錄信息快照

-->hadoop fs -createSnapshot /

-df               #統(tǒng)計文件系統(tǒng)的可用空間信息

-du

-->hadoop fs -df -h /

-->hadoop fs -du -s -h /aaa/*

-get              #等同于copyToLocal,就是從hdfs下載文件到本地

-getmerge             #合并下載多個文件

--> 比如hdfs的目錄 /aaa/下有多個文件:log.1, log.2,log.3,...

hadoop fs -getmerge /aaa/log.* ./log.sum

-help             #輸出這個命令參數(shù)手冊

-ls                  #顯示目錄信息

-->hadoop fs -ls hdfs://hadoop-server01:9000/

這些參數(shù)中,所有的hdfs路徑都可以簡寫

-->hadoop fs -ls /   等同于上一條命令的效果

-mkdir              #在hdfs上創(chuàng)建目錄

-->hadoop fs -mkdir -p /aaa/bbb/cc/dd

-moveFromLocal            #從本地剪切粘貼到hdfs

-moveToLocal              #從hdfs剪切粘貼到本地

-mv                     #在hdfs目錄中移動文件

-put                #等同于copyFromLocal

-rm                #刪除文件或文件夾

--> hadoop fs -rm -r/aaa/bbb/

-rmdir                 #刪除空目錄

-setrep                #設(shè)置hdfs中文件的副本數(shù)量

-->hadoop fs -setrep 3 /aaa/jdk.tar.gz

-stat                  #顯示一個文件或文件夾的元信息

-tail                  #顯示一個文件的末尾

-text                  #以字符形式打印一個文件的內(nèi)容


三、HDFS寫入數(shù)據(jù)流程解析

3.1 基本原理

hdfs的數(shù)據(jù)寫入是非常復(fù)雜的過程,下面來看一下簡要的步驟。

HDFS基本原理及如何進行數(shù)據(jù)存取

HDFS基本原理及如何進行數(shù)據(jù)存取


那么問題來了,如果他們之間的一個datanode突然壞掉了怎么辦。

1、如果傳輸過程中,有某個datanode出現(xiàn)了故障,那么當前的pipeline會被關(guān)閉,出現(xiàn)故障的datanode會從當前的pipeline中移除,剩余的block會繼續(xù)剩下的datanode中繼續(xù)以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持replicas設(shè)定的數(shù)量。
2、關(guān)閉pipeline,將ack queue中的數(shù)據(jù)塊放入data queue的開始。
3、當前的數(shù)據(jù)塊在已經(jīng)寫入的數(shù)據(jù)節(jié)點中被元數(shù)據(jù)節(jié)點賦予新的標示,則錯誤節(jié)點重啟后能夠察覺其數(shù)據(jù)塊是過時的,會被刪除。
4、失敗的數(shù)據(jù)節(jié)點從pipeline中移除,另外的數(shù)據(jù)塊則寫入pipeline中的另外兩個數(shù)據(jù)節(jié)點。
5、元數(shù)據(jù)節(jié)點則被通知此數(shù)據(jù)塊是復(fù)制塊數(shù)不足,將來會再創(chuàng)建第三份備份。
6、客戶端調(diào)用create()來創(chuàng)建文件
7、DistributedFileSystem用RPC調(diào)用元數(shù)據(jù)節(jié)點,在文件系統(tǒng)的命名空間中創(chuàng)建一個新的文件。
8、元數(shù)據(jù)節(jié)點首先確定文件原來不存在,并且客戶端有創(chuàng)建文件的權(quán)限,然后創(chuàng)建新文件。
9、DistributedFileSystem返回DFSOutputStream,客戶端用于寫數(shù)據(jù)。
10、客戶端開始寫入數(shù)據(jù),DFSOutputStream將數(shù)據(jù)分成塊,寫入data queue。
11、Data queue由Data Streamer讀取,并通知元數(shù)據(jù)節(jié)點分配數(shù)據(jù)節(jié)點,用來存儲數(shù)據(jù)塊(每塊默認復(fù)制3塊)。分配的數(shù)據(jù)節(jié)點放在一個pipeline里。
12、Data Streamer將數(shù)據(jù)塊寫入pipeline中的第一個數(shù)據(jù)節(jié)點。第一個數(shù)據(jù)節(jié)點將數(shù)據(jù)塊發(fā)送給第二個數(shù)據(jù)節(jié)點。第二個數(shù)據(jù)節(jié)點將數(shù)據(jù)發(fā)送給第三個數(shù)據(jù)節(jié)點。
13、DFSOutputStream為發(fā)出去的數(shù)據(jù)塊保存了ack queue,等待pipeline中的數(shù)據(jù)節(jié)點告知數(shù)據(jù)已經(jīng)寫入成功。

3.2 編碼實踐

這段代碼的意思是從/home/admin1/hadoop/eclipse.tar.gz上傳文件到hdfs文件中,URI中寫的是hdfs的地址

@Test
	public void testUpload() throws IOException, InterruptedException, URISyntaxException{
		Configuration conf = new Configuration();
	
		 
		//to get a client of the hdfs system
		FileSystem fs = FileSystem.get(new URI("hdfs://ubuntu2:9000"),conf,"admin1");
		

		fs.copyFromLocalFile(new Path("/home/admin1/hadoop/eclipse.tar.gz"), new Path("/"));
		fs.close();
		
		
	}



四、HDFS讀取數(shù)據(jù)流程解析

4.1 基本原理

讀取的流程比寫入的流程就簡單很多了。

HDFS基本原理及如何進行數(shù)據(jù)存取

HDFS基本原理及如何進行數(shù)據(jù)存取

4.2 編碼實踐

下載文件:

/*public static void main(String[] args) throws IOException {
		//download  from hdfs
		
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://ubuntu2:9000/");
		
		
		conf.set("dfs.blocksize", "64");
		 
		//to get a client of the hdfs system
		FileSystem fs = FileSystem.get(conf);
		
		fs.copyToLocalFile(new Path("hdfs://ubuntu2:9000/test.txt"), new Path("/home/admin1/Downloads/test1.txt"));
		
		fs.close();
	}*/

刪除文件:

@Test
	public void rmove() throws IOException, InterruptedException, URISyntaxException{
	Configuration conf = new Configuration();

	FileSystem fs = FileSystem.get(new URI("hdfs://ubuntu2:9000"),conf,"admin1");
	
	fs.delete(new Path("/test.txt"));
	
	fs.close();
	}



五、NameNode工作機制

元數(shù)據(jù)放在內(nèi)存中,同時需要備份,通過日志的記錄(對元數(shù)據(jù)有修改操作時)寫到磁盤中,用edits_ingropress,定期dump一次,當一旦斷電時,很難恢復(fù),
所以我們就用sercondName定期把操作日志下載和內(nèi)存鏡像文件,然后就定期合并操作記錄,(日志+fsimage)然后生成一個新的namenode鏡像文件  (fs.image.ckpt)
最后上傳給namenode,然后namenode重命名為fsimage.
HDFS基本原理及如何進行數(shù)據(jù)存取

元數(shù)據(jù)管理機制:
1、元數(shù)據(jù)有3中存儲形式:內(nèi)存、edits日志、fsimage
2、最完整最新的元數(shù)據(jù)一定是內(nèi)存中的這一部分

六、RPC編程

使用 RPC 編程是在客戶機和服務(wù)器實體之間進行可靠通信的最強大、最高效的方法之一。它為在分布式計算環(huán)境中運行的幾乎所有應(yīng)用程序提供基礎(chǔ)。任何 RPC 客戶機-服務(wù)器程序的重要實體都包括 IDL 文件(接口定義文件)、客戶機 stub、服務(wù)器 stub 以及由客戶機和服務(wù)器程序共用的頭文件??蛻魴C和服務(wù)器 stub 使用 RPC 運行時庫通信。RPC 運行時庫提供一套標準的運行時例程來支持 RPC 應(yīng)用程序。在一般的應(yīng)用程序中,被調(diào)用的過程在相同的地址空間中運行,并把結(jié)果返回給發(fā)出調(diào)用的過程。在分布式環(huán)境中,客戶機和服務(wù)器在不同的機器上運行,客戶端調(diào)用在服務(wù)器端運行的過程,并把結(jié)果發(fā)送回客戶機。這稱為遠程過程調(diào)用 (RPC),是 RPC 編程的基礎(chǔ)。

以下實例是用來模擬用戶登陸的過程。

在linux中的eclipse。新建一個java工程,新建java文件:

RPCServer.java

package hdfsTest;

public interface  RPCService {
	public static final long versionID=100L;  //定義通信接口的版本號

	public String userLogin(String username,String password);  //用戶名和密碼

}

RPCServerImpl.java

package hdfsTest;

public class RPCServiceImpl  implements RPCService {

	@Override
	public String userLogin(String username, String password) {	
		return username+"  logged in successfully!";
	}
}


RPCControl.java

package hdfsTest;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;


//
public class RPCController {

	public static void main(String[] args) throws IOException {
		RPCService serverceImpl=RPC.getProxy(RPCService.class,100,new InetSocketAddress("ubuntu2",10000),new Configuration());
<span >		</span>//100是指前面設(shè)置的版本號,InetSocketAddress中的是hdfs主機名和10000是通信端口
		String result=serverceImpl.userLogin("aaa", "aaa");  //設(shè)置用戶用戶名和密碼
		System.out.println(result);   
	}
}


ServerRunner.java

package hdfsTest;

import java.io.IOException;

import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.Server;

public class ServerRunner {

	public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
		Builder builder=new RPC.Builder(new Configuration());
		
		builder.setBindAddress("ubuntu2");  //hdfs的主機名
		builder.setPort(10000);    //設(shè)置通信端口號
		
		builder.setProtocol(RPCService.class);
		builder.setInstance(new RPCServiceImpl());
		
		Server server=builder.build();
		server.start();   //開啟服務(wù)
	}
}


運行結(jié)果:

HDFS基本原理及如何進行數(shù)據(jù)存取


七、常見問題分析

7.1.HDFS可不可以用來做網(wǎng)盤

答案:不可以,

網(wǎng)盤只存儲,不用做分析,hdfs在增加節(jié)點,同時也加大了分析能力,主要是大容量存儲之上的數(shù)據(jù)分析
1、容量成本太高,2、文件大小不確定,如果存大量小文件會造成很大的浪費 3、相對于網(wǎng)盤來說,文件讀寫的效率低  4、只適合一次寫入,多次讀取的操作
5、hdfs不支持文件內(nèi)容修改,可支持往文件尾部追加內(nèi)容。


7.2 HDFS大量小文件存儲

1、對于待上傳的文件,先將小文件合并為一個大文件再上傳,利用SequenceFile、MapFile、Har等方式歸檔小文件,這個方法的原理就是把小文件歸檔起來管理,HBase就是基于此的。對于這種方法,如果想找回原來的小文件內(nèi)容,那就必須得知道與歸檔文件的映射關(guān)系。

2、如果對于已經(jīng)上傳了的文件,需要進行合并的話,我們可以使用Map-redure來進行歸檔。

3、BlueSky解決方案,以一種two-level prefetching機制以提高小文件讀取效率,即索引文件預(yù)取和數(shù)據(jù)文件預(yù)取。索引文件預(yù)取是指當用戶訪問某個文件時,該文件所在的block對應(yīng)的索引文件被加載到內(nèi)存中,這樣,用戶訪問這些文件時不必再與namenode交互了。數(shù)據(jù)文件預(yù)取是指用戶訪問某個文件時,將該文件所在課件中的所有文件加載到內(nèi)存中,這樣,如果用戶繼續(xù)訪問其他文件,速度會明顯提高。

上述就是小編為大家分享的 HDFS基本原理及如何進行數(shù)據(jù)存取了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI