HDFS初入

題記:正值學校運動會假期,想吸收點新鮮的血液褐啡。心血來潮搭了個hadoop的偽分布式,了解了下HDFS。

HDFS簡介

HDFS是Hadoop Distributed File System的簡稱停巷,即hadoop分布式文件系統(tǒng)。它是Hadoop的核心組件累贤,在最底層保存數(shù)據(jù)叠穆,為hadoop其他組件提供海量數(shù)據(jù)的數(shù)據(jù)的存儲和讀寫服務(wù)。而Hadoop的另一個核心即MapReduce則是基于HDFS對數(shù)據(jù)進行調(diào)度和分布式計算臼膏,這種計算可以理解為常用的讀取硼被,刪除等處理的操作。原理是由MapReduce的JobTracker節(jié)點將計算任務(wù)(Job)分成幾個Task渗磅,每個task為一個子任務(wù)嚷硫,從而對HDFS的分布式數(shù)據(jù)進行操作。HDFS的特點就是適合存儲超大的數(shù)據(jù)始鱼,適式數(shù)據(jù)的訪問仔掸,一次寫入,多次讀寫医清。但是HDFS也有短板:訪問的數(shù)據(jù)沒有實時性起暮,由于其對大數(shù)據(jù)的吞吐量做了優(yōu)化,所以不適合對數(shù)據(jù)的實時性訪問的場景会烙,并且HDFS不支持并發(fā)寫负懦,即對文件分片后只能一個塊一個塊的寫。而且Hadoop的權(quán)限管理也是一個問題柏腻,但是聽說可以結(jié)合kerberos解決纸厉。在hadoop1.0里面對文件也不能追加寫…2.0里面可以。五嫂。颗品。


hadoop1.0和2.0的HDFS組件有些變化,需要注意的就是塊的大小由64MB變?yōu)?28MB沃缘,并且在HDFS的2.0集群中躯枢,沒有secondaryNameNode。因為NameNode中的鏡像文件和內(nèi)存中的原數(shù)據(jù)是實時同步的槐臀。所以不需要secondaryNameNode來對NameNode的FSImage和Edits文件進行切換闺金,下載,合并峰档,推送過程败匹。這個之后再提寨昙。

我下載的是hadoop的1.2.1版本,目前就安裝它吧掀亩!

hadoop 1.0偽分布式搭建

hadoop安裝步驟:

  • 安裝JDK:apt-get install openjdk-7-jdk舔哪;
  • 設(shè)置環(huán)境變量:JAVA_HOME、JRE_HOME槽棍、CLASSPATH捉蚤、PATH
  • 下載hadoop安裝包并解壓到指定目錄下;
  • 設(shè)置環(huán)境變量:HADOOP_HOME炼七、PATH
  • 修改相關(guān)配置文件$HADOOP_HOME/conf:
  • 修改hadoop-env.sh缆巧,設(shè)置JAVA_HOME;
  • 修改core-site.xml豌拙,設(shè)置hadoop.tmp.dir陕悬、dfs.name.dir、fs.default.name按傅;
  • 修改mapred-site.xml捉超,設(shè)置mapred.job.tracker;
  • 修改hdfs-site.xml唯绍,設(shè)置dfs.data.dir拼岳;
  • 格式化:hadoop namenode -format;
  • 啟動:start-all.sh
  • 檢查:jps


完成的環(huán)境:

zhxfei@zhxfei-vm:~$ uname -a
Linux zhxfei-vm 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

環(huán)境變量配置文件:


zhxfei@zhxfei-vm:~$ vim /etc/profile

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export HADOOP_HOME=/opt/hadoop-1.2.1/
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH
export HADOOP_HOME_WARN_SUPPRESS=1  #在執(zhí)行啟動腳本時會有個WRNING ,說Hadoop什么被抑制况芒,添加此條就行

Hadoop的配置文件:

root@zhxfei-vm:/opt/hadoop-1.2.1/conf# vim core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop</value>
</property>

<property>
<name>dfs.name.dir</name>
<value>/hadoop/name</value>
</property>

<property>
<name>fs.default.name</name>
<value>hdfs://zhxfei-vm:9000</value>
</property>
</configuration>

HDFS的配置文件

root@zhxfei-vm:/opt/hadoop-1.2.1/conf# vim hdfs-site.xml


<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data</value>
</property>
</configuration>

MR的配置文件

root@zhxfei-vm:/opt/hadoop-1.2.1/conf# vim mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>zhxfei-vm:9001</value>
</property>
</configuration>

給hadoop設(shè)置JAVA_HOME環(huán)境變量


root@zhxfei-vm:/opt/hadoop-1.2.1/conf# vim hadoop-env.sh 
# Set Hadoop-specific environment variables here.

# The only required environment variable is JAVA_HOME.  All others are
# optional.  When running a distributed configuration it is best to
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.

# The java implementation to use.  Required.
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

如果沒有SSHD服務(wù)的話需自己安裝openssh-server的惜纸,在啟動Hadoop的時候需要與其進行連接時需要ssh協(xié)議的支持。安裝之后可以查看22端口是否開放绝骚,開放之后配置ssh免登陸
生成ssh免登陸密鑰, 執(zhí)行完這個命令后堪簿,會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)將公鑰拷貝到要免登陸的機器上皮壁,由于搭建的是偽分布式所以直接在本地:

ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

之后如果發(fā)現(xiàn)不能啟動的話可以檢查iptables是否放行22端口。

安裝錯誤主要靠錯誤信息進行排錯哪审,對了記得刷新配置:sourse /etc/profile

安裝完成之后可以用hadoop的啟動腳本 start-all.sh蛾魄,執(zhí)行之后使用java的jps查看hadoop是否正常運行NameNode,SecondaryNameNode湿滓,DataNode滴须,JobTracker,TaskTracker是否正常運行即可
叽奥。操作如下:


root@zhxfei-vm:/opt/hadoop-1.2.1/conf$ start-all.sh 
starting namenode, logging to /opt/hadoop-1.2.1/libexec/../logs/hadoop-root-namenode-zhxfei-vm.out
localhost: starting datanode, logging to /opt/hadoop-1.2.1/libexec/../logs/hadoop-root-datanode-zhxfei-vm.out
localhost: starting secondarynamenode, logging to /opt/hadoop-1.2.1/libexec/../logs/hadoop-root-secondarynamenode-zhxfei-vm.out
starting jobtracker, logging to /opt/hadoop-1.2.1/libexec/../logs/hadoop-root-jobtracker-zhxfei-vm.out
localhost: starting tasktracker, logging to /opt/hadoop-1.2.1/libexec/../logs/hadoop-root-tasktracker-zhxfei-vm.out
root@zhxfei-vm:/opt/hadoop-1.2.1/conf$ jps
15962 SecondaryNameNode
16202 TaskTracker
16252 Jps
15671 NameNode
16056 JobTracker
15819 DataNode

HDFS原理

HDFS的組成

在hadoop偽分布式環(huán)境中扔水,SecondaryNameNode和NameNode還有DataNode是運行在一臺主機上的進程,用進程來模擬主機朝氓,而一個典型1.0版本的HDFS集群中魔市,由一個namenode和一個secondarynode和至少一個Datanode主届,HDFS的客戶端數(shù)量沒有限制。所有數(shù)據(jù)都放置在DataNode進程的節(jié)點的Block(塊)里待德。但是在hadoop2.0集群中沒有SecondaryNameNode君丁,但是在2.0的偽分布式模式中有SecondaryNameNode。

  • Namenode:HDFS的大腦将宪,接受client的操作請求绘闷,維護著整個HDFS系統(tǒng)的目錄樹,目錄里所有的文件和目錄较坛,在內(nèi)存中保留元數(shù)據(jù)信息印蔗,并將其以FSImage和命名空間鏡像的編輯日志保存在本地文件中,每次Namenode啟動默認加載最新的命名空間鏡像丑勤。內(nèi)存和磁盤中各一份华嘹。
  • FSImage:命名空間鏡像 /文件系統(tǒng)快照,為了防止NameNode所在機器掉電确封,HDFS的文件系統(tǒng)的目錄和元數(shù)據(jù)信息丟失而對HDFS的相關(guān)信息的鏡像備份除呵。
  • Edits:Edit Log記錄client對文件的操作而產(chǎn)生的元數(shù)據(jù)信息產(chǎn)生的變化。其保存的也是原數(shù)據(jù)信息爪喘,但是是更新的原數(shù)據(jù)信息颜曾。在SecondaryNameNode和NameNode進行交互后,會被清空秉剑。
  • fstime:保存最近一次checkpoint的時間
    以上這些文件是保存在linux的文件系統(tǒng)中泛豪。
  • SecoundaryNameNode:用于定期合并命名空間鏡像和對其的編輯日志。不是對NameNode的備份侦鹏!

  • DataNode:數(shù)據(jù)節(jié)點诡曙。在NameNode的指導下完成I/O任務(wù)。所有HDFS的塊都存放在DataNode上略水,對于DataNode來說价卤,塊就是一個普通的文件,hadoop1.0默認是64MB渊涝,而hadoop2.0默認是128MB慎璧。不同于普通文件系統(tǒng)的是,HDFS中跨释,如果一個文件小于一個數(shù)據(jù)塊的大小胸私,并不占用整個數(shù)據(jù)塊存儲空間

  • HDFS的客戶端:指用戶和HDFS交互的手段,有命令行接口鳖谈,JAVA API岁疼,C語言庫,用戶空間文件系統(tǒng)等等

HDFS的塊

文件系統(tǒng)的塊大小只能是磁盤塊的整數(shù)倍缆娃,一般磁盤塊是512字節(jié)捷绒,而EXT3的文件系統(tǒng)的塊為4096瑰排,HDFS的文件塊大小為64MB,和其他文件系統(tǒng)不同的是HDFS小于一個塊大小不會占據(jù)整個塊的空間疙驾。塊的大小可以被改變凶伙,配置項為hdfs-site.xml中的dfs.block.size項,是datanode存儲數(shù)據(jù)的最小單元它碎。
如下:

root@zhxfei-vm:/hadoop/data/current# ls
blk_3597001837970459933            blk_-3850128862716211144_2251.meta  blk_-6524268894760927318            blk_-8587672643259394653_2242.meta
blk_3597001837970459933_2252.meta  blk_-5563214751032658860            blk_-6524268894760927318_2250.meta  dncp_block_verification.log.curr
blk_-3850128862716211144           blk_-5563214751032658860_2253.meta  blk_-8587672643259394653            VERSION

HDFS的塊大小這么大是為了最小化尋址開銷函荣,如果塊設(shè)置的足夠大,從磁盤傳輸?shù)臄?shù)據(jù)的時間明顯大于定位這個塊開始的時間扳肛。這樣傳輸一個由多個塊組成的文件的時間取決于磁盤傳輸?shù)男噬倒摇5窃O(shè)置的太大的話也不好,太大的話挖息,因為當Job通過MapReduce分成子任務(wù)時如果子任務(wù)的數(shù)量受到預(yù)處理的文件的塊的數(shù)量限制金拒。只有在適量的時候,才嗯那個發(fā)揮增加文件系統(tǒng)對高數(shù)據(jù)的吞吐量套腹。hdfs-site.xml中還可以設(shè)置dfs.relication绪抛,配置每個HDFS的塊在Hadoop集群中保存的份數(shù),默認為3电禀,如果為3的話幢码,Hadoop的默認布局會在HDFS的客戶端盡量放置第一個副本,如果客戶端在集群之外尖飞,則會避免存儲太滿并隨機選取一個節(jié)點放置症副。第二個副本放置在隨機選擇的另一個機架上的任意DataNode,第三各副本放置在和第二個副本相同機架隨機的另一個不同的DataNode上政基。這樣可以提供很好的數(shù)據(jù)的冗余性贞铣。

元數(shù)據(jù)存儲細節(jié)

Metadata(Filename,reliacas,block-ids,id2host……)
對應(yīng)著:Metadata(/test/a.log沮明,3,{blk_1,blk_2},[{blk_1:[h1,h2,h3]},{blk_2:[h0,h2,h3]}],……)
表示著:/test/a.log一共有3個副本辕坝,被分成2個block塊,第一個塊的三個副本在h1荐健,h2酱畅,h3中存放,第二個塊在h0,h2,h3中存放摧扇。
當client在NameNode拿到元數(shù)據(jù)信息之后,其會根據(jù)就近原則去取塊挚歧。每個塊采用了CRC校驗機制扛稽,如果出現(xiàn)問題或者校驗出錯不符合則換塊讀取,NameNode在收到client的反饋會通知DataNode根據(jù)pipeline對那個損壞的塊進行重新的備份滑负。

NameNode和SecondaryNameNode
  • NameNode的工作特點:Namenode始終在內(nèi)存中保存metedata在张,用于處理“讀請求”
    到有“寫請求”到來時用含,namenode會首先寫editlog到磁盤,即向edits文件中寫日志帮匾,成功返回后啄骇,才會修改內(nèi)存,并且向客戶端返回
    Hadoop會維護一個fsimage文件瘟斜,也就是namenode中metedata的鏡像缸夹,但是fsimage不會隨時與namenode內(nèi)存中的metedata保持一致,而是每隔一段時間通過合并edits文件來更新內(nèi)容螺句。Secondary namenode就是用來合并fsimage和edits文件來更新NameNode的metedata的虽惭。

  • SecondaryNameNode的工作特點,HA的一個解決方案蛇尚。但不支持熱備芽唇。配置即可。執(zhí)行過程:從NameNode上通過HTTP協(xié)議下載元數(shù)據(jù)信息(fsimage,edits)取劫,然后把二者合并匆笤,生成新的fsimage,在本地保存谱邪,并將其推送到NameNode炮捧,替換舊的fsimage.默認在安裝在NameNode節(jié)點上


其交互如下:

1.SecondaryNameNode引導NameNode切換Edit Log文件,生成Edit Log.New并開始更新新的內(nèi)容寫進Edit Log.New
2.SecondaryNameNode將NameNode的FSImage和Edit Log文件復制到本地的檢查點目錄虾标。
3.SecondaryNameNode載入FSImage文件寓盗,回放Edit Log文件將其合并FSImage,并將新的FSImage文件壓縮后寫入磁盤璧函。
4.SecondaryNameNode將新的FSImage文件送回到NameNode傀蚌,NameNode在接受新的FSImage后直接加載和應(yīng)用該文件,將舊的FSImage和Edit Log文件刪除,并將Edit log.New其更名為Edit Log。
這個過程每個小時即3600s發(fā)生一次蘸吓,或者當超過fs.checkpoint.size即 規(guī)定edits文件的最大值則強制checkpoint善炫,不管是否到達最大時間間隔。默認大小是64M库继。

HDFS的容錯機制:

心跳機制:NameNode和DataNode之間維持心跳檢測箩艺,當由于網(wǎng)絡(luò)故障之類的原因,導致DataNode發(fā)出的心跳包沒有被NameNode正常收到時宪萄,NameNode不會給那個DataNode分配新的I/O操作并認為那個DataNode上的數(shù)據(jù)為無效的艺谆。因此NameNode會檢測文件塊的副本數(shù)目小于設(shè)置的值,若小于則開始自動復制新的副本并分發(fā)給其他的DataNode上檢測文件塊的完整性:HDFS會記錄每個新建文件的所有塊校驗和拜英,當以后在檢索這些文件的時候或者從某個節(jié)點獲取塊的時候首先確認校驗和是否一致静汤,若不一致則去其他的DataNode中獲取該塊的副本。

集群的負載均衡:當某個DataNode的空閑大于一個臨界值的時候HDFS會從其他DataNode遷移數(shù)據(jù)過來文件的刪除:刪除并不是從NameNode中移除命名空間,而是存放在/trash目錄中可以隨時恢復虫给,直到 hdfs-site.xml 中的配置時間 fs.trash.interval決定藤抡,單位為s

HDFS簡單操作

Web UI

自Firefox中訪問虛擬機的地址和對應(yīng)的端口號。50070為默認的namenode的端口抹估,50030為默認的jobtracker的端口


HDFS shell

感覺和linux差不多缠黍,略過

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市药蜻,隨后出現(xiàn)的幾起案子瓷式,更是在濱河造成了極大的恐慌,老刑警劉巖谷暮,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒿往,死亡現(xiàn)場離奇詭異,居然都是意外死亡湿弦,警方通過查閱死者的電腦和手機瓤漏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颊埃,“玉大人蔬充,你說我怎么就攤上這事“嗬” “怎么了饥漫?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罗标。 經(jīng)常有香客問我庸队,道長,這世上最難降的妖魔是什么闯割? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任彻消,我火速辦了婚禮,結(jié)果婚禮上宙拉,老公的妹妹穿的比我還像新娘宾尚。我一直安慰自己,他們只是感情好谢澈,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布煌贴。 她就那樣靜靜地躺著,像睡著了一般锥忿。 火紅的嫁衣襯著肌膚如雪牛郑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天敬鬓,我揣著相機與錄音淹朋,去河邊找鬼灶似。 笑死,一個胖子當著我的面吹牛瑞你,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播希痴,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼者甲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砌创?” 一聲冷哼從身側(cè)響起虏缸,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫩实,沒想到半個月后刽辙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡甲献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年宰缤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晃洒。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡慨灭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出球及,到底是詐尸還是另有隱情氧骤,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布吃引,位于F島的核電站筹陵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏镊尺。R本人自食惡果不足惜朦佩,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹅心。 院中可真熱鬧吕粗,春花似錦、人聲如沸旭愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽输枯。三九已至议泵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桃熄,已是汗流浹背先口。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工型奥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碉京。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓厢汹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谐宙。 傳聞我的和親對象是個殘疾皇子烫葬,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容