日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hadoop中的filesystem和localfilesystem

發(fā)布時(shí)間:2024/1/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hadoop中的filesystem和localfilesystem 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在這一節(jié)我們要深入了解Hadoop的FileSystem類——這是與與hadoop的文件系統(tǒng)交互的重要接口。雖然我們只是著重于HDFS的實(shí)現(xiàn),但我們?cè)诰幋a時(shí)一般也要注意代碼在FileSystem不同子類文件系統(tǒng)之間的可移植性。這是非常有用的,比如說(shuō)你可以非常方便的直接用同樣的代碼在你的本地文件系統(tǒng)上進(jìn)行測(cè)試。

使用hadoop URL讀數(shù)據(jù)

從hadoop文件系統(tǒng)中讀取文件的最簡(jiǎn)單的方法之一便是使用java.net.URL對(duì)象來(lái)打開(kāi)一個(gè)欲從中讀取數(shù)據(jù)的流(stream)。通常情況下的編程風(fēng)格如下:

1 InputStream in = null; 2 try { 3 in = new URL("hdfs://host/path").openStream(); 4 // process in 5 } finally { 6 IOUtils.closeStream(in); 7 }

想要使java識(shí)別出hdfs開(kāi)頭的URL標(biāo)示還需要一點(diǎn)其他的工作要做:通過(guò)URL的setURLStreamHandlerFactory()方法為java設(shè)置一個(gè)FSUrlStreamHandlerFactory。這個(gè)方法在每個(gè)JVM中只能調(diào)用一次,所以它通常會(huì)被放在一個(gè)static block中執(zhí)行(如下所示),但如果你的某部分程序——例如一個(gè)你無(wú)法修改源代碼的第三方組件——已經(jīng)調(diào)用了這個(gè)方法,那你就不能通過(guò)URL來(lái)這樣讀取數(shù)據(jù)了(下一節(jié)我們會(huì)介紹另一種方法)。

1 public class URLCat { 2 static { 3   URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 4 } 5 6 public static void main(String[] args) throws Exception{ 7   InputStream in = null; 8   try { 9    in = new URL(args[0]).openStream(); 10    IOUtils.copyBytes(in, System.out, 4096, false); 11    } finally { 12    // TODO: handle exception 13    IOUtils.closeStream(in); 14    } 15 } 16 }

上例中我們使用了Hadoop中的IOUtils類的兩個(gè)靜態(tài)方法:?
1)IOUtils.copyBytes(),其中in表示拷貝源,System.out表示拷貝目的地(也就是要拷貝到標(biāo)準(zhǔn)輸出中去),4096表示用來(lái)拷貝的buffer大小,false表明拷貝完成后我們并不關(guān)閉拷貝源可拷貝目的地(因?yàn)镾ystem.out并不需要關(guān)閉,in可以在finally語(yǔ)句中被關(guān)閉)。?
2)IOUtils.closeStream(),用來(lái)關(guān)閉一個(gè)流。?
下面是我們的測(cè)試?yán)?#xff1a;

% hadoop URLCat hdfs://localhost/user/tom/quangle.txt?
On the top of the Crumpetty Tree?
The Quangle Wangle sat,?
But his face you could not see,?
On account of his Beaver Hat.

使用FileSystem讀取數(shù)據(jù)

就像上節(jié)所說(shuō)的,有時(shí)候我們無(wú)法通過(guò)設(shè)置URLStreamHandlerFactory方法的方式來(lái)通過(guò)URL讀取數(shù)據(jù),這時(shí)FIleSystem API就派上用場(chǎng)了。?
Hadoop文件系統(tǒng)中的文件是用Hadoop的Path對(duì)象來(lái)表示的(而不是java中的java.io.File對(duì)象,因?yàn)樗恼Z(yǔ)義太接近于本地文件系統(tǒng)了)。你可以把一個(gè)Path對(duì)象看做Hadoop文件系統(tǒng)中的某一個(gè)URL,如上例中的“hdfs://localhost/user/tom/quangle.txt”。?
Filesystem是一個(gè)通用的文件系統(tǒng)API,所以使用它的第一步就是先抽取出它的一個(gè)實(shí)例出來(lái)——在這個(gè)例子中是HDFS。下面列出了幾個(gè)Filesystem的用于抽取Filesystem實(shí)例的幾個(gè)靜態(tài)方法:

public static FileSystem get(Configuration conf) throws IOException?
public static FileSystem get(URI uri, Configuration conf) throws IOException?
public static FileSystem get(URI uri, Configuration conf, String user) throws IOException

一個(gè)Configuration對(duì)象封裝了客戶端或服務(wù)器端的配置信息,這些配置信息是通過(guò)從conf/core-size.xml之類的配置文件中讀取出來(lái)的名值對(duì)來(lái)設(shè)置的。下面我們一一說(shuō)明上面的三個(gè)方法:?
1)第一個(gè)方法返回一個(gè)默認(rèn)的文件系統(tǒng)(在conf/core-site.xml中通過(guò)fs.default.name來(lái)指定的,如果在conf/core-site.xml中沒(méi)有設(shè)置則返回本地文件系統(tǒng))。?
2)第二個(gè)方法通過(guò)uri來(lái)指定要返回的文件系統(tǒng)(例如,如果uri是上個(gè)測(cè)試?yán)又械膆dfs://localhost/user/tom/quangle.txt,也即以hdfs標(biāo)識(shí)開(kāi)頭,那么就返回一個(gè)hdfs文件系統(tǒng),如果uri中沒(méi)有相應(yīng)的標(biāo)識(shí)則返回本地文件系統(tǒng))。?
3)第三個(gè)方法返回文件系統(tǒng)的機(jī)理同(2)是相同的,但它同時(shí)又限定了該文件系統(tǒng)的用戶,這在安全方面是很重要的。

有時(shí)候你可能想要使用一個(gè)本地文件系統(tǒng),你可以使用另一個(gè)很方便的方法:?
public static LocalFileSystem getLocal(Configuration conf) throws IOException

得到一個(gè)文件系統(tǒng)的實(shí)例后,我們可以調(diào)用該實(shí)例的open()方法來(lái)打開(kāi)某個(gè)給定文件的輸入流(第一個(gè)方法使用一個(gè)默認(rèn)的4KB的輸入緩沖):

public FSDataInputStream open(Path f) throws IOException?
public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException

把上面介紹的組合起來(lái)我們就得到了下面的代碼:

1 public class FileSystemCat { 2 public static void main(String[] args) throws Exception { 3 String uri = args[0]; 4 Configuration configuration = new Configuration(); 5 FileSystem fs = FileSystem.get(URI.create(uri), configuration); 6 InputStream in = null; 7 try{ 8 in = fs.open(new Path(uri)); 9 IOUtils.copyBytes(in, System.out, 4096, false); 10 } finally { 11 IOUtils.closeStream(in); 12 } 13 } 14 }



?Hadoop LocalFileSystem是客戶端校驗(yàn)的類。在使用LocalFileSystem寫文件時(shí),會(huì)透明的創(chuàng)建一個(gè).filename.crc的文件。校驗(yàn)文件大小的字節(jié)數(shù)由io.bytes.per.checksum屬性設(shè)置,默認(rèn)是512bytes,即每512字節(jié)就生成一個(gè)CRC-32校驗(yàn)和。

? ? ? .filename.crc文件會(huì)存 io.bytes.per.checksum的信息。在讀取的時(shí)候,會(huì)根據(jù)此文件進(jìn)行校驗(yàn)。

? ? ? 事實(shí)上LocalFileSystem是通過(guò)繼承ChecksumFileSystem實(shí)現(xiàn)校驗(yàn)的工作。

?

寫例子:

Java代碼 ?
  • package?com.bigdata.io;??
  • ??
  • import?java.io.IOException;??
  • import?java.io.OutputStream;??
  • import?java.net.URI;??
  • import?java.net.URISyntaxException;??
  • ??
  • import?org.apache.hadoop.conf.Configuration;??
  • import?org.apache.hadoop.fs.LocalFileSystem;??
  • import?org.apache.hadoop.fs.Path;??
  • import?org.apache.hadoop.fs.RawLocalFileSystem;??
  • ??
  • ??
  • public?class?WriteToLocal?{??
  • ??????
  • ????public?static?void?main(String[]?args)?throws?IOException,?URISyntaxException?{??
  • ????????Configuration?conf?=?new?Configuration();??
  • ????????LocalFileSystem?fs?=??new?LocalFileSystem(new?RawLocalFileSystem());??
  • ????????fs.initialize(new?URI("file:///home/peter/abc1"),?conf);?//?put?the?conf?object?to?filesystem?instance??
  • ????????OutputStream?out?=?fs.create(new?Path("file:///home/peter/abc1"));??
  • ????????for(int?i?=?0;?i?<?512*10;i++){??
  • ????????????out.write(97);??
  • ????????}??
  • ????????out.close();??
  • ????????Path?file?=?fs.getChecksumFile(new?Path("file:///home/peter/abc1"));??
  • ????????System.out.println(file.getName());??
  • ????????fs.close();??
  • ????}??
  • ??
  • } ?




  • 總結(jié)

    以上是生活随笔為你收集整理的hadoop中的filesystem和localfilesystem的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。