Hadoop技術內幕-Hadoop檔案系統
第5章 Hadoop 檔案系統
1.檔案及檔案系統
檔案的本質是儲存在裝置上的線性位元組流
檔案系統用於檔案的管理包括檔案的結構以及命名、存取、使用、保護和實現
檔案系統支援的系統呼叫:
1) 建立檔案
2) 刪除檔案
3) 開啟檔案
4) 關閉檔案
5) 讀檔案
6) 寫檔案
7) 追加資料
8) 讀記錄
9) 寫記錄
10) 刪除記錄
11) 移動當前位置
12) 獲取檔案屬性
13) 設定檔案屬性
14) 檔案改名
目錄樹組織檔案系統,路徑名描述檔案系統中檔案的位置,用/隔開
檔案系統管理目錄的系統呼叫:
1) 建立目錄
2) 刪除目錄
3) 開啟目錄
4) 關閉目錄
5) 讀目錄
6) 目錄改名
Unix檔案系統操作:
1) 載入檔案系統(mount)
2) 解除安裝檔案系統
檔案系統的實現
1) 塊管理:以隨機儲存裝置為例,有三種方式實現塊管理
1.1) 連續分配:類似於陣列,需要預先知道塊大小
1.2) 連結表:順序讀取方便但隨機儲存效率低
1.3) 索引鏈式表:需要把整個連結串列存放在記憶體中
2) 目錄管理:目錄資料由結構化的記錄組成,每個記錄描述了集合中的一個檔案或者子目錄
3) 儲存媒體上的檔案系統管理
4) 儲存空間管理
儲存控制驗證模組:
1) 審定使用者的儲存許可權
2) 比較使用者許可權與本次存取要求是否一致
3) 將存取要求和被訪問檔案的保密性比較,看是否有衝突
驗證使用者存取操作:
1) 口令
2) 密碼(加密)
3) 存取控制矩陣
4) 存取控制表+許可權表
2. Linux檔案系統(Ext2,Ext3)
ext2_inode{//檔案和目錄的元資料
i_mode;//檔案型別和訪問許可權
i_uid;//擁有者識別符號
i_size;//以位元組為單位的檔案長度
i_atime;//最後一次訪問檔案時間
i_ctime;//索引節點最後改變時間
i_dtime;//檔案刪除時間
i_gid;//使用者組識別符號
i_links_count;//硬連結計數器
i_block;//檔案的資料塊數
i_flags;//檔案標識
}
檔案管理器查詢特定檔案過程:(/home/cq/test.txt)
1) 尋找根目錄對應的i-node(2號i-node),在2號i-node中找到塊編號
2) 在塊編號中找到home對應的目錄項得到i-node 8,在i-node 8上找到塊編號132
3) 塊132上找到cq的目錄項對應的i-node 30,在i-node 30上找到塊編號406
4) 塊406上找到test.txt的目錄項對應的i-node 92,即得到了text.txt的元資料
2.1 虛擬檔案系統(VFS)
面向物件的思維發展起來,在核心中的軟體層,為上層應用提供檔案系統介面,並隱藏了底層檔案系統的具體實現細節,應用程式對檔案系統進行操作時,核心檔案系統首先呼叫VFS的相應介面函式,處理與檔案系統無關的操作,然後再呼叫真正的檔案系統中的函式處理與裝置相關的操作
2.2 Linux檔案保護機制
檔案的使用者分為:擁有者,使用者組,其他
檔案的讀、寫和執行許可權:r,w,x
目錄的讀、寫和執行許可權:r(讀取資料夾內容列表),w(修改目錄的內容包括建立檔案或者資料夾,刪除檔案或者資料夾,對已存在的檔案或者資料夾改名和更改目錄內檔案或者資料夾的位置)w(可執行)即可以進入目錄
2.3 Linux檔案系統API
檔案I/O函式:open(),read(),write(),close()和lssek()
檔案/目錄函式:stat(),chmod(),chown(),utime
目錄樹的操作:opendir(),readdir(),seekdir(),closedir()
程序工作目錄操作:getcwd(),getwd(),chdir
3. 分散式檔案系統
特性:
1) 訪問透明性
2) 位置透明性
3) 移動透明性
4) 效能透明性
5) 伸縮透明性
6) 複製透明性
7) 故障透明性
8) 併發透明性
9) 資料完整性、安全性和系統異構
典型的分散式檔案系統NFS(C/S模型),與Linux所提供的檔案系統模型一致:檔案解釋為位元組序列,目錄樹組織,檔案有檔名,通過類似Linux檔案控制代碼訪問
4. Java檔案系統(java.io.File)
4.1 檔案系統API
File file=new File(“”);//建立檔案物件
file.exists();//判斷檔案是否存在
file.isDirectory();//判斷是否為目錄
file.isFile();//判斷是否為檔案
file.createNewFile();建立該檔案
file.mkdir();;//建立目錄
file.list();//獲得該目錄下的所有檔名的陣列
file.delete();//刪除檔案或者目錄
file.deleteOnExit();//虛擬機器一旦退出就刪除
file.renameTo();//修改檔名(移動檔案)
file.canRead();//是否可讀
file.getCannonicalFile();返回包含檔案規範路徑(絕對路徑)的File物件
String currentdir=System.getProperty(“user.dir”);//返回使用者程序的當前工作目錄
UnixFileSystem or Win32FileSystem->FileSystem->File
FileSystem封裝了具體檔案系統的實現細節,即不關心底層檔案系統是Unix還是Win32,比如file.renameTo()實際上進行一定的安全檢查之後通過FileSystem fs靜態成員變數呼叫rename()實現檔案的重新命名
4.2 URI和URL
file.toURI();//將檔案物件轉化為對應的URI(統一資源識別符號)
絕對URI由URI模式和模式特有部分組成
URI uri=new URI(String str);
常用的模式包括:
1) 本地磁碟檔案:”file:/E:/”
3) 檔案傳輸伺服器:”ftp://user1:[email protected]:80/hadoopInternal/chart2.pdf“
4) 電子郵件地址:“mailto:[email protected]”
5) 基於Telnet協議的服務連線
6) Hadoop中的hdfs,har,s3,kfs等標識不同資源
兩種型別的URI:
1) URL(統一資源定位符)
2) URN(統一資源名)
URL基本格式:
協議://使用者資訊@主機名:埠/路徑?查詢#片段
URL url=new URL(String str); //建立一個指向Internet上的實際資源的URL
InputStream is=url.openStream();//用於讀取遠端資源
隨機存取檔案
RandomAccessFile raf=new RandomAccessFile(pathor file,mode);//第一個引數既可以是檔案路徑又可以是檔案物件,mode則標識檔案可執行的操作r(只讀)、wr(讀寫)
raf.getFilePointer();//返回檔案指標位置
raf.seek(long pos);;//檔案指標設定在pos位元組位置
5. Hadoop抽象檔案系統(org.apache.hadoop.fs.FileSystem)
5.1 Hadoop抽象檔案系統的基本API:
1) FileSystem.open();
FileSystem.create();
FileSystem.append();//開啟檔案
2) FSDataInputStream.read();//讀取檔案內容
3) FSDataOutputSream.write();//寫檔案
4) FSDataInputStream.close();
FSDataOutputStream.close();//關閉檔案
5) FSDataInputStream.seek();//改變檔案讀寫位置
6) FSDataInputStream.getPos();//返回檔案的當前讀寫位置
7) FileSystem.getFileStatus();//獲取檔案/目錄屬性,包括檔案路徑path,檔案長度length,是否為目錄isdir,副本數block——replication,塊大小blocksize,最後修改時間modification_time,最後訪問時間access_time,許可資訊permission,檔案所有者owner,使用者組group
8) FileSystem.createNewFile();//建立檔案
9) FileSystem.delete();//刪除檔案
10) FileSystem.rename();//重新命名檔案
11) FileSystem.mkdirs();//建立目錄
12) FileSystem.listStatus;//讀取目錄下的專案
13) FileSystem.getWorkingDirectory();//返回當前工作目錄
14) FileSystem.setWorkingDirectory();//設定當前工作目錄
15) FileSystem.setReplication();//設定檔案副本
16) FileSystem.getReplication();//返回檔案副本
17) FileSystem.getContentSummary();//相當於du、df命令提供的功能
5.2 Hadoop輸入/輸出流
FSDataInputStream繼承於jdk中的DataInputStream,實現了Seekable、PositionedReadable、java.io.Closeable
Seekable.seekToNewSource();//選擇其他副本
PositionedReadable().readFully();//讀取指定長度的資料,直至緩衝區滿或者流結束為止
FSDataOutputStream繼承於DataOutputStream,PositionCache是前者的內部類且是前者的子類,過載了write()跟蹤目前流的寫位置。;實現了Syncable介面(唯一函式sync()目的是將流中的資料同步到裝置中)
5.3 Hadoop檔案系統中的許可權
類似於Linux檔案系統許可權管理
public enum FsAction{
NONE(“---”),
EXECUTE(“--x),
WRITE(“-w-“_),
WRITE_EXECUTE(“-wx”),
READ(“r—“),
READ_EXECUTE(“r-x”),
READ_WRITE(“rw-“),
ALL(“rwx”)
}
FsAction.ordinal();//返回當前序數
FsAction.implies();//比較一種許可權是否隱含另一種許可權
public class FsPermission implementsWritable {//檔案許可權類
//POSIX permission style
private FsAction useraction = null;
private FsAction groupaction = null;
private FsAction otheraction = null;
}
public class PermissionStatus implementsWritable {//相對於FsPermission而言多包含使用者username和使用者組資訊groupname
private String username;
private String groupname;
private FsPermissionpermission;
}
public class FileStatus implementsWritable, Comparable {//檔案元資訊
private Path path;
private long length;
private boolean isdir;
private short block_replication;
private long blocksize;
private long modification_time;
private long access_time;
private FsPermission permission;//檔案許可權
private String owner;
private String group;
private Path symlink;
}
5.4 抽象檔案系統中的靜態方法
FileSystem.get(uri,conf);//類似於工廠模式,建立或者返回uri指定的檔案系統
FileSystem.getLocal(conf);//返回本地檔案系統
CACHE.Key{
Scheme;//URI 模式
Authority;//URI authority
Unique;//unique預設0
Ugi;//ugi本地使用者資訊
}
FileSystem.get(uri,conf);//只有uri與Cache.Key中所有屬性值相同,才允許共享檔案系統例項(即直接Cache.get(uri,conf)從快取中獲取檔案系統)
當需要建立一個被Cache管理且不被共享的具體檔案系統時,FileSystem.CACHE.getUnique(uri,conf);
FileSystem.newInstance();//得到的檔案系統例項永遠不會被共享
5.5 Hadoop檔案系統中的協議處理器
如何通過URL順利開啟一個特定URL模式的輸入/輸出流,包括協議處理和內容處理兩部分
協議處理涉及C/S互動;內容處理則涉及將協議處理過程中獲得的內容進行展現
Hadoop檔案系統中協議處理包括FsUrlStreamHandler,FsUrlConnection,FsUrlStreamHandlerFactory
Hadoop協議處理的過程:
URL url=new URL(“hdfs://example:port/”)->URL.setURLStreamHandlerFactory(newFsUrlStreamHandlerFactory())//接收hdfs協議並尋找適當的URLStreamHandler->FsUrlStreamHandler//建立hdfs的流處理器物件並儲存在URL物件的內部成員中->流處理器物件解析URL字串,創建於伺服器通訊的FsUrlConnection->url.openStream()實際上是FsUrlConnection.getInputStream()
5.6 Hadoop具體檔案系統
FileSystem->FilterFileSystem->ChecksumFileSystem->ChecksumDistributedFileSystem,InmemoryFileSystem,LocalFileSystem
ChecksumFileSystem為檔案儲存對應的校驗資訊檔案,並在讀檔案時進行校驗
FileSystem->FilterFileSystem->HarFileSystem
HarFileSystem將小檔案歸檔成大檔案,使得構建於Hadoop MapReduce的應用可以訪問Hadoop歸檔檔案,處理大量小檔案輸入
Hadoop的具體檔案系統
檔案系統 |
URI模式 |
實現 |
描述 |
本地 |
file |
fs.LocalFileSystem fs.RawLocalFileSystem |
前者支援資料校驗 後者不支援 |
HDFS |
hdfs |
hdfs.DistributedFileSystem |
Hadoop分散式檔案系統 |
HFTP |
hftp |
hdfs.HftpFileSystem |
HDFS叢集間複製資料 |
HSFTP |
hsftp |
hdfs.HsftpFileSystem |
安全性更高 |
HAR |
har |
fs.HarFileSystem |
存檔檔案系統 |
KFS |
kfs |
fs.kfs.KosmosFileSystem |
分散式檔案系統 |
FTP |
hdfs |
fs.ftp.FTPFileSystem |
FTP協議支援的檔案系統 |
簡單S3 |
s3n |
fs.s3native.NativeS3FileSystem |
讀寫存放在S3上的資料 |
本地S3 |
s3 |
fs.s3.S3FileSystem |
由S3支援的檔案系統 |
記憶體 |
ramfs |
fs.RawInMemoryFileSystem fs.InMemoryFileSystem |
記憶體檔案系統 |
5.7 RawLocalFileSystem
mkdirs(Path path);//遞迴建立目錄,實質上呼叫了java.io.File.mkdir()
listStatus(Path path);//若path對應的是檔案,則直接建立包含該檔案元資訊的RawLocalFileStatus元素陣列;否則獲得該目錄下的所有檔案和子目錄的元資訊的RawLocalFileStatus元素陣列
讀寫檔案:
LocalFSFileInputStream和LocalFSFileOutputStream
LocalFSFileInputStream.seek(long pos);//移動檔案當前位置
LocalFSFileInputStream.getPos();//當前讀寫檔案位置
修飾器模式
5.8 ChecksumFileSystem的實現
在ChecksumFileSystem中,如果有檔案”example.txt”那麼該檔案的CRC-32校驗資訊儲存在檔案”.example.txt.crc”中
ChecksumFileSystem.getChecksumFile(Pathfile);//返回對應的校驗檔案
ChecksumFileSystem.isChecksumFile(Path file);//判斷是否為校驗檔案
ChecksumFileSystem.rename(Path src,Path dst);//若src為目錄,則直接改名;若src是檔案則先對src改名,然後對src對應的校驗檔案改名
寫檔案
ChecksumFSOutputSummer實現資料檔案和校驗資訊檔案的輸出,繼承自org.apache.hadoop.fs.FSOutputSummer
ChecksumFSOutputSummer(ChecksumFileSystemfs,Path file,Boolean overwrite,int bufferSize,short replication,longblockSize,Progressable progress);//構造方法建立兩個輸出流,分別用於輸出檔案資料和輸出檔案資料的校驗和
FSOutputSummer.write()呼叫write1(0->呼叫writeChecksumChunk()->呼叫writeChunk()寫入檔案資料和檔案資料校驗和
讀檔案
ChecksumFSInputChecker繼承自FSInputChecker
ChecksumFSInputChecker()//構造方法,開啟輸入流datas和sums,還需要進行一系列的檢查和配置
FSInputChecker.read()呼叫read1()->呼叫readChecksumChunk()->呼叫readChunk()讀入原始資料和校驗資料->呼叫verifySum()進行資料校驗
5.9 RawInMemoryFileSystem的實現
RawInMemoryFileSystem是InMemoryFileSystem的內部類,繼承自FileSystem
基本屬性:
fsSize:檔案系統預留空間
totalUsed:目前已使用空間
Map<String,FileAttributes> tempFileAttribs;//已為檔案預留空間或者正在寫資料的檔案
Map<String,FileAttributes>pathToFileAttribs;//檔案正常關閉
RawInMemoryFileSystem.open(Path path,intbufferSize);//返回FSDataInputStream物件呼叫read()便可以讀資料
相關推薦
Hadoop技術內幕-Hadoop檔案系統
第5章 Hadoop 檔案系統 1.檔案及檔案系統 檔案的本質是儲存在裝置上的線性位元組流 檔案系統用於檔案的管理包括檔案的結構以及命名、存取、使用、保護和實現 檔案系統支援的系統呼叫: 1) 建立檔案 2) 刪除檔案 3) 開啟檔案 4) 關閉檔案 5) 讀檔案 6) 寫
《Hadoop技術內幕:深入解析Hadoop和HDFS》2.1配置檔案簡介
2.1 配置檔案簡介 配置檔案是一個靈活系統不可缺少的一部分,雖然配置檔案非常重要,但卻沒有標準。 本節我們來了解 Windows 作業系統和 Java 環境中的配置檔案。 2.1.1 Windows 作業系統的配置檔案 Windows 系統廣泛使用一種特殊化的 AS
hadoop[4]-hdfs分散式檔案系統的基本工作機制
一、Namenode 和 Datanode HDFS採用master/slave架構。一個HDFS叢集是由一個Namenode和一定數目的Datanodes組成。Namenode是一箇中心伺服器,負責管理檔案系統的名字空間(namespace)以及客戶端對檔案的訪問。叢集中的Datanode一般是一個節點一
大資料-Hadoop-HDFS(分散式檔案系統)環境搭建
1:Hadoop三大核心元件 A:分散式檔案系統HDFS B:分散式資源排程器 C:分散式計算框架MapReduce 2:HDFS簡介: HDFS架構:HDFS採用Master/Slave架構 即:一個Master(NameNode)對應多個Slave(DataNode)
【Hadoop】HDFS分散式檔案系統
HDFS分散式檔案系統 HDFS基本知識 前言 目標 侷限性 HDFS相關概念 塊(Block) HDFS架構 名稱節點(NameNode) 資料
Hadoop技術內幕:深入解析MapReduce架構設計與實現原理 (大資料技術叢書).epub
【下載地址】 《Hadoop技術內幕:深入解析MapReduce架構設計與實現原理》內容簡介:“Hadoop技術內幕”共兩冊,分別從原始碼的角度對“Common+HDFS”和“MapReduce的架構設計和實現原理”進行了極為詳細的分析。《Hadoop技術內幕:深入解析M
Mac下每次開機啟動hadoop都要格式化檔案系統
hdfs-site.xml下配置 <configuration> <property> <name>dfs.replication</name> <value>1</v
Hadoop支援的多種檔案系統URI格式
org.apache.hadoop.fs.FileSystem 這個抽象類代表hadoop的一個檔案系統,目前系統已經有很多個具體實現: 檔案系統 URI字首 hadoop的具體實現類 Local
【史上最全】Hadoop 核心 - HDFS 分散式檔案系統詳解(上萬字建議收藏)
## 1. HDFS概述 Hadoop 分散式系統框架中,首要的基礎功能就是檔案系統,在 Hadoop 中使用 FileSystem 這個抽象類來表示我們的檔案系統,這個抽象類下面有很多子實現類,究竟使用哪一種,需要看我們具體的實現類,在我們實際工作中,用到的最多的就是HDFS(分散式檔案系統)以及Loca
Atittit HDFS hadoop 大資料檔案系統java使用總結 目錄 1. 作業系統,進行操作 1 2. Hdfs 類似nfs ftp遠端分散式檔案服務 2 3. 啟動hdfs服務start
Atittit HDFS hadoop 大資料檔案系統java使用總結 目錄 1. 作業系統,進行操作 1 2. Hdfs 類似nfs ftp遠端分散式檔案服務 2 3. 啟動hdfs服務start-dfs.cmd 2 3.1. 配置core-site
第3章:Hadoop分散式檔案系統(2)
資料流 讀取檔案資料的剖析 為了知道客戶端與HDFS,NameNode,DataNode互動過程中資料的流向,請看圖3-2,這張圖顯示了讀取檔案過程中主要的事件順序。 客戶端通過呼叫FileSystem物件的open()方法開啟一個希望從中讀取資料的檔案,對於HDFS來說,FileSystem是一個Dis
分散式系統詳解--框架(Hadoop--JAVA操作HDFS檔案)
分散式系統詳解--框架(Hadoop--JAVA操作HDFS檔案) 前面的文章介紹了怎麼將整個集群系統搭建起來,並進行了有效的測試。為了解決登入一臺伺服器登入其他伺服器需要多次輸入密碼的
Hadoop分散式檔案系統搭建以及基本操作
1. 環境搭建 jdk-1.8 jdk下載地址 export JAVA_HOME = /usr/lib/java/jdk1.7.0_21 export PATH =$JAVA_HOME/bin:$PATH hadoop-2.7.3 hadoop各個版本
Java: Hadoop檔案系統的讀寫操作
所需jar包路徑: hadoop-2.8.5/share/hadoop/common hadoop-2.8.5/share/hadoop/common/bin hadoop-2.8.5/share/hadoop/hdfs hadoop-2.8.5/share/hadoop/hdfs
Hadoop分散式檔案系統HDFS架構
1 Master(NameNode/NN) 帶 N個Slaves(DataNode/DN) HDFS/YARN/HBase 1個檔案會被拆分成多個Block blocksize:128M 130M =
在搭建Hadoop 分散式叢集的時候,多次格式化檔案系統,啟動hdfs,yarn,後jps 發現datanode為啟動
可以參考:https://www.cnblogs.com/dxwhut/p/5679501.html https://blog.csdn.net/baidu_15113429/article/details/53739734 https://www.cnblogs.com/lishpei/p
Hadoop分散式檔案系統
Hadoop的核心是HDFS和Map-Reduce,兩者只是理論基礎,不是什麼具體可使用的高階應用。 Hadoop有一個稱為HDFS的分散式系統(Hadoop Distributed FileSystem): 當資料集的大小超過一臺獨立物理計算機的儲存能力時,就
linux hadoop mount 載入HDFS到本地檔案系統
2013-02-05 周海漢 2013.2.5 上一篇文章《編譯hadoop 1.0.4的 libhdfs庫》,完成了libhdfs的編譯。在此基礎上,完成fuse_dfs的生成。 編譯fuse_dfs [[email
Hadoop HDFS分散式檔案系統設計要點與架構
Hadoop簡介:一個分散式系統基礎架構,由Apache基金會開發。使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用叢集的威力高速運算和儲存。Hadoop實現了一個分散式檔案系統(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,並
Hadoop分散式檔案系統架構及設計要點
Datanode HDFS採用master/slave架構。一個HDFS叢集是有一個Namenode和一定數目的Datanode組成。Namenode是一箇中心伺服器,負責管理檔案系統的namespace和客戶端對檔案的訪問。Datanode在叢集中一般是一個節點一個,負責管理節點上它們附帶的儲存。在內