Hadoop學(xué)習(xí)筆記(2)
——解讀Hello World
上一章中,我們把hadoop下載、安裝、運行起來,最后還執(zhí)行了一個Hello world程序,看到了結(jié)果。現(xiàn)在我們就來解讀一下這個Hello Word。
OK,我們先來看一下當(dāng)時在命令行里輸入的內(nèi)容:
$mkdir input
$cd input
$echo "hello world">test1.txt
$echo "hello hadoop">test2.txt
$cd ..
$bin/hadoop dfs -put input in
$bin/hadoop jar build/hadoop-0.20.2-examples.jar wordcount in out
$bin/hadoop dfs -cat out/*
第1行,容易理解,我們在hadoop文件夾下建了一個input子文件夾;
第2行,進(jìn)入input文件夾;
第3行,echo是指回顯示,可以理解為print, 大于符(>)為重定向,正常echo是顯示在屏幕上,而用了重定向后,即內(nèi)容顯示在了text1.txt文件里。那這句話意思是,創(chuàng)建一個test1.txt文件,其內(nèi)容是"hello world"。 第4行類同;
第5行,回上一級目錄
第6行,這里運行了一個hadoop命令, 參數(shù)為 dfs –put input in 意思是將input文件夾上傳到hadoop文件系統(tǒng)中,并存于目錄in中。
第7行,同樣是hadoop命令,參數(shù) jar XXX.jar wordcount in out 是指運行jar程序中wordcount類的程序,并傳入?yún)?shù) in out。 in 為輸入目錄 out 為輸出結(jié)果目錄,兩個目錄皆為hadoop文件系統(tǒng)中的目錄,而并不是當(dāng)前操作系統(tǒng)目錄了。在第7行后,會看到屏幕在刷,是在計算。
第8行,cat是linux常用的命令,是將指定文件中的文本內(nèi)容輸出。 所以這里 cat out/* 是指把out文件夾下所有文件的文本內(nèi)容輸出,同時注意這里是dfs即是在hadoop文件系統(tǒng)中,且這個out正是第7步程序中輸出的目錄。所以輸入該命令后,我們看到了下面的結(jié)果:

這個簡單的程序目的是什么,其實比較容易看出來了,就是統(tǒng)計每個文件中的單詞出現(xiàn)的數(shù)量,并將結(jié)果合并后顯示出來。
可能有人就想,有什么啊,這程序我們C#、java幾行代碼也就實現(xiàn)了,有什么特別的?的確,初看過程就是。但我們深入來看一下。Hadoop的框架最核心的設(shè)計就是:HDFS和MapReduce。
HDFS就是分布式數(shù)據(jù)存儲,這就不一樣了,也就是說我的這里需要統(tǒng)計的文件很多的話,可能就不存在一臺機(jī)器上了,而且存在不同機(jī)器上,不需要我們?nèi)藶榭刂?,而是交給Hadoop自動完成,而我們,只需要統(tǒng)一的接口(bin/Hadoop dfs)來訪問:

MapReduce當(dāng)然就是負(fù)責(zé)計算咯,回頭一想,的確這程序不簡單,統(tǒng)計一個文件單詞出現(xiàn)的頻率容易,但時如果這些文件是分布在不同機(jī)器上,然后又需要將結(jié)果能很方便的合并起來,那就不是簡單幾行代碼就能搞定的了。所以MapReduce就是來負(fù)責(zé)這一塊的。
看到這里,我們就理解了上面的hello world,但是馬上會想,這個hadoop有哪些應(yīng)用場景呢?或為什么它這現(xiàn)在這么牛,這么流行?
現(xiàn)在是一個大數(shù)據(jù)時代,首先是一個存儲問題,hadoop提供了一個很好的分布式文件系統(tǒng),方便我們存大量數(shù)據(jù),同時提供了統(tǒng)一接口。
其次,擁有了大數(shù)據(jù),不代表能產(chǎn)生價值,在產(chǎn)生價值,就必須利用這些數(shù)據(jù)進(jìn)行計算(查詢、分析等),但時傳統(tǒng)的計算就是在一臺或多臺機(jī)器上部署程序,然后把數(shù)據(jù)獲通過接口抓取到程序里進(jìn)行分析,這稱之為移動數(shù)據(jù)。而hadoop不是,而是把程序自動分發(fā)到各hadoop結(jié)點上進(jìn)行計算,然后通過一定機(jī)制把結(jié)果進(jìn)行匯總最后返回出來,這稱之為移動計算。顯然,移動計算要比移動數(shù)據(jù)成本要低得多。
應(yīng)用場景之一:就是搜索引擎,現(xiàn)在互聯(lián)網(wǎng)數(shù)據(jù)海量,如何存儲并搜索成為難點,那hadoop的兩大核心框架就正符合這用處,用網(wǎng)絡(luò)爬蟲取來的海量網(wǎng)頁數(shù)據(jù)存于分布式庫,然后當(dāng)去搜索時,通過各子結(jié)點并發(fā)搜索,將數(shù)據(jù)返回合并后展示。 而hadoop的產(chǎn)生,也就是在google在2003年到2004年公布了關(guān)于GFS、MapReduce和BigTable三篇技術(shù)論文,即google的三駕馬車。Hadoop的HDFS對就google的GFS,MapReduce對就google的MapReduce,Hadoop的HBase對應(yīng)google的BigTable。 (注:HBase是其于hadoop開發(fā)的類似數(shù)據(jù)操作的軟件)。
應(yīng)用場景之二:生物醫(yī)療,大量DNA數(shù)據(jù)存儲,同時要進(jìn)行比對工作,用Hadoop再合式不過了。
當(dāng)然還有N多其他應(yīng)用場景……
到現(xiàn)在hadoop的核心價值總算摸清了,一是分布式存儲,二是移動計算。
為了支撐這些功能,肯定會用到不少的進(jìn)程,現(xiàn)在我們就來了解下這些進(jìn)程以及相應(yīng)的命令。
我們知道,運行$bin/start-all.sh來啟動整個hadoop。然后運行$bin/jps可以看到所有運行的進(jìn)程:

這些進(jìn)程現(xiàn)在是安裝在同一臺機(jī)器上的,而實際分布式部署時,如下圖:

NameNode:是HDFS的守護(hù)進(jìn)程,負(fù)責(zé)記錄文件是如何分割成數(shù)據(jù)塊以及分配存儲到哪個DataNode節(jié)點上,對內(nèi)存及I/O進(jìn)行集中管理。一個系統(tǒng)中只會有一個NameNode。
DataNode:數(shù)據(jù)結(jié)點,負(fù)責(zé)將數(shù)據(jù)包讀寫到硬盤上。當(dāng)客戶端需要數(shù)據(jù)通訊時,先問NameNode獲取存放到哪個DataNode,然后,客戶端直接與DataNode進(jìn)行通訊。
SecondaryNameNode:用來監(jiān)控HDFS狀態(tài)的輔助進(jìn)程。與NameNode不同的時,它不接收或記錄任何實時的數(shù)據(jù)變化,只與NameNode進(jìn)行通信,以便定期地保存HDFS元數(shù)據(jù)的快照。由于NameNode是單點的,通過SecondaryNameNode的快照功能,可以將NameNode的宕機(jī)時間和數(shù)據(jù)損失降低到最小。同時NameNode發(fā)生問題時,Secondary NameNode可以及時地作為備用NameNode使用。
JobTracker:應(yīng)用程序與Hadooop之間的紐帶,代碼提交到集群上,JobTracker將會確定執(zhí)行計劃,包括決定處理哪些文件,為不同的任務(wù)分配節(jié)點以及監(jiān)察所有任務(wù)的運行,如果任務(wù)失敗,JobTracker將會自動重啟,但分配的節(jié)點可能會不同。
TaskTracker:負(fù)責(zé)執(zhí)行由JobTracker分配的單項任務(wù),雖然單個結(jié)點上只有一個TaskTracker,但可以利用多個JVM(Java虛擬機(jī))并行處理多個Map或reduce任務(wù)。
了解了進(jìn)程后,我們再來了解下有哪些文件操作命令,
bin/hadoop是一個批處理sh文件(與bat類似),運行時需要輸入子命令。子命令列表如下:

這里比較清楚了,各個子命令的描述,但這里有下fs,是我們常用的,同里里面會還有N多子命令,比如bin/hadoop fs -ls 列出文件內(nèi)容。
其它fs參數(shù)清單如下:
命令
說明
[-ls ]
列出文件夾下的內(nèi)容
[-lsr ]
遞歸列出文件夾下的內(nèi)容
[-du ]
顯示文件點用空間
[-mv ]
移動文件
[-cp ]
復(fù)制文件
[-rm [-skipTrash] ]
刪除文件
[-rmr [-skipTrash] ]
刪除文件夾
[-put ... ]
將本地文件上傳到服務(wù)器上
[-copyFromLocal ... ]
將服務(wù)器文件下載到本地
[-moveFromLocal ... ]
將服務(wù)器文件移至到本地
[-get [-ignoreCrc] [-crc] ]
將服務(wù)器文件下載到本地
[-getmerge [addnl]]
將服務(wù)器文件夾內(nèi)文件合并后下載到本地
[-cat ]
顯示文件的文本內(nèi)容
[-text ]
顯示文件文本內(nèi)容
[-copyToLocal [-ignoreCrc] [-crc] ]
復(fù)制文件(夾)到本地
[-moveToLocal [-crc] ]
移動文件(夾)到本地
[-mkdir ]
創(chuàng)建文件夾
[-setrep [-R] [-w] ]
設(shè)置文件的復(fù)制數(shù)量
[-touchz ]
寫一個時間戳放在文件同級目錄
[-test -[ezd] ]
測試文件是否存在
[-stat [format] ]
返回文件狀態(tài)
[-tail [-f] ]
顯示文件最后1KB的內(nèi)容
[-chmod [-R] PATH...]
修改文件(夾)屬性
[-chown [-R] [OWNER][:[GROUP]] PATH...]
修改文件owner屬性
[-chgrp [-R] GROUP PATH...]
修改文件(夾)屬性
[-help [cmd]]
顯示幫助
需要案例實戰(zhàn)的可以戳這里http://www.bdtbus.com