摘要:用來管理文件系統(tǒng)的命名空間,其將所有的文件和文件夾的元數(shù)據(jù)保存在一個(gè)文件系統(tǒng)樹中。文件系統(tǒng)鏡像元數(shù)據(jù)鏡像文件。其周期性的向元數(shù)據(jù)節(jié)點(diǎn)回報(bào)其存儲(chǔ)的數(shù)據(jù)塊信息。
Hadoop分布式文件系統(tǒng)(hadoopdistributed filesystem,HDFS)。HDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。HDFS可以實(shí)現(xiàn)流的形式訪問(streaming access)文件系統(tǒng)中的數(shù)據(jù)。
它是基于流數(shù)據(jù)模式的訪問和處理超大文件。(分布式最大的好處就是其通透性,雖然分布存在不同的datanode上面,但是感覺在一臺(tái)電腦的本地進(jìn)行操作)。
特點(diǎn):
錯(cuò)誤檢測(cè)和快速、自動(dòng)的恢復(fù)是 HDFS的核心架構(gòu)目標(biāo)
HDFS 以支持大數(shù)據(jù)集合為目標(biāo),一個(gè)存儲(chǔ)在上面的典型文件大小一般都在千兆至 T字節(jié),一個(gè)單一 HDFS實(shí)例應(yīng)該能支撐數(shù)以千萬計(jì)的文件。
主從架構(gòu)。
文件采用write-one-read-many訪問模型(一次寫,多次讀,不可更新已有內(nèi)容,但如果需要追加,需要將hdfs-site.xml中的dfs.support.append屬性設(shè)置為true)
跑在 HDFS上的應(yīng)用與一般的應(yīng)用不同,它們主要是以流式讀為主,做批量處理;比之關(guān)注數(shù)據(jù)訪問的低延遲問題,更關(guān)鍵的在于數(shù)據(jù)訪問的高吞吐量。
HDFS的限制:
適用于一次寫入、多次查詢的情況,不支持并發(fā)寫情況,小文件不合適。因?yàn)樾∥募舱加靡粋€(gè)塊,小文件越多(如100000個(gè)1k文件)塊越 多,NameNode壓力越大。
如果要處理一些用戶要求時(shí)間比較短的低延遲應(yīng)用請(qǐng)求,則HDFS不適合。HDFS是為了處理大型數(shù)據(jù)集分析任務(wù)的,主要是為達(dá)到高的數(shù)據(jù)吞吐量而設(shè)計(jì)的,這就可能要求以高延遲作為代價(jià)。
HDFS架構(gòu)一個(gè)HDFS集群是有一個(gè) Namenode和一定數(shù)目的 Datanode組成。 Namenode是一個(gè)中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的 namespace和客戶端對(duì)文件的訪問。 Datanode在集群中一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理節(jié)點(diǎn)上它們附帶的存儲(chǔ)。在內(nèi)部,一個(gè)文件其實(shí)分成一個(gè)或多個(gè) block,這些 block存儲(chǔ)在 Datanode集合里。 Namenode執(zhí)行文件系統(tǒng)的 namespace操作,例如打開、關(guān)閉、重命名文件和目錄,同時(shí)決定 block到具體 Datanode節(jié)點(diǎn)的映射。 Datanode在 Namenode的指揮下進(jìn)行 block的創(chuàng)建、刪除和復(fù)制。
namenode用來管理文件系統(tǒng)的命名空間,其將所有的文件和文件夾的元數(shù)據(jù)保存在一個(gè)文件系統(tǒng)樹中。這些信息也會(huì)在硬盤上保存成以下文件:命名空間鏡像 (namespace image)及修改日志 (edit log) 。其還保存了一個(gè)文件包括哪些數(shù)據(jù)塊,分布在哪些數(shù)據(jù)節(jié)點(diǎn)上。
1、NameNode 是master節(jié)點(diǎn),NameNode的作用是 管理文件目錄結(jié)構(gòu),接受用戶的操作請(qǐng)求,是管理數(shù)據(jù)節(jié)點(diǎn)的。名字節(jié)點(diǎn)維護(hù)兩套數(shù)據(jù), 一套 是文件 目錄與數(shù)據(jù)塊之間的關(guān)系 , 另一套 是 數(shù)據(jù)塊與節(jié)點(diǎn)之間的關(guān)系 。 前一套 數(shù)據(jù)是 靜態(tài)的 ,是存放在磁盤上的, 通過fsimage和edits文件來維護(hù) ; 后一套 數(shù)據(jù)是 動(dòng)態(tài)的 ,不持久放到到磁盤的,每當(dāng)集群?jiǎn)?dòng)的時(shí)候,會(huì)自動(dòng)建立這些信息,所以一般都放在內(nèi)存中。
fsimage (文件系統(tǒng)鏡像):元數(shù)據(jù)鏡像文件。存儲(chǔ)某一時(shí)段NameNode內(nèi)存 元數(shù)據(jù)信息。
edits: 操作日志文件。
fstime: 保存最近一次checkpoint的時(shí)間
2、SecondaryNameNode
HA的一個(gè)解決方案。但不支持熱備。由于數(shù)據(jù)操作越多edits文件膨脹越大,但不能讓他無限的膨脹下去,所以要把日志過程轉(zhuǎn)換出來 放到fsimage中。由于NameNode要接受用戶的操作請(qǐng)求,必須能夠快速響應(yīng)用戶請(qǐng)求,為了保證NameNode的快速響應(yīng)給用戶,所以將此項(xiàng)工 作交給了 SecondaryNode ,它從NameNode上 下載元數(shù)據(jù)信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并將其推送到NameNode,同時(shí)重置NameNode的edits
3、DataNode 是HDFS中真正存儲(chǔ)數(shù)據(jù)的。按Block存儲(chǔ)(每個(gè)block大小64M)。
客戶端(client)或者元數(shù)據(jù)信息(namenode)可以向數(shù)據(jù)節(jié)點(diǎn)請(qǐng)求寫入或者讀出數(shù)據(jù)塊。
其周期性的向元數(shù)據(jù)節(jié)點(diǎn)回報(bào)其存儲(chǔ)的數(shù)據(jù)塊信息。
數(shù)據(jù)流1、讀數(shù)據(jù)
客戶端(client)用 FileSystem的 open()函數(shù)打開文件,DistributedFileSystem用RPC調(diào)namenode,得到文件的數(shù)據(jù)塊信息。
對(duì)于每一個(gè)數(shù)據(jù)塊,namenode返回保存數(shù)據(jù)塊的數(shù)據(jù)節(jié)點(diǎn)的地址。DistributedFileSystem返回FSDataInputStream 給客戶端,用來讀取數(shù)據(jù)??蛻舳苏{(diào)用 stream的 read()函數(shù)開始讀取數(shù)據(jù)。DFSInputStream連接保存此文件第一個(gè)數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點(diǎn)。Data從數(shù)據(jù)節(jié)點(diǎn)讀到客戶端 (client),當(dāng)此數(shù)據(jù)塊讀取完畢時(shí), DFSInputStream關(guān)閉和此數(shù)據(jù)節(jié)點(diǎn)的連接,然后連接此文件下一個(gè)數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點(diǎn)。
當(dāng)客戶端讀取完畢數(shù)據(jù)的時(shí)候,調(diào)用 FSDataInputStream的 close函數(shù)。在讀取數(shù)據(jù)的過程中,如果客戶端在與數(shù)據(jù)節(jié)點(diǎn)通信出現(xiàn)錯(cuò)誤,則嘗試連接包含此數(shù)據(jù)塊的下一個(gè)數(shù)據(jù)節(jié)點(diǎn)。失敗的數(shù)據(jù)節(jié)點(diǎn)將被記錄,以后不再連接。
2、寫數(shù)據(jù)
客戶端調(diào)用 create()來創(chuàng)建文件,DistributedFileSystem 用RPC 調(diào)用namenode,在文件系統(tǒng)的命名空間中創(chuàng)建一個(gè)新的文件。
namenode首先確定文件原來不存在,并且客戶端有創(chuàng)建文件的權(quán)限,然后創(chuàng)建新文件。DistributedFileSystem 返回DFSOutputStream ,客戶端用于寫數(shù)據(jù)??蛻舳碎_始寫入數(shù)據(jù), DFSOutputStream將數(shù)據(jù)分成塊,寫入 data queue。Data queue 由Data Streamer讀取,并通知namenode分配數(shù)據(jù)節(jié)點(diǎn),用來存儲(chǔ)數(shù)據(jù)塊 (每塊默認(rèn)復(fù)制 3份,也就是說1T數(shù)據(jù)需要3T存儲(chǔ)空間 )。
分配的數(shù)據(jù)節(jié)點(diǎn)放在一個(gè) pipeline里。 Data Streamer 將數(shù)據(jù)塊寫入pipeline 中的第一個(gè)數(shù)據(jù)節(jié)點(diǎn)。第一個(gè)數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)塊發(fā)送給第二個(gè)數(shù)據(jù)節(jié)點(diǎn)。第二個(gè)數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)發(fā)送給第三個(gè)數(shù)據(jù)節(jié)點(diǎn)。DFSOutputStream 為發(fā)出去的數(shù)據(jù)塊保存了 ack queue,等待 pipeline中的數(shù)據(jù)節(jié)點(diǎn)告知數(shù)據(jù)已經(jīng)寫入成功。當(dāng)客戶端結(jié)束寫入數(shù)據(jù),則調(diào)用 stream的 close函數(shù)。此操作將所有的數(shù)據(jù)塊寫入 pipeline中的數(shù)據(jù)節(jié)點(diǎn),并等待 ack queue返回成功。最后通知namenode寫入完畢。 如下圖:
3、文件復(fù)制
副本的存放是 HDFS可靠性和性能的關(guān)鍵。 HDFS采用一種稱為 rack-aware的策略來改進(jìn)數(shù)據(jù)的可靠性、有效性和網(wǎng)絡(luò)帶寬的利用。
1、數(shù)據(jù)在HDFS上存儲(chǔ)的基本單位是Block,默認(rèn)大小64M;
2、數(shù)據(jù)在Client和DataNode之間傳輸數(shù)據(jù)的基本單位是Packet,默認(rèn)最大為65557B;
3、數(shù)據(jù)傳輸Pipeline,宏觀上看是Block Pipeline,但是微觀上其實(shí)是Packet Pipeline。
HDFS命令行:支持的操作:
創(chuàng)建 復(fù)制 移動(dòng) 和刪除文件.
實(shí)現(xiàn)管理職責(zé) - chmod, chown, chgrp.
設(shè)置復(fù)制文件的比率
使用Head, tail, cat查看文件
支持的全部命令說明見:http://hadoop.apache.org/docs...
DFSShell
??HDFS允許用戶數(shù)據(jù)組織成文件和文件夾的方式,它提供一個(gè)叫DFSShell的接口,使用戶可以和HDFS中的數(shù)據(jù)交互。
hadoop fs|dfs -[args] 例如:列出HDFS指定目錄下的文件: hadoop fs -ls HDFS路徑(稱為資源)使用URI格式來表示:scheme://authority/path scheme協(xié)議名:file或hdfs;authority:NameNode主機(jī)名+端口號(hào);path:文件路徑 hadoop fs -ls hdfs://winstar:9000/user/root 如果在core-site.xml中有如下配置,則直接使用/user/root(路徑)即可。即hadoop fs -ls /user/root HDFS默認(rèn)工作目錄為/user/$USER,$USER表示當(dāng)前賬戶的用戶名。 fs.default.name hdfs://winstar:9000
常用的命令示例
在user/目錄下創(chuàng)建trunk子目錄: hadoop fs -mkdir /user/trunk 列出user/目錄下所有文件和子目錄: hadoop fs -ls /user 遞歸列出user/目錄下所有文件和子目錄 hadoop fs -lsr /user 將本地目錄下test.txt文件上傳至HDFS當(dāng)前目錄 hadoop fs -put test.txt . 將HDFS/user/root/test.txt文件下載至本地當(dāng)前目錄 hadoop fs -get /user/root/test.txt 查看/user/root/test.txt文件內(nèi)容 hadoop fs -cat /user/root/test.txt 查看/user/root/test.txt文件的尾部?jī)?nèi)容(最后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類:該類的對(duì)象封裝了配置信息,這些配置信息來自core-*.xml;
FileSystem類:文件系統(tǒng)類,可使用該類的方法對(duì)文件/目錄進(jìn)行操作。一般通過FileSystem的靜態(tài)方法get獲得一個(gè)文件系統(tǒng)對(duì)象;
FSDataInputStream和FSDataOutputStream類:HDFS中的輸入輸出流。分別通過FileSystem的open方法和create方法獲得。
操作文件程序的基本步驟
得到Configuration對(duì)象
得到FileSystem對(duì)象
進(jìn)行文件操作
將本地文件上傳到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();
刪除文件/目錄, 當(dāng)刪除對(duì)象為目錄時(shí),將第二個(gè)參數(shù)設(shè)為true否則將產(chǎn)生異常
Path dfs = new Path("hdfs://localhost:9001/home/test.txt"); System.out.println(fs.delete(dfs,true)); fs.close();
創(chuàng)建目錄
Path dfs = new Path("hdfs://localhost:9001/home1/"); System.out.println(fs.mkdirs(dfs)); fs.close();
在HDFS上創(chuàng)建文件,并寫入
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()); }
追加文件內(nèi)容,注:需要將hdfs-site.xml中的dfs.support.append屬性設(shè)置為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...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67297.html
摘要:輸入和接收器輸入代表從某種流式數(shù)據(jù)源流入的數(shù)據(jù)流。文件數(shù)據(jù)流可以從任何兼容包括等的文件系統(tǒng),創(chuàng)建方式如下將監(jiān)視該目錄,并處理該目錄下任何新建的文件目前還不支持嵌套目錄。會(huì)被一個(gè)個(gè)依次推入隊(duì)列,而則會(huì)依次以數(shù)據(jù)流形式處理這些的數(shù)據(jù)。 特點(diǎn): Spark Streaming能夠?qū)崿F(xiàn)對(duì)實(shí)時(shí)數(shù)據(jù)流的流式處理,并具有很好的可擴(kuò)展性、高吞吐量和容錯(cuò)性。 Spark Streaming支持從多種數(shù)...
摘要:項(xiàng)目地址前言大數(shù)據(jù)技術(shù)棧思維導(dǎo)圖大數(shù)據(jù)常用軟件安裝指南一分布式文件存儲(chǔ)系統(tǒng)分布式計(jì)算框架集群資源管理器單機(jī)偽集群環(huán)境搭建集群環(huán)境搭建常用命令的使用基于搭建高可用集群二簡(jiǎn)介及核心概念環(huán)境下的安裝部署和命令行的基本使用常用操作分區(qū)表和分桶表視圖 項(xiàng)目GitHub地址:https://github.com/heibaiying... 前 言 大數(shù)據(jù)技術(shù)棧思維導(dǎo)圖 大數(shù)據(jù)常用軟件安裝指...
摘要:同時(shí)集成了機(jī)器學(xué)習(xí)類庫。基于計(jì)算框架,將的分布式計(jì)算應(yīng)用到機(jī)器學(xué)習(xí)領(lǐng)域。提供了一個(gè)簡(jiǎn)單的聲明方法指定機(jī)器學(xué)習(xí)任務(wù),并且動(dòng)態(tài)地選擇最優(yōu)的學(xué)習(xí)算法。宣稱其性能是的多倍。 介紹 spark是分布式并行數(shù)據(jù)處理框架 與mapreduce的區(qū)別: mapreduce通常將中間結(jié)果放在hdfs上,spark是基于內(nèi)存并行大數(shù)據(jù)框架,中間結(jié)果放在內(nèi)存,對(duì)于迭代數(shù)據(jù)spark效率更高,mapred...
摘要:原文鏈接簡(jiǎn)介寫在前面本系列是綜合了自己在學(xué)習(xí)過程中的理解記錄對(duì)參考文章中的一些理解個(gè)人實(shí)踐過程中的一些心得而來。其次,本系列是基于目前最新的系列開始的,目前的更新速度很快,記錄一下版本好還是必要的。 原文鏈接:『 Spark 』1. spark 簡(jiǎn)介 寫在前面 本系列是綜合了自己在學(xué)習(xí)spark過程中的理解記錄 + 對(duì)參考文章中的一些理解 + 個(gè)人實(shí)踐spark過程中的一些心得而來。寫...
閱讀 2146·2021-11-18 10:07
閱讀 3530·2021-09-04 16:48
閱讀 3227·2019-08-30 15:53
閱讀 1250·2019-08-30 12:55
閱讀 2467·2019-08-29 15:08
閱讀 3167·2019-08-29 15:04
閱讀 2893·2019-08-29 14:21
閱讀 2919·2019-08-29 11:21