精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Hadoop集群系列9:HDFS初探之旅

開發 開發工具 大數據 Hadoop
本文為Hadoop集群系列第九。HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分布式計算中數據存儲管理的基礎篇,今天我們講講Hadoop條件下,Eclipse開發環境設置。

1、HDFS簡介

HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分布式計算中數據存儲管理的基礎,是基于流數據模式訪問和處理超大文件的需求而開發的,可以運行于廉價的商用服務器上。它所具有的高容錯、高可靠性、高可擴展性、高獲得性、高吞吐率等特征為海量數據提供了不怕故障的存儲,為超大數據集(Large Data Set)的應用處理帶來了很多便利。

  Hadoop整合了眾多文件系統,在其中有一個綜合性的文件系統抽象,它提供了文件系統實現的各類接口,HDFS只是這個抽象文件系統的一個實例。提供了一個高層的文件系統抽象類org.apache.hadoop.fs.FileSystem,這個抽象類展示了一個分布式文件系統,并有幾個具體實現,如下表1-1所示。

表1-1 Hadoop的文件系統

文件系統

URI方案

Java實現

(org.apache.hadoop)

定義

Local

file

fs.LocalFileSystem

支持有客戶端校驗和本地文件系統。帶有校驗和的本地系統文件在fs.RawLocalFileSystem中實現。

HDFS

hdfs

hdfs.DistributionFileSystem

Hadoop的分布式文件系統。

HFTP

hftp

hdfs.HftpFileSystem

支持通過HTTP方式以只讀的方式訪問HDFS,distcp經常用在不同的HDFS集群間復制數據。

HSFTP

hsftp

hdfs.HsftpFileSystem

支持通過HTTPS方式以只讀的方式訪問HDFS。

HAR

har

fs.HarFileSystem

構建在Hadoop文件系統之上,對文件進行歸檔。Hadoop歸檔文件主要用來減少NameNode的內存使用。

KFS

kfs

fs.kfs.KosmosFileSystem

Cloudstore(其前身是Kosmos文件系統)文件系統是類似于HDFS和Google的GFS文件系統,使用C++編寫。

FTP

ftp

fs.ftp.FtpFileSystem

由FTP服務器支持的文件系統。

S3(本地)

s3n

fs.s3native.NativeS3FileSystem

基于Amazon S3的文件系統。

S3(基于塊)

s3 

fs.s3.NativeS3FileSystem

基于Amazon S3的文件系統,以塊格式存儲解決了S3的5GB文件大小的限制。

  Hadoop提供了許多文件系統的接口,用戶可以使用URI方案選取合適的文件系統來實現交互。

2、HDFS基礎概念

2.1 數據塊(block)

HDFS(Hadoop Distributed File System)默認的最基本的存儲單位是64M的數據塊。

和普通文件系統相同的是,HDFS中的文件是被分成64M一塊的數據塊存儲的。

不同于普通文件系統的是,HDFS中,如果一個文件小于一個數據塊的大小,并不占用整個數據塊存儲空間。

2.2 NameNode和DataNode

  HDFS體系結構中有兩類節點,一類是NameNode,又叫"元數據節點";另一類是DataNode,又叫"數據節點"。這兩類節點分別承擔Master和Worker具體任務的執行節點。

  1)元數據節點用來管理文件系統的命名空間

其將所有的文件和文件夾的元數據保存在一個文件系統樹中。

這些信息也會在硬盤上保存成以下文件:命名空間鏡像(namespace image)及修改日志(edit log)

其還保存了一個文件包括哪些數據塊,分布在哪些數據節點上。然而這些信息并不存儲在硬盤上,而是在系統啟動的時候從數據節點收集而成的。

  2)數據節點是文件系統中真正存儲數據的地方。

客戶端(client)或者元數據信息(namenode)可以向數據節點請求寫入或者讀出數據塊。

其周期性的向元數據節點回報其存儲的數據塊信息。

  3)從元數據節點(secondary namenode)

從元數據節點并不是元數據節點出現問題時候的備用節點,它和元數據節點負責不同的事情。

其主要功能就是周期性將元數據節點的命名空間鏡像文件和修改日志合并,以防日志文件過大。這點在下面會相信敘述。

合并過后的命名空間鏡像文件也在從元數據節點保存了一份,以防元數據節點失敗的時候,可以恢復。

2.3 元數據節點目錄結構

  

  VERSION文件是java properties文件,保存了HDFS的版本號。

layoutVersion是一個負整數,保存了HDFS的持續化在硬盤上的數據結構的格式版本號。

namespaceID是文件系統的唯一標識符,是在文件系統初次格式化時生成的。

cTime此處為0

storageType表示此文件夾中保存的是元數據節點的數據結構。

namespaceID=1232737062

cTime=0

storageType=NAME_NODE

layoutVersion=-18

2.4 數據節點的目錄結構

  

數據節點的VERSION文件格式如下:

namespaceID=1232737062

storageID=DS-1640411682-127.0.1.1-50010-1254997319480

cTime=0

storageType=DATA_NODE

layoutVersion=-18

blk_<id>保存的是HDFS的數據塊,其中保存了具體的二進制數據。
blk_<id>.meta保存的是數據塊的屬性信息:版本信息,類型信息,和checksum
當一個目錄中的數據塊到達一定數量的時候,則創建子文件夾來保存數據塊及數據塊屬性信息。

2.5 文件系統命名空間映像文件及修改日志

當文件系統客戶端(client)進行寫操作時,首先把它記錄在修改日志中(edit log)

元數據節點在內存中保存了文件系統的元數據信息。在記錄了修改日志后,元數據節點則修改內存中的數據結構。

每次的寫操作成功之前,修改日志都會同步(sync)到文件系統。

fsimage文件,也即命名空間映像文件,是內存中的元數據在硬盤上的checkpoint,它是一種序列化的格式,并不能夠在硬盤上直接修改。

同數據的機制相似,當元數據節點失敗時,則最新checkpoint的元數據信息從fsimage加載到內存中,然后逐一重新執行修改日志中的操作。

從元數據節點就是用來幫助元數據節點將內存中的元數據信息checkpoint到硬盤上的

checkpoint的過程如下:

從元數據節點通知元數據節點生成新的日志文件,以后的日志都寫到新的日志文件中。

從元數據節點用http get從元數據節點獲得fsimage文件及舊的日志文件。

從元數據節點將fsimage文件加載到內存中,并執行日志文件中的操作,然后生成新的fsimage文件。

從元數據節點獎新的fsimage文件用http post傳回元數據節點

元數據節點可以將舊的fsimage文件及舊的日志文件,換為新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,寫入此次checkpoint的時間。

這樣元數據節點中的fsimage文件保存了最新的checkpoint的元數據信息,日志文件也重新開始,不會變的很大了。

#p#

3、HDFS體系結構

  HDFS是一個主/從(Mater/Slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統一樣,可以通過目錄路徑對文件執行CRUD(Create、Read、Update和Delete)操作。但由于分布式存儲的性質,HDFS集群擁有一個NameNode和一些DataNode。NameNode管理文件系統的元數據,DataNode存儲實際的數據。客戶端通過同NameNode和DataNodes的交互訪問文件系統。客戶端聯系NameNode以獲取文件的元數據,而真正的文件I/O操作是直接和DataNode進行交互的。

圖3.1 HDFS總體結構示意圖

  1)NameNode、DataNode和Client

NameNode可以看作是分布式文件系統中的管理者,主要負責管理文件系統的命名空間、集群配置信息和存儲塊的復制等。NameNode會將文件系統的Meta-data存儲在內存中,這些信息主要包括了文件信息、每一個文件對應的文件塊的信息和每一個文件塊在DataNode的信息等。

DataNode是文件存儲的基本單元,它將Block存儲在本地文件系統中,保存了Block的Meta-data,同時周期性地將所有存在的Block信息發送給NameNode。

Client就是需要獲取分布式文件系統文件的應用程序。

  2)文件寫入

Client向NameNode發起文件寫入的請求。

NameNode根據文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。

Client將文件劃分為多個Block,根據DataNode的地址信息,按順序寫入到每一個DataNode塊中。

  3)文件讀取

Client向NameNode發起文件讀取的請求。

NameNode返回文件存儲的DataNode的信息。

Client讀取文件信息。

  HDFS典型的部署是在一個專門的機器上運行NameNode,集群中的其他機器各運行一個DataNode;也可以在運行NameNode的機器上同時運行DataNode,或者一臺機器上運行多個DataNode。一個集群只有一個NameNode的設計大大簡化了系統架構。

4、HDFS的優缺點

4.1 HDFS的優點

  1)處理超大文件

  這里的超大文件通常是指百MB、設置數百TB大小的文件。目前在實際應用中,HDFS已經能用來存儲管理PB級的數據了。

  2)流式的訪問數據

  HDFS的設計建立在更多地響應"一次寫入、多次讀寫"任務的基礎上。這意味著一個數據集一旦由數據源生成,就會被復制分發到不同的存儲節點中,然后響應各種各樣的數據分析任務請求。在多數情況下,分析任務都會涉及數據集中的大部分數據,也就是說,對HDFS來說,請求讀取整個數據集要比讀取一條記錄更加高效。

  3)運行于廉價的商用機器集群上

  Hadoop設計對硬件需求比較低,只須運行在低廉的商用硬件集群上,而無需昂貴的高可用性機器上。廉價的商用機也就意味著大型集群中出現節點故障情況的概率非常高。這就要求設計HDFS時要充分考慮數據的可靠性,安全性及高可用性。

4.2 HDFS的缺點

  1)不適合低延遲數據訪問

  如果要處理一些用戶要求時間比較短的低延遲應用請求,則HDFS不適合。HDFS是為了處理大型數據集分析任務的,主要是為達到高的數據吞吐量而設計的,這就可能要求以高延遲作為代價。

  改進策略:對于那些有低延時要求的應用程序,HBase是一個更好的選擇。通過上層數據管理項目來盡可能地彌補這個不足。在性能上有了很大的提升,它的口號就是goes real time。使用緩存或多master設計可以降低client的數據請求壓力,以減少延時。還有就是對HDFS系統內部的修改,這就得權衡大吞吐量與低延時了,HDFS不是萬能的銀彈。

  2)無法高效存儲大量小文件

  因為Namenode把文件系統的元數據放置在內存中,所以文件系統所能容納的文件數目是由Namenode的內存大小來決定。一般來說,每一個文件、文件夾和Block需要占據150字節左右的空間,所以,如果你有100萬個文件,每一個占據一個Block,你就至少需要300MB內存。當前來說,數百萬的文件還是可行的,當擴展到數十億時,對于當前的硬件水平來說就沒法實現了。還有一個問題就是,因為Map task的數量是由splits來決定的,所以用MR處理大量的小文件時,就會產生過多的Maptask,線程管理開銷將會增加作業時間。舉個例子,處理10000M的文件,若每個split為1M,那就會有10000個Maptasks,會有很大的線程開銷;若每個split為100M,則只有100個Maptasks,每個Maptask將會有更多的事情做,而線程的管理開銷也將減小很多。

  改進策略:要想讓HDFS能處理好小文件,有不少方法。

利用SequenceFile、MapFile、Har等方式歸檔小文件,這個方法的原理就是把小文件歸檔起來管理,HBase就是基于此的。對于這種方法,如果想找回原來的小文件內容,那就必須得知道與歸檔文件的映射關系。

橫向擴展,一個Hadoop集群能管理的小文件有限,那就把幾個Hadoop集群拖在一個虛擬服務器后面,形成一個大的Hadoop集群。google也是這么干過的。

多Master設計,這個作用顯而易見了。正在研發中的GFS II也要改為分布式多Master設計,還支持Master的Failover,而且Block大小改為1M,有意要調優處理小文件啊。

附帶個Alibaba DFS的設計,也是多Master設計,它把Metadata的映射存儲和管理分開了,由多個Metadata存儲節點和一個查詢Master節點組成。

  3)不支持多用戶寫入及任意修改文件

  在HDFS的一個文件中只有一個寫入者,而且寫操作只能在文件末尾完成,即只能執行追加操作。目前HDFS還不支持多個用戶對同一文件的寫操作,以及在文件任意位置進行修改。

#p#

5、HDFS常用操作

  先說一下"hadoop fs 和hadoop dfs的區別",看兩本Hadoop書上各有用到,但效果一樣,求證與網絡發現下面一解釋比較中肯。

  粗略的講,fs是個比較抽象的層面,在分布式環境中,fs就是dfs,但在本地環境中,fs是local file system,這個時候dfs就不能用。

5.1 文件操作

  1)列出HDFS文件

  此處為你展示如何通過"-ls"命令列出HDFS下的文件:

hadoop fs -ls

  執行結果如圖5-1-1所示。在這里需要注意:在HDFS中未帶參數的"-ls"命名沒有返回任何值,它默認返回HDFS的"home"目錄下的內容。在HDFS中,沒有當前目錄這樣一個概念,也沒有cd這個命令。

  

圖5-1-1 列出HDFS文件

  2)列出HDFS目錄下某個文檔中的文件

  此處為你展示如何通過"-ls 文件名"命令瀏覽HDFS下名為"input"的文檔中文件:

hadoop fs –ls input

  執行結果如圖5-1-2所示。

  

圖5-1-2 列出HDFS下名為input的文檔下的文件

  3)上傳文件到HDFS

  此處為你展示如何通過"-put 文件1 文件2"命令將"Master.Hadoop"機器下的"/home/hadoop"目錄下的file文件上傳到HDFS上并重命名為test:

hadoop fs –put ~/file test

  執行結果如圖5-1-3所示。在執行"-put"時只有兩種可能,即是執行成功和執行失敗。在上傳文件時,文件首先復制到DataNode上。只有所有的DataNode都成功接收完數據,文件上傳才是成功的。其他情況(如文件上傳終端等)對HDFS來說都是做了無用功。

  

圖5-1-3 成功上傳file到HDFS

  4)將HDFS中文件復制到本地系統中

  此處為你展示如何通過"-get 文件1 文件2"命令將HDFS中的"output"文件復制到本地系統并命名為"getout"。

hadoop fs –get output getout

  執行結果如圖5-1-4所示。

  

圖5-1-4 成功將HDFS中output文件復制到本地系統

  備注:與"-put"命令一樣,"-get"操作既可以操作文件,也可以操作目錄。

  5)刪除HDFS下的文檔

  此處為你展示如何通過"-rmr 文件"命令刪除HDFS下名為"newoutput"的文檔:

hadoop fs –rmr newoutput

  執行結果如圖5-1-5所示。

  

圖5-1-5 成功刪除HDFS下的newoutput文檔

  6)查看HDFS下某個文件

  此處為你展示如何通過"-cat 文件"命令查看HDFS下input文件中內容:

hadoop fs -cat input/*

  執行結果如圖5-1-6所示。

  

圖5-1-6 HDFS下input文件的內容

  "hadoop fs"的命令遠不止這些,本小節介紹的命令已可以在HDFS上完成大多數常規操作。對于其他操作,可以通過"-help commandName"命令所列出的清單來進一步學習與探索。

5.2 管理與更新

  1)報告HDFS的基本統計情況

  此處為你展示通過"-report"命令如何查看HDFS的基本統計信息:

hadoop dfsadmin -report

  執行結果如圖5-2-1所示。

  

圖5-2-1 HDFS基本統計信息

  2)退出安全模式

  NameNode在啟動時會自動進入安全模式。安全模式是NameNode的一種狀態,在這個階段,文件系統不允許有任何修改。安全模式的目的是在系統啟動時檢查各個DataNode上數據塊的有效性,同時根據策略對數據塊進行必要的復制或刪除,當數據塊最小百分比數滿足的最小副本數條件時,會自動退出安全模式。

  系統顯示"Name node is in safe mode",說明系統正處于安全模式,這時只需要等待17秒即可,也可以通過下面的命令退出安全模式:

hadoop dfsadmin –safemode enter

  成功退出安全模式結果如圖5-2-2所示。

  

圖5-2-2 成功退出安全模式

  3)進入安全模式

  在必要情況下,可以通過以下命令把HDFS置于安全模式:

hadoop dfsadmin –safemode enter

  執行結果如圖5-2-3所示。

  

圖5-2-3 進入HDFS安全模式

  4)添加節點

  可擴展性是HDFS的一個重要特性,向HDFS集群中添加節點是很容易實現的。添加一個新的DataNode節點,首先在新加節點上安裝好Hadoop,要和NameNode使用相同的配置(可以直接從NameNode復制),修改"/usr/hadoop/conf/master"文件,加入NameNode主機名。然后在NameNode節點上修改"/usr/hadoop/conf/slaves"文件,加入新節點主機名,再建立到新加點無密碼的SSH連接,運行啟動命令:

start-all.sh

  5)負載均衡

  HDFS的數據在各個DataNode中的分布肯能很不均勻,尤其是在DataNode節點出現故障或新增DataNode節點時。新增數據塊時NameNode對DataNode節點的選擇策略也有可能導致數據塊分布的不均勻。用戶可以使用命令重新平衡DataNode上的數據塊的分布:

start-balancer.sh

  執行命令前,DataNode節點上數據分布情況如圖5-2-4所示。

  

  負載均衡完畢后,DataNode節點上數據的分布情況如圖5-2-5所示。

  

  執行負載均衡命令如圖5-2-6所示。

  

6、HDFS API詳解

  Hadoop中關于文件操作類基本上全部是在"org.apache.hadoop.fs"包中,這些API能夠支持的操作包含:打開文件,讀寫文件,刪除文件等。

Hadoop類庫中最終面向用戶提供的接口類是FileSystem,該類是個抽象類,只能通過來類的get方法得到具體類。get方法存在幾個重載版本,常用的是這個:

static FileSystem get(Configuration conf);

  該類封裝了幾乎所有的文件操作,例如mkdir,delete等。綜上基本上可以得出操作文件的程序庫框架:

  1. operator() 
  2.     得到Configuration對象 
  3.     得到FileSystem對象 
  4.     進行文件操作 

6.1 上傳本地文件

  通過"FileSystem.copyFromLocalFile(Path src,Patch dst)"可將本地文件上傳到HDFS的制定位置上,其中src和dst均為文件的完整路徑。具體事例如下

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileStatus; 
  4. import org.apache.hadoop.fs.FileSystem; 
  5. import org.apache.hadoop.fs.Path; 
  6. public class CopyFile { 
  7.     public static void main(String[] args) throws Exception { 
  8.         Configuration conf=new Configuration(); 
  9.         FileSystem hdfs=FileSystem.get(conf); 
  10.          //本地文件 
  11.         Path src =new Path("D:\\HebutWinOS"); 
  12.         //HDFS為止 
  13.         Path dst =new Path("/"); 
  14.                hdfs.copyFromLocalFile(src, dst); 
  15.         System.out.println("Upload to"+conf.get("fs.default.name")); 
  16.         FileStatus files[]=hdfs.listStatus(dst); 
  17.         for(FileStatus file:files){ 
  18.             System.out.println(file.getPath()); 
  19.         } 
  20.     } 

  運行結果可以通過控制臺、項目瀏覽器和SecureCRT查看,如圖6-1-1、圖6-1-2、圖6-1-3所示。

  1)控制臺結果

  

圖6-1-1 運行結果(1)

  2)項目瀏覽器

  

圖6-1-2 運行結果(2)

  3)SecureCRT結果

  

圖6-1-3 運行結果(3)

6.2 創建HDFS文件

  通過"FileSystem.create(Path f)"可在HDFS上創建文件,其中f為文件的完整路徑。具體實現如下:

 

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FSDataOutputStream; 
  4. import org.apache.hadoop.fs.FileSystem; 
  5. import org.apache.hadoop.fs.Path; 
  6. public class CreateFile { 
  7.     public static void main(String[] args) throws Exception { 
  8.         Configuration conf=new Configuration(); 
  9.         FileSystem hdfs=FileSystem.get(conf); 
  10.         byte[] buff="hello hadoop world!\n".getBytes(); 
  11.         Path dfs=new Path("/test"); 
  12.         FSDataOutputStream outputStream=hdfs.create(dfs); 
  13.         outputStream.write(buff,0,buff.length); 
  14.     } 

  運行結果如圖6-2-1和圖6-2-2所示。

  1)項目瀏覽器

  

圖6-2-1 運行結果(1)

  2)SecureCRT結果

  

圖6-2-2 運行結果(2)

6.3 創建HDFS目錄

  通過"FileSystem.mkdirs(Path f)"可在HDFS上創建文件夾,其中f為文件夾的完整路徑。具體實現如下:

  1. package com.hebut.dir; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileSystem; 
  4. import org.apache.hadoop.fs.Path; 
  5. public class CreateDir { 
  6.     public static void main(String[] args) throws Exception{ 
  7.         Configuration conf=new Configuration(); 
  8.         FileSystem hdfs=FileSystem.get(conf); 
  9.         Path dfs=new Path("/TestDir"); 
  10.                hdfs.mkdirs(dfs); 
  11.     } 

  運行結果如圖6-3-1和圖6-3-2所示。

  1)項目瀏覽器

  

圖6-3-1 運行結果(1)

  2)SecureCRT結果

  

圖6-3-2 運行結果(2)

6.4 重命名HDFS文件

  通過"FileSystem.rename(Path src,Path dst)"可為指定的HDFS文件重命名,其中src和dst均為文件的完整路徑。具體實現如下:

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileSystem; 
  4. import org.apache.hadoop.fs.Path; 
  5. public class Rename{ 
  6.     public static void main(String[] args) throws Exception { 
  7.         Configuration conf=new Configuration(); 
  8.         FileSystem hdfs=FileSystem.get(conf); 
  9.         Path frpaht=new Path("/test");    //舊的文件名 
  10.         Path topath=new Path("/test1");    //新的文件名 
  11.         boolean isRename=hdfs.rename(frpaht, topath); 
  12.         String result=isRename?"成功":"失敗"
  13.         System.out.println("文件重命名結果為:"+result); 
  14.     } 

  運行結果如圖6-4-1和圖6-4-2所示。

  1)項目瀏覽器

  

圖6-4-1 運行結果(1)

    2)SecureCRT結果

  

圖6-4-2 運行結果(2)

6.5 刪除HDFS上的文件

  通過"FileSystem.delete(Path f,Boolean recursive)"可刪除指定的HDFS文件,其中f為需要刪除文件的完整路徑,recuresive用來確定是否進行遞歸刪除。具體實現如下

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileSystem; 
  4. import org.apache.hadoop.fs.Path; 
  5. public class DeleteFile { 
  6.     public static void main(String[] args) throws Exception { 
  7.         Configuration conf=new Configuration(); 
  8.         FileSystem hdfs=FileSystem.get(conf); 
  9.         Path delef=new Path("/test1"); 
  10.         boolean isDeleted=hdfs.delete(delef,false); 
  11.         //遞歸刪除 
  12.         //boolean isDeleted=hdfs.delete(delef,true); 
  13.         System.out.println("Delete?"+isDeleted); 
  14.     } 

  運行結果如圖6-5-1和圖6-5-2所示。

  1)控制臺結果

  

圖6-5-1 運行結果(1)

    2)項目瀏覽器

  

圖6-5-2 運行結果(2)

6.6 刪除HDFS上的目錄

  同刪除文件代碼一樣,只是換成刪除目錄路徑即可,如果目錄下有文件,要進行遞歸刪除。

6.7 查看某個HDFS文件是否存在

  通過"FileSystem.exists(Path f)"可查看指定HDFS文件是否存在,其中f為文件的完整路徑。具體實現如下:

 

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileSystem; 
  4. import org.apache.hadoop.fs.Path; 
  5. public class CheckFile { 
  6.     public static void main(String[] args) throws Exception { 
  7.         Configuration conf=new Configuration(); 
  8.         FileSystem hdfs=FileSystem.get(conf); 
  9.         Path findf=new Path("/test1"); 
  10.         boolean isExists=hdfs.exists(findf); 
  11.         System.out.println("Exist?"+isExists); 
  12.     } 

  運行結果如圖6-7-1和圖6-7-2所示。

  1)控制臺結果

  

圖6-7-1 運行結果(1)

  2)項目瀏覽器

  

圖6-7-2 運行結果(2)

6.8 查看HDFS文件的最后修改時間

  通過"FileSystem.getModificationTime()"可查看指定HDFS文件的修改時間。具體實現如下:

 

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileStatus; 
  4. import org.apache.hadoop.fs.FileSystem; 
  5. import org.apache.hadoop.fs.Path; 
  6. public class GetLTime { 
  7.     public static void main(String[] args) throws Exception { 
  8.         Configuration conf=new Configuration(); 
  9.         FileSystem hdfs=FileSystem.get(conf);    
  10.        Path fpath =new Path("/user/hadoop/test/file1.txt"); 
  11.         FileStatus fileStatus=hdfs.getFileStatus(fpath); 
  12.         long modiTime=fileStatus.getModificationTime(); 
  13.         System.out.println("file1.txt的修改時間是"+modiTime); 
  14.     } 

  運行結果如圖6-8-1所示。

  

圖6-8-1 控制臺結果

6.9 讀取HDFS某個目錄下的所有文件

  通過"FileStatus.getPath()"可查看指定HDFS中某個目錄下所有文件。具體實現如下:

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileStatus; 
  4. import org.apache.hadoop.fs.FileSystem; 
  5. import org.apache.hadoop.fs.Path; 
  6. public class ListAllFile { 
  7.     public static void main(String[] args) throws Exception { 
  8.         Configuration conf=new Configuration(); 
  9.         FileSystem hdfs=FileSystem.get(conf); 
  10.         Path listf =new Path("/user/hadoop/test"); 
  11.         FileStatus stats[]=hdfs.listStatus(listf); 
  12.         for(int i = 0; i < stats.length; ++i) 
  13.      { 
  14.        System.out.println(stats[i].getPath().toString()); 
  15.      } 
  16.         hdfs.close(); 
  17.     } 

  運行結果如圖6-9-1和圖6-9-2所示。

  1)控制臺結果

  

圖6-9-1 運行結果(1)

  2)項目瀏覽器

  

圖6-9-2 運行結果(2)

6.10 查找某個文件在HDFS集群的位置

  通過"FileSystem.getFileBlockLocation(FileStatus file,long start,long len)"可查找指定文件在HDFS集群上的位置,其中file為文件的完整路徑,start和len來標識查找文件的路徑。具體實現如下:

 

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.BlockLocation; 
  4. import org.apache.hadoop.fs.FileStatus; 
  5. import org.apache.hadoop.fs.FileSystem; 
  6. import org.apache.hadoop.fs.Path; 
  7. public class FileLoc { 
  8.     public static void main(String[] args) throws Exception { 
  9.         Configuration conf=new Configuration(); 
  10.         FileSystem hdfs=FileSystem.get(conf); 
  11.         Path fpath=new Path("/user/hadoop/cygwin"); 
  12.         FileStatus filestatus = hdfs.getFileStatus(fpath); 
  13.         BlockLocation[] blkLocations = hdfs.getFileBlockLocations(filestatus, 0, filestatus.getLen()); 
  14.         int blockLen = blkLocations.length; 
  15.         for(int i=0;i<blockLen;i++){ 
  16.             String[] hosts = blkLocations[i].getHosts(); 
  17.             System.out.println("block_"+i+"_location:"+hosts[0]); 
  18.         } 
  19.     } 

  運行結果如圖6-10-1和6.10.2所示。

  1)控制臺結果

  

圖6-10-1 運行結果(1)

  2)項目瀏覽器

  

圖6-10-2 運行結果(2)

6.11 獲取HDFS集群上所有節點名稱信息

  通過"DatanodeInfo.getHostName()"可獲取HDFS集群上的所有節點名稱。具體實現如下:

 

  1. package com.hebut.file; 
  2. import org.apache.hadoop.conf.Configuration; 
  3. import org.apache.hadoop.fs.FileSystem; 
  4. import org.apache.hadoop.hdfs.DistributedFileSystem; 
  5. import org.apache.hadoop.hdfs.protocol.DatanodeInfo; 
  6. public class GetList { 
  7.     public static void main(String[] args) throws Exception { 
  8.         Configuration conf=new Configuration(); 
  9.         FileSystem fs=FileSystem.get(conf); 
  10.         DistributedFileSystem hdfs = (DistributedFileSystem)fs; 
  11.         DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();        
  12.         for(int i=0;i<dataNodeStats.length;i++){ 
  13.  System.out.println("DataNode_"+i+"_Name:"+dataNodeStats[i].getHostName()); 
  14.         } 
  15.     } 

  運行結果如圖6-11-1所示。

  

圖6-11-1 控制臺結果

7、HDFS的讀寫數據流

7.1 文件的讀取剖析

  

  文件讀取的過程如下:

  1)解釋一

  • 客戶端(client)用FileSystem的open()函數打開文件。

  • DistributedFileSystem用RPC調用元數據節點,得到文件的數據塊信息。

  • 對于每一個數據塊,元數據節點返回保存數據塊的數據節點的地址。

  • DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數據。

  • 客戶端調用stream的read()函數開始讀取數據。

  • DFSInputStream連接保存此文件第一個數據塊的最近的數據節點。

  • Data從數據節點讀到客戶端(client)。

  • 當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的連接,然后連接此文件下一個數據塊的最近的數據節點。

  • 當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。

  • 在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。

  • 失敗的數據節點將被記錄,以后不再連接。

  2)解釋二

  • 使用HDFS提供的客戶端開發庫,向遠程的Namenode發起RPC請求;

  • Namenode會視情況返回文件的部分或者全部block列表,對于每個block,Namenode都會返回有該block拷貝的datanode地址;

  • 客戶端開發庫會選取離客戶端最接近的datanode來讀取block;

  • 讀取完當前block的數據后,關閉與當前的datanode連接,并為讀取下一個block尋找最佳的datanode;

  • 當讀完列表的block后,且文件讀取還沒有結束,客戶端開發庫會繼續向Namenode獲取下一批的block列表。

  • 讀取完一個block都會進行checksum驗證,如果讀取datanode時出現錯誤,客戶端會通知Namenode,然后再從下一個擁有該block拷貝的datanode繼續讀。

7.2 文件的寫入剖析

  

  寫入文件的過程比讀取較為復雜:

  1)解釋一

  • 客戶端調用create()來創建文件

  • DistributedFileSystem用RPC調用元數據節點,在文件系統的命名空間中創建一個新的文件。

  • 元數據節點首先確定文件原來不存在,并且客戶端有創建文件的權限,然后創建新文件。

  • DistributedFileSystem返回DFSOutputStream,客戶端用于寫數據。

  • 客戶端開始寫入數據,DFSOutputStream將數據分成塊,寫入data queue。

  • Data queue由Data Streamer讀取,并通知元數據節點分配數據節點,用來存儲數據塊(每塊默認復制3塊)。分配的數據節點放在一個pipeline里。

  • Data Streamer將數據塊寫入pipeline中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。

  • DFSOutputStream為發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。

  • 如果數據節點在寫入的過程中失敗:

    • 關閉pipeline,將ack queue中的數據塊放入data queue的開始。

    • 當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啟后能夠察覺其數據塊是過時的,會被刪除。

    • 失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點。

    • 元數據節點則被通知此數據塊是復制塊數不足,將來會再創建第三份備份。

  • 當客戶端結束寫入數據,則調用stream的close函數。此操作將所有的數據塊寫入pipeline中的數據節點,并等待ack queue返回成功。最后通知元數據節點寫入完畢。

  2)解釋二

  • 使用HDFS提供的客戶端開發庫,向遠程的Namenode發起RPC請求;

  • Namenode會檢查要創建的文件是否已經存在,創建者是否有權限進行操作,成功則會為文件創建一個記錄,否則會讓客戶端拋出異常;

  • 當客戶端開始寫入文件的時候,開發庫會將文件切分成多個packets,并在內部以"data queue"的形式管理這些packets,并向Namenode申請新的blocks,獲取用來存儲replicas的合適的datanodes列表,列表的大小根據在Namenode中對replication的設置而定。

  • 開始以pipeline(管道)的形式將packet寫入所有的replicas中。開發庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲之后,再將其傳遞給在此pipeline中的下一個datanode,直到最后一個datanode,這種寫數據的方式呈流水線的形式。

  • 最后一個datanode成功存儲之后會返回一個ack packet,在pipeline里傳遞至客戶端,在客戶端的開發庫內部維護著"ack queue",成功收到datanode返回的ack packet后會從"ack queue"移除相應的packet。

  • 如果傳輸過程中,有某個datanode出現了故障,那么當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除,剩余的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持replicas設定的數量。

責任編輯:彭凡 來源: 博客園
相關推薦

2012-06-20 09:19:19

Hadoop集群

2012-06-25 10:30:06

Hadoop集群

2012-06-29 10:58:27

Hadoop集群

2012-07-03 08:37:24

Hadoop集群

2012-06-13 09:56:53

2012-06-19 15:51:22

集群系列2

2012-06-19 09:28:33

Hadoop集群

2010-06-03 12:57:06

Hadoop

2012-08-22 15:25:43

Linux集群

2010-04-22 14:19:21

LVS負載均衡集群

2013-04-23 11:17:47

Hadoop

2024-11-13 15:18:51

JITWatch開發

2012-09-06 14:54:58

Linux集群

2010-09-29 10:16:02

Linux集群虛擬化

2009-06-29 12:37:21

linux

2011-01-14 15:32:17

2009-05-05 13:56:59

五舟intel四核

2010-05-07 14:15:06

集群系統負載均衡

2010-06-03 15:13:34

Hadoop Hdfs

2011-12-07 16:11:50

Hadoop集群搭建
點贊
收藏

51CTO技術棧公眾號

91精品免费视频| 自拍偷拍亚洲在线| 国产不卡一区二区视频| 欧美熟妇交换久久久久久分类| 亚洲性感美女99在线| 日韩亚洲欧美成人一区| 福利视频一二区| 免费黄色在线视频网站| 九色综合狠狠综合久久| 欧美激情在线狂野欧美精品| 日本黄色录像片| 欧美xnxx| 亚洲午夜在线电影| 日本最新一区二区三区视频观看| 91精品人妻一区二区三区果冻| 欧美视频福利| 在线观看欧美日韩| jjzzjjzz欧美69巨大| 99riav视频一区二区| 亚洲韩国精品一区| 亚洲精品二区| 天天干,天天操,天天射| 久久se精品一区二区| 欧美亚洲日本黄色| 三级影片在线看| 九九视频免费观看视频精品| 欧美高清视频在线高清观看mv色露露十八 | 久久久久久福利| av亚洲在线观看| 亚洲第一中文字幕| 在线免费看v片| 成人爽a毛片免费啪啪| 亚洲综合清纯丝袜自拍| 亚洲一区二区三区午夜| 三级理论午夜在线观看| 成人午夜在线免费| 91天堂在线视频| www.亚洲激情| 久久精品电影| 91精品国产91久久久久福利| 久久久久久蜜桃| 亚洲91中文字幕无线码三区| 最近中文字幕2019免费| 久久精品国产亚洲av久| 欧美电影在线观看免费| 精品福利一二区| 欧美色图校园春色| 深夜日韩欧美| 欧美人与性动xxxx| mm131国产精品| 国产成人福利夜色影视| 欧美日韩国产中字| 九九九九免费视频| 国产资源在线观看入口av| 亚洲综合一区二区三区| 日韩精品福利片午夜免费观看| 欧美成人精品一区二区男人看| 欧美激情一区二区三区不卡 | 欧美永久精品| 欧美xxxx18性欧美| 九九九久久久久| 一区在线视频| 欧美一区在线直播| 国产99免费视频| 美日韩一级片在线观看| 国产欧美精品一区二区| 一级黄在线观看| 精品亚洲国内自在自线福利| 91日韩在线视频| www.天堂在线| 9久草视频在线视频精品| 国产一区二区三区黄| 天堂中文在线资| 国产欧美精品一区二区色综合 | 日韩一区二区免费视频| 成人啪啪18免费游戏链接| 美国成人xxx| 亚洲色图校园春色| 国产视频123区| 国产精品99久久| 精品国产一区二区三区四区在线观看 | 日韩 欧美 视频| 高清精品在线| 亚洲专区一二三| 亚洲熟女乱色一区二区三区| 美脚恋feet久草欧美| 91久久线看在观草草青青| 粉嫩虎白女毛片人体| av久久网站| 欧美一区二区大片| 少妇被狂c下部羞羞漫画| 欧美激情影院| 国产午夜精品一区二区三区| 岛国片在线免费观看| 午夜国产欧美理论在线播放| 久久久久这里只有精品| 日韩av在线播放观看| 美女网站久久| 成人乱色短篇合集| 人妻精品无码一区二区| 日本一二三不卡| 最近看过的日韩成人| 色爱综合区网| 色婷婷综合久久久中文一区二区| 性生生活大片免费看视频| 日韩三级不卡| 国产一区二区三区网站| 久久国产精品国语对白| 夜夜爽av福利精品导航| 国产精品美女免费| 精品国产99久久久久久宅男i| 北条麻妃国产九九精品视频| 日本一区二区三区视频在线播放 | 国产精品视频观看| 伊人久久在线观看| 亚洲www免费| 日韩免费看网站| 蜜桃av乱码一区二区三区| 日本黄色精品| 97高清免费视频| 国产又黄又大又粗的视频| 不卡的av网站| 超碰在线免费观看97| 色黄视频在线观看| 日韩一二三区视频| 极品久久久久久久| 99热在线精品观看| 国产成人精品免费视频大全最热| 成人在线观看网站| 午夜在线成人av| 91看片破解版| 欧洲美女日日| 日本中文字幕成人| 天天干天天插天天操| 中文字幕一区二区三区色视频| av免费中文字幕| 成人资源在线| 欧美成aaa人片免费看| 少妇久久久久久久| 久久综合国产精品| 亚洲精品蜜桃久久久久久| 日韩成人综合网| 亚洲精品美女视频| 800av免费在线观看| 国产成人福利片| 日本老太婆做爰视频| 久久电影天堂| 在线免费看av不卡| 手机看片久久久| 99这里只有久久精品视频| 久久久久久www| 国产一区调教| 久久免费国产视频| 亚洲av无码乱码国产麻豆| 成人免费一区二区三区在线观看| 人人爽人人av| 精品产国自在拍| 91tv亚洲精品香蕉国产一区7ujn| 五月婷婷狠狠干| 一区二区三区中文字幕精品精品| 小早川怜子一区二区三区| 欧美黄色录像片| 国产色婷婷国产综合在线理论片a| 国产视频二区在线观看| 欧美亚洲自拍偷拍| 日韩av片在线免费观看| 久热成人在线视频| 中文精品一区二区三区| 四虎国产精品免费久久| www.久久久久| japanese国产| 亚洲国产欧美另类丝袜| 妖精视频一区二区| 亚洲一区二区成人| 免费在线国产精品| 性欧美freehd18| 日韩在线激情视频| av老司机久久| 亚洲一级不卡视频| 欧美狂猛xxxxx乱大交3| 日韩综合在线视频| 一区不卡字幕| 日韩成人在线观看视频| 久久久久久久成人| 深夜福利视频在线观看| 色94色欧美sute亚洲线路一ni| 中文字幕资源站| 国产宾馆实践打屁股91| 欧美国产亚洲一区| 日韩精品一区二区三区免费观影| 91免费精品视频| 国产蜜臀在线| 自拍偷拍亚洲在线| 黄色成人一级片| 91精品福利视频| 成人免费视频网站入口::| 不卡视频一二三| www.xxx亚洲| 欧美精品播放| 久久综合中文色婷婷| 国内自拍亚洲| 97激碰免费视频| 69视频在线观看| 精品国产网站在线观看| 欧美黑人一区二区| 中文字幕日韩一区| 天堂www中文在线资源| 日韩av中文在线观看| 中国一级大黄大黄大色毛片| 欧美重口另类| 国产精品极品在线| 欧美在线极品| 久久久www成人免费精品张筱雨| 乱精品一区字幕二区| 欧美在线|欧美| 日韩三级一区二区三区| 国产精品蜜臀av| 欧美做受喷浆在线观看| 韩国欧美国产一区| a√天堂在线观看| 人成免费电影一二三区在线观看| 麻豆精品少妇| 国产一区深夜福利| 黄频免费在线观看| 久久久91精品| 国产精品四虎| 亚洲第一精品夜夜躁人人爽| 在线视频1卡二卡三卡| 欧美日韩国产色视频| 青娱乐国产在线| 欧美激情一区在线| 性久久久久久久久久| 高清成人在线观看| 免费看污污网站| 免费一级欧美片在线观看| 黄色一级在线视频| 欧美日韩ab| 日本三级福利片| 精品一区二区三| 蜜桃成人免费视频| 亚洲区小说区图片区qvod按摩| 91亚色免费| 曰本一区二区| 国产女人18毛片水18精品| 最新欧美电影| 国内精品小视频| jizz一区二区三区| 欧美第一黄网免费网站| а天堂中文在线官网| 日韩在线观看免费高清| 1024免费在线视频| 波霸ol色综合久久| 欧美猛烈性xbxbxbxb| 有码中文亚洲精品| 国产福利电影在线| 亚洲欧美在线看| 午夜视频免费在线| 亚洲欧美国产精品va在线观看| 日本精品一二区| 精品精品国产高清a毛片牛牛| 国内老熟妇对白xxxxhd| 日韩美女视频在线| 亚洲国产精品久久久久爰性色| 欧美精品一区二区蜜臀亚洲| 亚洲国产成人一区二区| 欧美精品一区二区三区四区| 欧美在线精品一区二区三区| 亚洲福利视频在线| 国产黄色一区二区| 亚洲精品一区二区在线| 伦理片一区二区三区| 亚洲片在线观看| av大片在线播放| 日韩在线不卡视频| sm捆绑调教国产免费网站在线观看| 高清视频欧美一级| 中文在线免费视频| 国产精品成人一区二区| 日韩护士脚交太爽了| 成人黄色在线观看| 91成人噜噜噜在线播放| 精品人伦一区二区三区| 蜜臀av免费一区二区三区| 日韩av一区二区三区美女毛片| 欧美色图一区| 9色porny| 鲁大师影院一区二区三区| 久久九九国产视频| 国产在线国偷精品免费看| 美女露出粉嫩尿囗让男人桶| 国产日韩影视精品| а天堂中文在线资源| 亚洲精品视频在线看| 国产精品第一页在线观看| 日本高清无吗v一区| 亚洲视频在线观看一区二区| 欧美精品一区二区三区视频| 电影av一区| 欧美激情xxxx| 日韩在线观看不卡| 国产欧美在线看| 亚洲人成网www| 日韩精品一区二区三区电影| 国产亚洲精品久久久久婷婷瑜伽| 男人插女人下面免费视频| 久久精品国产免费看久久精品| 国产精品久久久免费观看| 亚洲国产精品成人久久综合一区| 久草网站在线观看| 日韩欧美主播在线| av一级黄色片| 亚洲美女激情视频| 中文av资源在线| 国产精品扒开腿做爽爽爽视频 | 欧美中文字幕在线观看| 四虎成人精品一区二区免费网站| av日韩中文字幕| 欧美日韩一二三四| 国产素人在线观看| 激情综合网最新| 欧美无人区码suv| 亚洲最大成人综合| 91国产精品一区| 精品调教chinesegay| av网站在线免费看推荐| 国产欧美日韩视频| 要久久爱电视剧全集完整观看| 男人的天堂视频在线| 裸体在线国模精品偷拍| 亚洲第一视频区| 精品成人久久av| 北条麻妃一二三区| zzjj国产精品一区二区| 亚洲美女尤物影院| 九九九九九九精品| 欧美色综合网| 久久久九九九热| 国产精品妹子av| 国产又粗又黄又爽视频| 亚洲性视频网址| 97成人资源| 鲁丝一区二区三区免费| 国产精品最新自拍| 国产精品一区二区无码对白| 亚洲黄网站在线观看| 国产又粗又长又大视频| 精品视频在线播放免| 女生影院久久| 欧美另类视频在线| 久久激情网站| 久久精品老司机| 色噜噜偷拍精品综合在线| 三级黄视频在线观看| 午夜精品久久17c| 国产精品网址| 久久久久久久久久久久久国产| 国产福利91精品| 美国黄色小视频| 精品国产sm最大网站| av毛片在线| 国产日产欧美a一级在线| 亚洲日本三级| 日韩一级在线免费观看| 99久久er热在这里只有精品66| 中国一级免费毛片| 亚洲老头老太hd| 成人做爰视频www网站小优视频| 欧美二区三区在线| 美洲天堂一区二卡三卡四卡视频| 国产又粗又猛又爽又黄的视频四季 | 宅男在线国产精品| 免费观看成人高潮| 亚洲最大福利视频网站| 亚洲午夜av| 国产ts丝袜人妖系列视频| 天天av天天翘天天综合网| 搞黄视频在线观看| 成人激情视频小说免费下载| 中文字幕免费一区二区三区| 欧美一级大片免费看| 色综合 综合色| av亚洲在线| 亚洲一区二区三区在线免费观看| 欧美黄在线观看| 李宗瑞91在线正在播放| 欧美日韩另类一区| 在线观看h网| 麻豆久久久av免费| 韩国欧美一区二区| 国产成人无码精品亚洲| 亚洲欧洲午夜一线一品| 日韩毛片网站| 免费在线a视频| 1024国产精品| 少妇高潮久久久| 国产精品成人aaaaa网站| 欧美特黄一级| 精品成人无码一区二区三区| 91精品国产高清一区二区三区 | 国产欧美日韩另类一区|