摘要:用來管理文件系統的命名空間,其將所有的文件和文件夾的元數據保存在一個文件系統樹中。文件系統鏡像元數據鏡像文件。其周期性的向元數據節點回報其存儲的數據塊信息。
Hadoop分布式文件系統(hadoopdistributed filesystem,HDFS)。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS可以實現流的形式訪問(streaming access)文件系統中的數據。
它是基于流數據模式的訪問和處理超大文件。(分布式最大的好處就是其通透性,雖然分布存在不同的datanode上面,但是感覺在一臺電腦的本地進行操作)。
特點:
錯誤檢測和快速、自動的恢復是 HDFS的核心架構目標
HDFS 以支持大數據集合為目標,一個存儲在上面的典型文件大小一般都在千兆至 T字節,一個單一 HDFS實例應該能支撐數以千萬計的文件。
主從架構。
文件采用write-one-read-many訪問模型(一次寫,多次讀,不可更新已有內容,但如果需要追加,需要將hdfs-site.xml中的dfs.support.append屬性設置為true)
跑在 HDFS上的應用與一般的應用不同,它們主要是以流式讀為主,做批量處理;比之關注數據訪問的低延遲問題,更關鍵的在于數據訪問的高吞吐量。
HDFS的限制:
適用于一次寫入、多次查詢的情況,不支持并發寫情況,小文件不合適。因為小文件也占用一個塊,小文件越多(如100000個1k文件)塊越 多,NameNode壓力越大。
如果要處理一些用戶要求時間比較短的低延遲應用請求,則HDFS不適合。HDFS是為了處理大型數據集分析任務的,主要是為達到高的數據吞吐量而設計的,這就可能要求以高延遲作為代價。
HDFS架構一個HDFS集群是有一個 Namenode和一定數目的 Datanode組成。 Namenode是一個中心服務器,負責管理文件系統的 namespace和客戶端對文件的訪問。 Datanode在集群中一般是一個節點一個,負責管理節點上它們附帶的存儲。在內部,一個文件其實分成一個或多個 block,這些 block存儲在 Datanode集合里。 Namenode執行文件系統的 namespace操作,例如打開、關閉、重命名文件和目錄,同時決定 block到具體 Datanode節點的映射。 Datanode在 Namenode的指揮下進行 block的創建、刪除和復制。
namenode用來管理文件系統的命名空間,其將所有的文件和文件夾的元數據保存在一個文件系統樹中。這些信息也會在硬盤上保存成以下文件:命名空間鏡像 (namespace image)及修改日志 (edit log) 。其還保存了一個文件包括哪些數據塊,分布在哪些數據節點上。
1、NameNode 是master節點,NameNode的作用是 管理文件目錄結構,接受用戶的操作請求,是管理數據節點的。名字節點維護兩套數據, 一套 是文件 目錄與數據塊之間的關系 , 另一套 是 數據塊與節點之間的關系 。 前一套 數據是 靜態的 ,是存放在磁盤上的, 通過fsimage和edits文件來維護 ; 后一套 數據是 動態的 ,不持久放到到磁盤的,每當集群啟動的時候,會自動建立這些信息,所以一般都放在內存中。
fsimage (文件系統鏡像):元數據鏡像文件。存儲某一時段NameNode內存 元數據信息。
edits: 操作日志文件。
fstime: 保存最近一次checkpoint的時間
2、SecondaryNameNode
HA的一個解決方案。但不支持熱備。由于數據操作越多edits文件膨脹越大,但不能讓他無限的膨脹下去,所以要把日志過程轉換出來 放到fsimage中。由于NameNode要接受用戶的操作請求,必須能夠快速響應用戶請求,為了保證NameNode的快速響應給用戶,所以將此項工 作交給了 SecondaryNode ,它從NameNode上 下載元數據信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并將其推送到NameNode,同時重置NameNode的edits
3、DataNode 是HDFS中真正存儲數據的。按Block存儲(每個block大小64M)。
客戶端(client)或者元數據信息(namenode)可以向數據節點請求寫入或者讀出數據塊。
其周期性的向元數據節點回報其存儲的數據塊信息。
數據流1、讀數據
客戶端(client)用 FileSystem的 open()函數打開文件,DistributedFileSystem用RPC調namenode,得到文件的數據塊信息。
對于每一個數據塊,namenode返回保存數據塊的數據節點的地址。DistributedFileSystem返回FSDataInputStream 給客戶端,用來讀取數據??蛻舳苏{用 stream的 read()函數開始讀取數據。DFSInputStream連接保存此文件第一個數據塊的最近的數據節點。Data從數據節點讀到客戶端 (client),當此數據塊讀取完畢時, DFSInputStream關閉和此數據節點的連接,然后連接此文件下一個數據塊的最近的數據節點。
當客戶端讀取完畢數據的時候,調用 FSDataInputStream的 close函數。在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。失敗的數據節點將被記錄,以后不再連接。
2、寫數據
客戶端調用 create()來創建文件,DistributedFileSystem 用RPC 調用namenode,在文件系統的命名空間中創建一個新的文件。
namenode首先確定文件原來不存在,并且客戶端有創建文件的權限,然后創建新文件。DistributedFileSystem 返回DFSOutputStream ,客戶端用于寫數據??蛻舳碎_始寫入數據, DFSOutputStream將數據分成塊,寫入 data queue。Data queue 由Data Streamer讀取,并通知namenode分配數據節點,用來存儲數據塊 (每塊默認復制 3份,也就是說1T數據需要3T存儲空間 )。
分配的數據節點放在一個 pipeline里。 Data Streamer 將數據塊寫入pipeline 中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。DFSOutputStream 為發出去的數據塊保存了 ack queue,等待 pipeline中的數據節點告知數據已經寫入成功。當客戶端結束寫入數據,則調用 stream的 close函數。此操作將所有的數據塊寫入 pipeline中的數據節點,并等待 ack queue返回成功。最后通知namenode寫入完畢。 如下圖:
3、文件復制
副本的存放是 HDFS可靠性和性能的關鍵。 HDFS采用一種稱為 rack-aware的策略來改進數據的可靠性、有效性和網絡帶寬的利用。
1、數據在HDFS上存儲的基本單位是Block,默認大小64M;
2、數據在Client和DataNode之間傳輸數據的基本單位是Packet,默認最大為65557B;
3、數據傳輸Pipeline,宏觀上看是Block Pipeline,但是微觀上其實是Packet Pipeline。
HDFS命令行:支持的操作:
創建 復制 移動 和刪除文件.
實現管理職責 - chmod, chown, chgrp.
設置復制文件的比率
使用Head, tail, cat查看文件
支持的全部命令說明見:http://hadoop.apache.org/docs...
DFSShell
??HDFS允許用戶數據組織成文件和文件夾的方式,它提供一個叫DFSShell的接口,使用戶可以和HDFS中的數據交互。
hadoop fs|dfs -[args] 例如:列出HDFS指定目錄下的文件: hadoop fs -ls HDFS路徑(稱為資源)使用URI格式來表示:scheme://authority/path scheme協議名:file或hdfs;authority:NameNode主機名+端口號;path:文件路徑 hadoop fs -ls hdfs://winstar:9000/user/root 如果在core-site.xml中有如下配置,則直接使用/user/root(路徑)即可。即hadoop fs -ls /user/root HDFS默認工作目錄為/user/$USER,$USER表示當前賬戶的用戶名。 fs.default.name hdfs://winstar:9000
常用的命令示例
在user/目錄下創建trunk子目錄: hadoop fs -mkdir /user/trunk 列出user/目錄下所有文件和子目錄: hadoop fs -ls /user 遞歸列出user/目錄下所有文件和子目錄 hadoop fs -lsr /user 將本地目錄下test.txt文件上傳至HDFS當前目錄 hadoop fs -put test.txt . 將HDFS/user/root/test.txt文件下載至本地當前目錄 hadoop fs -get /user/root/test.txt 查看/user/root/test.txt文件內容 hadoop fs -cat /user/root/test.txt 查看/user/root/test.txt文件的尾部內容(最后1K) hadoop fs -tail /user/root/test.txt 刪除/user/root/test.txt文件 hadoop fs -rm /user/root/test.txt 查看ls命令的幫助文檔 hadoop fs -help ls使用Java API訪問HDFS
APIDOC: http://hadoop.apache.org/docs...
Configuration類:該類的對象封裝了配置信息,這些配置信息來自core-*.xml;
FileSystem類:文件系統類,可使用該類的方法對文件/目錄進行操作。一般通過FileSystem的靜態方法get獲得一個文件系統對象;
FSDataInputStream和FSDataOutputStream類:HDFS中的輸入輸出流。分別通過FileSystem的open方法和create方法獲得。
操作文件程序的基本步驟
得到Configuration對象
得到FileSystem對象
進行文件操作
將本地文件上傳到HDFS
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; public class CopyFromLocal { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9001"); FileSystem fs = FileSystem.get(conf); Path src = new Path("/usr/local/hadoop-2.7.2/README.txt"); Path dst = new Path("hdfs://localhost:9001/home/"); fs.copyFromLocalFile(src, dst); System.out.println("upload to "+conf.get("fs.default.name")); fs.close(); } }
將HDFS上的文件傳回到本地
Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9001"); FileSystem fs = FileSystem.get(conf); Path src = new Path("hdfs://localhost:9001/home/README.txt"); Path dst = new Path("/home/hadoop/Desktop/"); fs.copyToLocalFile(src, dst); fs.close();
刪除文件/目錄, 當刪除對象為目錄時,將第二個參數設為true否則將產生異常
Path dfs = new Path("hdfs://localhost:9001/home/test.txt"); System.out.println(fs.delete(dfs,true)); fs.close();
創建目錄
Path dfs = new Path("hdfs://localhost:9001/home1/"); System.out.println(fs.mkdirs(dfs)); fs.close();
在HDFS上創建文件,并寫入
Path dfs = new Path("hdfs://localhost:9001/home/test.txt"); FSDataOutputStream outputStream = fs.create(dfs); byte[] buff = "hello world!".getBytes(); outputStream.write(buff,0, buff.length); outputStream.close(); fs.close();
讀取文件
Path dst = new Path("hdfs://localhost:9001/home/test.txt"); if(fs.exists(dst) && !fs.isDirectory(dst)) { FSDataInputStream is = fs.open(dst); FileStatus stat = fs.getFileStatus(dst); byte[] buffer = new byte[(int) stat.getLen()]; is.read(buffer); System.out.println(new String(buffer)); is.close(); fs.close(); } else { throw new Exception("fail to read file "+dst.toString()); }
追加文件內容,注:需要將hdfs-site.xml中的dfs.support.append屬性設置為true
dfs.support.append true
Configuration conf = new Configuration(); //conf.setBoolean( "dfs.support.append", true ); FileSystem fs = FileSystem.get(conf); Path dfs = new Path("hdfs://localhost:9001/home/test.txt"); FSDataOutputStream outputStream = fs.append(dfs); byte[] buff = "test".getBytes(); outputStream.write(buff); outputStream.close(); fs.close();參考:
http://hadoop.apache.org/docs...
http://blog.csdn.net/xman_200...
http://www.jdon.com/bigdata/h...
http://www.cnblogs.com/davidw...
http://www.cnblogs.com/laov/p...
https://my.oschina.net/crxy/b...
http://blog.csdn.net/fanxiaob...
http://www.cnblogs.com/finalb...
http://blog.csdn.net/yew1eb/a...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67297.html
摘要:輸入和接收器輸入代表從某種流式數據源流入的數據流。文件數據流可以從任何兼容包括等的文件系統,創建方式如下將監視該目錄,并處理該目錄下任何新建的文件目前還不支持嵌套目錄。會被一個個依次推入隊列,而則會依次以數據流形式處理這些的數據。 特點: Spark Streaming能夠實現對實時數據流的流式處理,并具有很好的可擴展性、高吞吐量和容錯性。 Spark Streaming支持從多種數...
摘要:項目地址前言大數據技術棧思維導圖大數據常用軟件安裝指南一分布式文件存儲系統分布式計算框架集群資源管理器單機偽集群環境搭建集群環境搭建常用命令的使用基于搭建高可用集群二簡介及核心概念環境下的安裝部署和命令行的基本使用常用操作分區表和分桶表視圖 項目GitHub地址:https://github.com/heibaiying... 前 言 大數據技術棧思維導圖 大數據常用軟件安裝指...
摘要:同時集成了機器學習類庫?;谟嬎憧蚣?,將的分布式計算應用到機器學習領域。提供了一個簡單的聲明方法指定機器學習任務,并且動態地選擇最優的學習算法。宣稱其性能是的多倍。 介紹 spark是分布式并行數據處理框架 與mapreduce的區別: mapreduce通常將中間結果放在hdfs上,spark是基于內存并行大數據框架,中間結果放在內存,對于迭代數據spark效率更高,mapred...
摘要:原文鏈接簡介寫在前面本系列是綜合了自己在學習過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。其次,本系列是基于目前最新的系列開始的,目前的更新速度很快,記錄一下版本好還是必要的。 原文鏈接:『 Spark 』1. spark 簡介 寫在前面 本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫...
閱讀 2130·2021-11-18 10:07
閱讀 3507·2021-09-04 16:48
閱讀 3214·2019-08-30 15:53
閱讀 1235·2019-08-30 12:55
閱讀 2453·2019-08-29 15:08
閱讀 3149·2019-08-29 15:04
閱讀 2879·2019-08-29 14:21
閱讀 2906·2019-08-29 11:21