Hadoop的伪分布安装 hadoop的核心思想
hadoop的安裝分為本地模式、偽分布模式、集群模式。本地模式是運(yùn)行在本地,只負(fù)責(zé)存儲(chǔ),沒有計(jì)算功能,本書不講述。偽分布模式是在一臺(tái)機(jī)器上模擬分布式部署,方便學(xué)習(xí)和調(diào)試。集群模式是在多個(gè)機(jī)器上配置hadoop,是真正的“分布式”。本章講述偽分布模式和集群的安裝。
1. 解壓縮hadoop
使用WinSCP把壓縮包hadoop-1.1.2.tar.gz從宿主機(jī)復(fù)制到linux的/usr/local目錄下,如圖3-1。
圖3-1
解壓縮文件,并重命名為hadoop,方便使用。重命名后,hadoop目錄的完整路徑是“/usr/local/hadoop”。
#tar -xzvf hadoop-1.0.4.tar.gz#mv hadoop-1.0.4 hadoop設(shè)置環(huán)境變量HADOOP_HOME,修改文件“/etc/profile”,如下圖:
圖3-2
請(qǐng)讀者與jdk設(shè)置時(shí)配置文件對(duì)照。這里我們?cè)O(shè)置了一個(gè)別名cdha,可以快速轉(zhuǎn)到hadoop的目錄。
修改環(huán)境變量后,記得執(zhí)行source命令哦。
現(xiàn)在讓我們?yōu)g覽一下hadoop的目錄結(jié)構(gòu)吧
圖3-3
我們關(guān)注bin目錄和conf目錄。
2. 修改配置文件
hadoop配置文件默認(rèn)是本地模式,我們修改四個(gè)配置文件,這些文件都位于$HADOOP_HOME/conf目錄下。
第一個(gè)是hadoop環(huán)境變量腳本文件hadoop-env.sh,修改第9行代碼為。
| export JAVA_HOME=/usr/local/jdk |
保存并關(guān)閉。這里設(shè)置的是JAVA_HOME,注意去掉前面的“#”。
第二個(gè)是hadoop核心配置文件core-site.xml,結(jié)果如下
| <configuration> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> <description>hadoop的運(yùn)行臨時(shí)文件的主目錄</description> </property> <property> <name>fs.default.name</name> <value>hdfs://book0:9000</value> <description>HDFS的訪問路徑</description> </property> </configuration> |
第三個(gè)是hdfs配置文件hdfs-site.xml,結(jié)果如下
| <configuration> <property> <name>dfs.replication</name> <value>1</value> <description>存儲(chǔ)副本數(shù)</description> </property> </configuration> |
第四個(gè)是MapReduce配置文件mapred-site.xml,結(jié)果如下
| <configuration> <property> <name>mapred.job.tracker</name> <value>book0:9001</value> <description>JobTracker的訪問路徑</description> </property> </configuration> |
這是安裝偽分布模式的最小化配置。目前的任務(wù)是把hadoop跑起來,先不關(guān)注各配置項(xiàng)什么含義,這些配置項(xiàng)還在后文會(huì)有詳細(xì)的解釋。
3. 格式化文件系統(tǒng)
hdfs是文件系統(tǒng),所以在第一次使用之前需要進(jìn)行格式化。執(zhí)行命令$HADOOP_HOME/bin/hadoop namenode –format。見圖3-4
圖3-4
注意:只在第一次啟動(dòng)的時(shí)候格式化,不要每次啟動(dòng)都格式化。理解為我們新買了塊移動(dòng)硬盤,使用之前總要格式化硬盤。
如果真的有必要再次格式化,請(qǐng)先把“$HADOOP_HOME/tmp”目錄下的文件全部刪除。
讀者可以自己觀察目錄”$HADOOP_HOME/tmp”在格式化前后的變化情況。
格式化操作很少有出現(xiàn)失敗的情況。如果真出現(xiàn)了,請(qǐng)檢查配置是否正確。
4. 啟動(dòng)
格式化完成后,開始啟動(dòng)hadoop程序。
啟動(dòng)hadoop的命令腳本都在$HADOOP_HOME/bin/下,下面的所有命令都不再帶有完整路徑名稱。
這里講述hadoop啟動(dòng)的三種方式:
第一種,一次性全部啟動(dòng):
圖3-5
執(zhí)行start-all.sh啟動(dòng)hadoop,觀察控制臺(tái)的輸出,見圖3-5,可以看到正在啟動(dòng)進(jìn)程,分別是namenode、datanode、secondarynamenode、jobtracker、tasktracker,一共5個(gè),待執(zhí)行完畢后,并不意味著這5個(gè)進(jìn)程成功啟動(dòng),上面僅僅表示系統(tǒng)正在啟動(dòng)進(jìn)程而已。
我們使用jdk的命令jps查看進(jìn)程是否已經(jīng)正確啟動(dòng)。執(zhí)行以下jps,如果看到了這5個(gè)進(jìn)程,見圖3-6,說明hadoop真的啟動(dòng)成功了。如果缺少一個(gè)或者多個(gè),那就進(jìn)入到“Hadoop的常見啟動(dòng)錯(cuò)誤”章節(jié)尋找原因了。
圖3-6
關(guān)閉hadoop的命令是stop-all.sh。
上面的命令是最簡(jiǎn)單的,可以一次性把所有節(jié)點(diǎn)都啟動(dòng)、關(guān)閉。除此之外,還有其他命令,是分別啟動(dòng)的。
第二種,分別啟動(dòng)HDFS和MapReduce:
圖3-7
執(zhí)行命令start-dfs.sh,是單獨(dú)啟動(dòng)hdfs,見圖3-7。執(zhí)行完該命令后,通過jps能夠看到NameNode、DataNode、SecondaryNameNode三個(gè)進(jìn)程啟動(dòng)了,該命令適合于只執(zhí)行hdfs存儲(chǔ)不使用MapReduce做計(jì)算的場(chǎng)景。關(guān)閉的命令就是stop-dfs.sh了。
圖3-8
執(zhí)行命令start-mapred.sh,可以單獨(dú)啟動(dòng)MapReduce的兩個(gè)進(jìn)程。關(guān)閉的命令就是stop-mapred.sh了。當(dāng)然,也可以先啟動(dòng)MapReduce,再啟動(dòng)HDFS。這說明,HDFS和MapReduce的進(jìn)程之間是互相獨(dú)立的,沒有依賴關(guān)系。
第三種,分別啟動(dòng)各個(gè)進(jìn)程:
| [root@book0 bin]# jps 14821 Jps [root@book0 bin]# hadoop-daemon.sh start namenode [root@book0 bin]# hadoop-daemon.sh start datanode [root@book0 bin]# hadoop-daemon.sh start secondarynamenode [root@book0 bin]# hadoop-daemon.sh start jobtracker [root@book0 bin]# hadoop-daemon.sh start tasktracker [root@book0 bin]# jps 14855 NameNode 14946 DataNode 15043 SecondaryNameNode 15196 TaskTracker 15115 JobTracker 15303 Jps |
執(zhí)行的命令是“hadoop-daemon.sh start [進(jìn)程名稱]”,這種啟動(dòng)方式適合于單獨(dú)增加、刪除節(jié)點(diǎn)的情況,在安裝集群環(huán)境的時(shí)候會(huì)看到。
5. 運(yùn)行簡(jiǎn)單的MapReduce計(jì)算
在$HADOOP_HOME下有個(gè)jar包,叫hadoop-example-1.1.2.jar,見圖3-9,這里面含有框架提供的很多例子.我們現(xiàn)在學(xué)習(xí)一下如何運(yùn)行其中的例子吧.
圖3-9
| hadoop jar hadoop-example-1.1.2.jar |
執(zhí)行如下命令
可以看到圖3-10的輸出信息,可以看到18個(gè)輸出信息,都是內(nèi)置的例子程序.我們選擇最后一個(gè)”word count”來運(yùn)行,該程序的說明在最后,是統(tǒng)計(jì)文件中單詞的出現(xiàn)次數(shù)的.
圖3-10
如何執(zhí)行這個(gè)程序哪?見圖3-11,如下
圖3-11
根據(jù)用法,我們需要補(bǔ)全wordcount的文件輸入路徑和文件輸出路徑.我們首先上傳一個(gè)文件到hdfs中,見圖3-12.那么輸入文件的路徑就是/README.txt了。
圖3-12
這時(shí)候我們?cè)龠\(yùn)行wordcount例子,命令如下
| hadoop jar hadoop-examples-1.1.2.jar wordcount /README.txt /wordcountoutput |
在這條命令中,“/README.txt”是我們剛才上傳到hdfs中的文件,作為輸入路徑;“/wordcountoutput”是設(shè)定的輸出路徑,該路徑在命令執(zhí)行前是不存在的。
等到命令執(zhí)行結(jié)束,運(yùn)行的結(jié)果就會(huì)存在輸出路徑的文件夾中,文件名稱叫做“part-r-00000”,我們使用命令查看輸出內(nèi)容,如圖3-13
圖3-13
以上只是顯示了一部分。顯示結(jié)果是按照字符的字段順序排列的,每一行顯示字符及出現(xiàn)次數(shù)。
如果讀者能夠成功運(yùn)行,那么恭喜你!你看到的就是hadoop的MapReduce做的事情。通過一個(gè)簡(jiǎn)單的命令,就可以把文件中的單詞統(tǒng)計(jì)一遍出現(xiàn)次數(shù),還是很有意思的。參加工作后,大家會(huì)根據(jù)輸入文件的內(nèi)容和類型,寫這樣的算法程序,產(chǎn)生輸出結(jié)果。
hadoop的核心思想
1.1.1. hadoop的核心思想
Hadoop包括兩大核心,分布式存儲(chǔ)系統(tǒng)和分布式計(jì)算系統(tǒng)。
1.1.1.1. 分布式存儲(chǔ)
為什么數(shù)據(jù)需要存儲(chǔ)在分布式的系統(tǒng)中哪,難道單一的計(jì)算機(jī)存儲(chǔ)不了嗎,難道現(xiàn)在的幾個(gè)TB的硬盤裝不下這些數(shù)據(jù)嗎?事實(shí)上,確實(shí)裝不下。比如,很多的電信通話記錄就存儲(chǔ)在很多臺(tái)服務(wù)器的很多硬盤中。那么,要處理這么多數(shù)據(jù),必須從一臺(tái)一臺(tái)服務(wù)器分別讀取數(shù)據(jù)和寫入數(shù)據(jù),太麻煩了!
我們希望有一種文件系統(tǒng),可以管轄很多服務(wù)器用于存儲(chǔ)數(shù)據(jù)。通過這個(gè)文件系統(tǒng)存儲(chǔ)數(shù)據(jù)時(shí),感覺不到是存儲(chǔ)到不同的服務(wù)器上的。當(dāng)讀取數(shù)據(jù)時(shí),感覺不到是從不同的服務(wù)器上讀取。如圖2-1所示。這就是分布式文件系統(tǒng)。
圖2-1
分布式文件系統(tǒng)管理的是一個(gè)服務(wù)器集群。在這個(gè)集群中,數(shù)據(jù)存儲(chǔ)在集群的節(jié)點(diǎn)(即集群中的服務(wù)器)中,但是該文件系統(tǒng)把服務(wù)器的差異屏蔽了。那么,我們就可以像使用普通的文件系統(tǒng)一樣使用,但是數(shù)據(jù)卻分散在不同的服務(wù)器中。
在分布式存儲(chǔ)系統(tǒng)中,分散在不同節(jié)點(diǎn)中的數(shù)據(jù)可能屬于同一個(gè)文件,為了組織眾多的文件,把文件可以放到不同的文件夾中,文件夾可以一級(jí)一級(jí)的包含。我們把這種組織形式稱為命名空間(namespace)。命名空間管理著整個(gè)服務(wù)器集群中的所有文件。很明顯,命名空間的職責(zé)與存儲(chǔ)真實(shí)數(shù)據(jù)的職責(zé)是不一樣的。集群中不同的節(jié)點(diǎn)承擔(dān)不同的職責(zé)。負(fù)責(zé)命名空間職責(zé)的節(jié)點(diǎn)稱為主節(jié)點(diǎn)(master node),負(fù)責(zé)存儲(chǔ)真實(shí)數(shù)據(jù)職責(zé)的節(jié)點(diǎn)稱為從節(jié)點(diǎn)(slave node)。主節(jié)點(diǎn)負(fù)責(zé)管理文件系統(tǒng)的文件結(jié)構(gòu),從節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)真實(shí)的數(shù)據(jù),稱為主從式結(jié)構(gòu)(master-slaves)。用戶操作時(shí),也應(yīng)該先和主節(jié)點(diǎn)打交道,查詢數(shù)據(jù)在哪些從節(jié)點(diǎn)上存儲(chǔ),然后再?gòu)膹墓?jié)點(diǎn)讀取,如圖2-2所示。在主節(jié)點(diǎn),為了加快用戶訪問的速度,會(huì)把整個(gè)命名空間信息都放在內(nèi)存中,當(dāng)存儲(chǔ)的文件越多時(shí),那么主節(jié)點(diǎn)就需要越多的內(nèi)存空間。在從節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)時(shí),有的原始數(shù)據(jù)文件可能很大,有的可能很小,大小不一的文件不容易管理,那么可以抽象出一個(gè)獨(dú)立的存儲(chǔ)文件單位,稱為塊(block)。數(shù)據(jù)存放在集群中,可能因?yàn)榫W(wǎng)絡(luò)原因或者服務(wù)器硬件原因造成訪問失敗,最好采用副本(replication)機(jī)制,把數(shù)據(jù)同時(shí)備份到多臺(tái)服務(wù)器中,這樣數(shù)據(jù)就安全了,數(shù)據(jù)丟失或者訪問失敗的概率就小了。
圖2-2
在以上的主從式結(jié)構(gòu)中,由于主節(jié)點(diǎn)含有整個(gè)文件系統(tǒng)的目錄結(jié)構(gòu)信息,因?yàn)榉浅V匾A硗?#xff0c;由于主節(jié)點(diǎn)運(yùn)行時(shí)會(huì)把命名空間信息都放到內(nèi)存中,因此存儲(chǔ)的文件越多,主節(jié)點(diǎn)的內(nèi)存就需要的越多。
在hadoop中,分布式存儲(chǔ)系統(tǒng)稱為HDFS(hadoop distributed file system)。其中,主節(jié)點(diǎn)稱為名字節(jié)點(diǎn)(namenode),從節(jié)點(diǎn)稱為數(shù)據(jù)節(jié)點(diǎn)(datanode)。
1.1.1.2. 分布式計(jì)算
對(duì)數(shù)據(jù)進(jìn)行處理時(shí),我們會(huì)把數(shù)據(jù)讀取到內(nèi)存中進(jìn)行處理。如果我們對(duì)海量數(shù)據(jù)進(jìn)行處理,比如數(shù)據(jù)大小是100GB,我們要統(tǒng)計(jì)文件中一共有多少個(gè)單詞。要想把數(shù)據(jù)都加載到內(nèi)存中幾乎是不可能的,稱為移動(dòng)數(shù)據(jù)。隨著技術(shù)發(fā)展,即使服務(wù)器有100GB內(nèi)存,那么服務(wù)器價(jià)格也會(huì)很高,不是普通老百姓能夠消受得了得。即使數(shù)據(jù)能夠加載到內(nèi)存,那么加載這100GB的數(shù)據(jù)到內(nèi)存也要消耗很長(zhǎng)時(shí)間。這些問題都在困撓著我們對(duì)大數(shù)據(jù)的處理。也就是說移動(dòng)計(jì)算的處理方式不適合大數(shù)據(jù)計(jì)算。
換個(gè)思路,既然移動(dòng)數(shù)據(jù)不合適,那么是否可以把程序代碼放到存放數(shù)據(jù)的服務(wù)器上哪?因?yàn)槌绦虼a與原始數(shù)據(jù)相比,一般很小,幾乎可以忽略的,所以省下了原始數(shù)據(jù)傳輸?shù)臅r(shí)間了。現(xiàn)在,數(shù)據(jù)是存放在分布式文件系統(tǒng)中,100GB的數(shù)據(jù)可能存放在很多的服務(wù)器上,那么就可以把程序代碼分發(fā)到這些服務(wù)器上,在這些服務(wù)器上同時(shí)執(zhí)行,也就是并行計(jì)算,也是分布式計(jì)算。這就大大縮短了程序的執(zhí)行時(shí)間。我們把程序代碼移動(dòng)到數(shù)據(jù)節(jié)點(diǎn)的機(jī)器上執(zhí)行的計(jì)算方式稱為移動(dòng)計(jì)算。
分布式計(jì)算需要的是最終的結(jié)果,程序代碼在很多機(jī)器上并行執(zhí)行后會(huì)產(chǎn)生很多的結(jié)果,因此需要有一段代碼對(duì)這些中間結(jié)果進(jìn)行匯總。Hadoop中的分布式計(jì)算一般是由兩階段完成的。第一階段負(fù)責(zé)讀取各數(shù)據(jù)節(jié)點(diǎn)中的原始數(shù)據(jù),進(jìn)行初步處理,對(duì)各個(gè)節(jié)點(diǎn)中的數(shù)據(jù)求單詞數(shù)。然后把處理結(jié)果傳輸?shù)降诙€(gè)階段,對(duì)中間結(jié)果進(jìn)行匯總,產(chǎn)生最終結(jié)果,求出100GB文件總共有多少個(gè)單詞,如圖2-3所示。
圖2-3
在分布式計(jì)算中,程序代碼應(yīng)該允許在哪些數(shù)據(jù)節(jié)點(diǎn)上,哪些節(jié)點(diǎn)運(yùn)行第一階段的代碼,哪些節(jié)點(diǎn)運(yùn)行第二階段的代碼;第一階段代碼執(zhí)行完畢后,傳輸?shù)降诙A段代碼所在的節(jié)點(diǎn);如果中間執(zhí)行失敗了,怎么辦?等等問題,都需要管理。運(yùn)行這些管理職責(zé)代碼的節(jié)點(diǎn)稱為主節(jié)點(diǎn)(master node),運(yùn)行第一二階段程序代碼的節(jié)點(diǎn)稱為從節(jié)點(diǎn)(slave node)。用戶的代碼應(yīng)該提交給主節(jié)點(diǎn),由主節(jié)點(diǎn)負(fù)責(zé)把代碼分配到不同的節(jié)點(diǎn)執(zhí)行。
在hadoop中,分布式計(jì)算部分稱為MapReduce。其中,主節(jié)點(diǎn)稱為作業(yè)節(jié)點(diǎn)(jobtacker),從節(jié)點(diǎn)稱為任務(wù)節(jié)點(diǎn)(tasktracker)。在任務(wù)節(jié)點(diǎn)中,運(yùn)行第一階段的代碼稱為map任務(wù)(map task),運(yùn)行第二階段的代碼稱為reduce任務(wù)(reduce task)。
總結(jié)
以上是生活随笔為你收集整理的Hadoop的伪分布安装 hadoop的核心思想的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSH基本原理和免密码登录
- 下一篇: 如何快速学习使用mybatis以及总结