這篇文章將為大家詳細(xì)講解有關(guān)HDFS適合做什么,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站專注于綏濱網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供綏濱營(yíng)銷型網(wǎng)站建設(shè),綏濱網(wǎng)站制作、綏濱網(wǎng)頁(yè)設(shè)計(jì)、綏濱網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造綏濱網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供綏濱網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
HDFS適合做:
存儲(chǔ)大文件。上G、T甚至P。
一次寫入,多次讀取。并且每次作業(yè)都要讀取大部分的數(shù)據(jù)。
搭建在普通商業(yè)機(jī)群上就可以了。雖然會(huì)經(jīng)常宕機(jī),但HDFS有良好的容錯(cuò)機(jī)制。
HDFS不適合做:
實(shí)時(shí)數(shù)據(jù)獲取。如果有這個(gè)需求可以用HBase。
很多小文件。因?yàn)閚amenode要存儲(chǔ)HDFS的metadata(比如目錄的樹(shù)狀結(jié)構(gòu),每個(gè)文件的文件名、ACL、長(zhǎng)度、owner、文件內(nèi)容存放的位置等等信息),所以HDFS上文件的數(shù)目受到namenode內(nèi)存的限制。
并發(fā)環(huán)境下的寫入和修改。
Block
一個(gè)磁盤的block通常是512B,內(nèi)核一次讀寫磁盤不能少于這個(gè)數(shù)目。在HDFS上一個(gè)Block的默認(rèn)大小是64M,HDFS block的大小可以通過(guò)ds.block.size來(lái)設(shè)置,很多工作站上把一個(gè)block調(diào)為128M。之所以要把block設(shè)置得這么大,是因?yàn)镠DFS上的文件普遍都是大文件,如果block很小,那一個(gè)文件就要存放在很多block上,而這些位置信息都要被namenode所記錄,一來(lái)浪費(fèi)namenode的存儲(chǔ)空間,二來(lái)檢索一個(gè)文件的時(shí)候開(kāi)銷也比較高。
當(dāng)一個(gè)文件的長(zhǎng)度小于一個(gè)block size時(shí),它會(huì)單獨(dú)占用一個(gè)block,但它占用的磁盤空間仍然是其真實(shí)的長(zhǎng)度。
Namenode和Datanode
namenode管理文件系統(tǒng)的namespace,而datanode負(fù)責(zé)存儲(chǔ)和檢索block。一般情況下一個(gè)block會(huì)存放在多個(gè)不同的datanode上,以提高容錯(cuò)性。datanode在讀寫HDFS文件時(shí),都需要通過(guò)namenode來(lái)獲知讀寫的具體位置。
你可以使用distcp命令在不同的datanode之間并行地復(fù)制大文件:
$ hadoop distcp hdfs://datanode1/foo hdfs://datanode2/bar
HDFS上的文件是使用URI來(lái)定位的,前綴都是hdfs://localhost:9000,你可以把這個(gè)前綴賦給屬性fs.default.name(屬性可以在配置文件中指定,也可以在代碼中指定),這樣你就不用每次都寫這個(gè)前綴了,比如以下2個(gè)命令是等價(jià)的:
$ hadoop fs -ls /
$ hadoop fs -ls hsfs://localhost:9000/
本地文件系統(tǒng)的前綴是file://
orisun@zcypc:~$ hadoop fs -ls file:///Found 22 items drwxr-xr-x - root root 4096 2012-08-02 19:17 /home dr-xr-xr-x - root root 0 2012-08-20 22:14 /proc drwxr-xr-x - root root 4096 2010-04-23 18:11 /mnt drwx------ - root root 4096 2012-08-18 10:46 /root drwxr-xr-x - root root 4096 2012-08-18 10:40 /sbin ……
HDFS默認(rèn)的文件備份數(shù)量是3,這個(gè)可以在dfs.replication屬性中設(shè)置,在偽分布式模式中由于datanode只有一個(gè),所以要把該值設(shè)為1。當(dāng)你使用hadoop fs -ls命令時(shí)會(huì)得到形如:
drwxr-xr-x - orisun supergroup 0 2012-08-20 14:23 /tmp
-rw------- 1 orisun supergroup 4 2012-08-20 14:23 /tmp/jobtracker.info
跟UNIX下的ls命令很像,其中第2列就是replication的數(shù)目,第5列是文件的長(zhǎng)度,以B為單位(文件夾的長(zhǎng)度是0,而在UNIX文件系統(tǒng)中目錄的長(zhǎng)度是512B的整倍數(shù),因?yàn)槟夸浰嫉目臻g是以塊為分配單位的,每塊為512B)。
FSDataInputStream繼承自Java的DataInputStream并支持隨機(jī)讀寫。
public class FSDataInputStream extends DataInputStream implements Seekable, PositionedReadable {}
public interface Seekable { void seek(long pos) throws IOException; long getPos() throws IOException; boolean seekToNewSource(long targetPos) throws IOException; }
FSDataInputStream還可以從指定的位置讀取文件的一部分。
public interface PositionedReadable { public int read(long position, byte[] buffer, int offset, int length) throws IOException; public void readFully(long position, byte[] buffer, int offset, int length) throws IOException; public void readFully(long position, byte[] buffer) throws IOException; }
如果你想在HDFS上新建一文件可以使用
public FSDataOutputStream create(Path f) throws IOException
使用create()函數(shù)時(shí)注意2點(diǎn):文件必須之前不存在;它可附帶地創(chuàng)建任意多級(jí)的父目錄。
有時(shí)候你可能會(huì)需要用append(),在文件不存在時(shí)會(huì)創(chuàng)建它。
public FSDataOutputStream append(Path f) throws IOException
重命名文件
public void rename(String oldName,String newName)
當(dāng)然你也可以用mkdir來(lái)創(chuàng)建目錄
public boolean mkdirs(Path f) throws IOException
由于create()可以附帶地創(chuàng)建任意多級(jí)的父目錄,所以mkdir你并不會(huì)常用。
FileSystem的getFileStatus()方法可以獲取文件和目錄的FileStatus。
Path file = new Path("/dir/file"); FileStatus stat = fs.getFileStatus(file);
然后你就可以訪問(wèn):
stat.getPath() stat.getLen() stat.isLen() stat.getMogificationTime() stat.getReplication() stat.getBlockSize() stat.getOwner() stat.getReplication() stat.getBlockSize() stat.getGroup() stat.getPermission()
實(shí)際上上述信息都存儲(chǔ)在namenode中。
你還可以獲取一個(gè)目錄下所有文件的FileStatus。
public FileStatus[] listStatus(Path f) throws IOExceptionpublic FileStatus[] listStatus(Path f, PathFilter filter) throws IOExceptionpublic FileStatus[] listStatus(Path[] files) throws IOExceptionpublic FileStatus[] listStatus(Path[] files, PathFilter filter) throws IOException
在指定文件時(shí),hadoop同樣支持globbing,它支持的wildcard有:
* 0個(gè)或多個(gè)任意字符
? 任意單個(gè)字符
[ab] [^ab] [a-b] [^a-b]
{exp1,exp2} 匹配exp1或exp2
\c 轉(zhuǎn)義
fs.listStatus(new Path("/2007/*/*"), new RegexExcludeFilter("^.*/2007/12/31$"))
將匹配2007年的所有文件,但是2007-12-31的文件將被filter掉。
public boolean delete(Path f, boolean recursive) throws IOException
刪除目錄時(shí)可以選擇是否啟用遞歸模式。
上面已經(jīng)提到大量的小文件會(huì)極大消耗namenode的內(nèi)存,所以在這種情況下我們需要使用Hadoop Archives(HAR)把文件歸檔為一個(gè)大文件。
$ hadoop archive -archiveName orisun.har -p /user/orisun /user
把/user/orisun下的所有文件打包成orisun.tar放在/user目錄下。
你還可以查看一個(gè)har文件中包含哪些文件:
orisun@zcypc:~$ hadoop fs -lsr har:///user/orisun.hardrwxr-xr-x - orisun supergroup 0 2012-08-20 16:49 /user/orisun.har/mse-rw-r--r-- 1 orisun supergroup 0 2012-08-20 16:49 /user/orisun.har/mse/list-rw-r--r-- 1 orisun supergroup 0 2012-08-20 16:49 /user/orisun.har/book orisun@zcypc:~$ hadoop fs -ls har:///user/orisun.har/mseFound 1 items-rw-r--r-- 1 orisun supergroup 0 2012-08-20 16:49 /user/orisun.har/mse/list
HAR也是一個(gè)文件系統(tǒng),一個(gè)Har URI的完整模式是har://<scheme>-<host>/<path>
orisun@zcypc:~$ hadoop fs -lsr har://hdfs-localhost:9000/user/orisun.har/mse-rw-r--r-- 1 orisun supergroup 0 2012-08-20 16:49 /user/orisun.har/mse/list
刪除har文件必須使用rmr命令,用rm是不行的。
$ hadoop fs -rmr /user/orisun.har
使用HAR的一些限制:
會(huì)產(chǎn)生原始文件的完整備份,占用磁盤空間。當(dāng)然你可以以在建好har文件后把原文件刪掉。
HAR只是把多個(gè)文件打包成一個(gè)文件并沒(méi)有采用任何的壓縮策略。
HAR文件是不可變,如何你想增加或從har中刪除一個(gè)文件,你只能重新歸檔。
InputFormat不理會(huì)har的存在,這意味著har文件對(duì)于MapReduce來(lái)說(shuō)仍然會(huì)產(chǎn)生多個(gè)InputSlit,不會(huì)提高效率。要解決“小文件很多導(dǎo)致map task很多”的問(wèn)題,可以采用CombineFileInputFormat。
關(guān)于“HDFS適合做什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
本文題目:HDFS適合做什么
標(biāo)題鏈接:http://vcdvsql.cn/article26/pccscg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、企業(yè)建站、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)