天天看點

Hadoop檔案系統通路的兩種方式

在這裡記錄下學習hadoop 的過程,并對重要内容記錄下來,以備以後查漏補缺。

要從hadoop檔案系統中讀取檔案,一般有兩種方式:

1.使用java.net.url對象

這種方式需要讓java識别hadoop檔案系統的url方案,就是通過一個fsurlstreamhandlerfactory執行個體來調用url中的seturlstreamhandlerfactory方法。這種方法在一個java虛拟機中隻被調用一次,是以一般放在static塊中。這個限制意味着如果程式的其他部件設定了一個urlstreamhandlerfactory,我們便無法再從hadoop中讀取資料了。

這需要是我第二種方法。

2.使用filesystemapi讀取資料

在指令行中,我們可以和使用linux系統指令一樣來操作hdfs系統。

這個指令可以檢視根目錄下的檔案,如果想要遞歸檢視,參數改為  -lsr 即可

如果想知道更多的幫助可以用以下指令:

可以得到ls的用法提示。

這裡重點講解用hadoop api操作hdfs檔案系統。

通過調用filesystem.get(configuration conf)工廠方法可以得到filesystem的執行個體。

configuration class is a special class for holding key/value configuration parameters.

configuration對象封裝了一個用戶端或者伺服器的配置,這是用從類路徑對去而來的配置檔案(如conf/core-site.xml)來設定。

這個靜态方法傳回的是預設檔案系統(在conf/core-site.xml中設定,如果沒有設定過,則是預設的本地檔案系統)。

我們可以這樣得到hdfs檔案系統:

我們可以這樣得到本地檔案系統

在hadoop檔案api中,我們用path對象來編碼檔案名和檔案夾名,用filestatus對象來存儲檔案與檔案夾的元資訊(metadata)

上面這個完整的程式完成的功能是:把本地的一個檔案夾中的檔案再上傳到hdfs檔案系統時将它們合并。

除此之外filesystem類也有諸如delete(),exists(),mkdirs(),rename()等方法。

fsdatainputstream不是标準的java.io類,這個類是java.io.datainputstream的一個子類,支援随機通路,這樣就可以從流的任意位置讀取資料了。

上面是它的簽名,seekable接口允許在檔案中定位,并提供一個查詢方式,用于查詢目前位置相對于檔案開始位置的偏移量。

調用seek方法來定位大于檔案長度的位置會導緻ioexception異常。與java.io.inputstream中的skip()方法不同,seek()并沒有指出資料流目前位置之後的一點,他可以轉移到檔案中任何一個位置。

應用程式員并不常用seektonewsource方法。此方法一般傾向于切換到資料的另一個副本并在新的副本中尋找targetpos指定的位置。hdfs内部就采用這種方式在資料節點故障時為用戶端提供可靠的資料流。

Hadoop檔案系統通路的兩種方式
Hadoop檔案系統通路的兩種方式

fsdatainputstream也實作了positionedreadable接口

這個接口内的方法都會保留檔案目前位置并且是線程安全的,是以他們提供了在讀取檔案的主要部分時通路其他部分的便利方法。

最後務必記住:seek方法是一個相對高開銷的操作,需要慎重使用。