Hadoop學(xué)習(xí)之旅一:Hello Hadoop
開篇概述
隨著計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)設(shè)施的完善,社交網(wǎng)絡(luò)和電商的發(fā)展以及物連網(wǎng)的推進(jìn),產(chǎn)生了越來越多的大數(shù)據(jù),使得人工智能最近幾年也有了長(zhǎng)足的發(fā)展(可供機(jī)器學(xué)習(xí)的樣本數(shù)據(jù)量足夠大了),大數(shù)據(jù)的存儲(chǔ)和處理也越來越重要,國(guó)家對(duì)此也比較重視(可上網(wǎng)搜索關(guān)鍵字“大數(shù)據(jù)白皮書”關(guān)鍵字,以了解詳細(xì)情況),會(huì)長(zhǎng)決定和年輕人也一塊兒學(xué)習(xí)一下,于是報(bào)了網(wǎng)易云課堂的課程,不定時(shí)將學(xué)習(xí)到的東西整理為博客,此乃開篇。
學(xué)習(xí)大數(shù)據(jù)必先學(xué)習(xí)Hadoop,因?yàn)樗悄壳笆澜缟献盍餍械姆植际綌?shù)據(jù)處理框架。
Tips:所謂大數(shù)據(jù),是指數(shù)據(jù)量龐大、產(chǎn)生數(shù)度快、結(jié)構(gòu)多樣的價(jià)值密度低的數(shù)據(jù)。其中,數(shù)據(jù)量龐大是指數(shù)據(jù)規(guī)模超出了1,2臺(tái)高性能主機(jī)所能處理范圍;結(jié)構(gòu)多樣性是指除了關(guān)系型數(shù)據(jù)庫(kù)能夠處理的結(jié)構(gòu)化數(shù)據(jù)還包含半結(jié)構(gòu)化數(shù)據(jù)(如各類傳感設(shè)備必如地鎊、衛(wèi)星、GPS設(shè)備等產(chǎn)生的純文本格式的數(shù)據(jù),還有良心網(wǎng)站NASA官網(wǎng)公布的txt格式的空間天氣數(shù)據(jù)等成行成列的數(shù)據(jù))和非結(jié)構(gòu)化數(shù)據(jù)(視頻、圖像等)。這些數(shù)據(jù)的價(jià)值密度普遍較低(和具體的應(yīng)用范圍也有關(guān)系,比如NASA的數(shù)據(jù),如果想知道某天的太陽(yáng)射電情況,看當(dāng)天發(fā)布的txt就好了,價(jià)值密度很高,但是這就不算大數(shù)據(jù)了,因?yàn)樾枰杉臄?shù)據(jù)量很小;如果想知道過去N年太陽(yáng)射電的極值就需要處理很多數(shù)據(jù),這些數(shù)據(jù)的價(jià)值密度就低了),大數(shù)據(jù)處理的目的就是從價(jià)值密度的數(shù)據(jù)里把有價(jià)值的數(shù)據(jù)過濾分析出來。
Hadoop概述
Hadoop是一個(gè)用于分布式大數(shù)據(jù)處理的編程框架。同時(shí)它也是個(gè)大數(shù)據(jù)處理完整的生態(tài)系統(tǒng),圍繞著Hadoop,這個(gè)生態(tài)系統(tǒng)還包括但不限于:
HBase
Hive
Pig
Spark
ZooKeeper
希望本系列的寫作能夠堅(jiān)持下去,對(duì)上述內(nèi)容都有所涉及吧。
Hadoop能干什么
假設(shè)老王在某不知名IT公司工作,由于最近太陽(yáng)活動(dòng)異常,引起了領(lǐng)導(dǎo)的外甥的讀碩士的同學(xué)的關(guān)注,領(lǐng)導(dǎo)讓老王把山西鐵島太陽(yáng)射電望遠(yuǎn)鏡觀測(cè)到的近30年的太陽(yáng)射電數(shù)據(jù)下載下來,讓老王從里面找到最高的記錄。老王畢竟搞挨踢已有多年,雖然技術(shù)不行,終日碌碌無為,但多年的直覺告訴老王這個(gè)很簡(jiǎn)單。老王立刻下載了其中一個(gè)文件并大致看了文件的機(jī)構(gòu):數(shù)據(jù)保存在txt文件里,每行N列,其中包含了時(shí)間和數(shù)據(jù)信息列,大約每0.1s記錄一條數(shù)據(jù),一個(gè)文件記錄15分鐘的數(shù)據(jù),大約有9000條記錄,1個(gè)小時(shí)4個(gè)文件,1天96個(gè)文件,30年大約1051200個(gè)文件,一共大約100億條數(shù)據(jù),這其中還有一些損壞的文件,還有一些用9999表示的未檢測(cè)到值的占位數(shù)據(jù)需要特殊照顧。
老王覺得單機(jī)處理這些數(shù)據(jù)耗時(shí)太久,于是老王找來一些公司淘汰下來的舊服務(wù)器(一般小公司最破的機(jī)器都是服務(wù)器),準(zhǔn)備每個(gè)機(jī)器負(fù)責(zé)一部分,最后把結(jié)果匯總,老王在開發(fā)的過程中還是遇到了很多問題,比如,如何分配任務(wù),有的機(jī)器破,有的機(jī)器新,還有的文件大,有的文件小,總是不能保證所有的任務(wù)一起完成,先完成任務(wù)的機(jī)器閑置浪費(fèi)掉了資源;還有最后把結(jié)果通過網(wǎng)絡(luò)通信匯總起來,如何保證數(shù)據(jù)不丟失,不覆蓋;還有如果某臺(tái)機(jī)器出了問題,如何重新分配任務(wù),這些非核心業(yè)務(wù)的開發(fā)使得老王心力憔悴,還好,老王最后找到了Hadoop這個(gè)工具,這個(gè)工具給老王提供了一個(gè)簡(jiǎn)單的編程模型,老王在map方法中寫了分配的任務(wù)的邏輯,在reduce方法中寫了合并結(jié)果的邏輯,然后Hadoop幫老王完成了其他所有事情,Hadoop就是干這個(gè)的。以上故事純屬虛構(gòu),如有雷同,實(shí)屬巧合。
其實(shí)上述意淫的例子里的數(shù)據(jù)量不是很大,如果每天產(chǎn)生上TB級(jí)別的數(shù)據(jù),就算是速度很快的固態(tài)硬盤也需要小時(shí)級(jí)時(shí)間才能讀取一遍,速度還是遠(yuǎn)遠(yuǎn)跟不上,終歸有上限,而且高性能主機(jī)價(jià)格不菲,不如把數(shù)據(jù)分開放到一個(gè)相對(duì)廉價(jià)又可擴(kuò)展的計(jì)算機(jī)集群中,每個(gè)節(jié)點(diǎn)上運(yùn)行一段程序并處理一小塊數(shù)據(jù),然后在匯總處理結(jié)果,使用Hadoop可以讓開發(fā)者不必把精力放在集群的建設(shè)上,采用Hadoop提供的簡(jiǎn)單的編程模型就可以實(shí)現(xiàn)分布式處理。
Hadoop的構(gòu)造模塊
Hadoop集群中運(yùn)行的守護(hù)進(jìn)程共有5類:
NameNode
DataNode
Secondary NameNode
JobTracker
TaskTracker
Hadoop集群中的機(jī)器(節(jié)點(diǎn))分為2類:主節(jié)點(diǎn)和從節(jié)點(diǎn),NameNode、JobTracker所在節(jié)點(diǎn)為主節(jié)點(diǎn)(負(fù)責(zé)管理),DataNode和TaskTracker所在節(jié)點(diǎn)為從節(jié)點(diǎn)(負(fù)責(zé)干活兒)。
NameNode
NameNode節(jié)點(diǎn)負(fù)責(zé)將一個(gè)文件分成若干文件塊,并記錄了HDFS文件系統(tǒng)中的文件塊放了在哪些DataNode中(一個(gè)數(shù)據(jù)塊被冗余地放到1個(gè)或多個(gè)DataNode節(jié)點(diǎn)中),一個(gè)集群中只有一個(gè)NameNode節(jié)點(diǎn)(Hadoop2.X中情況有所不同了),且該節(jié)點(diǎn)通常不再運(yùn)行DataNode和TaskTracker守護(hù)進(jìn)程。
DataNode
DataNode實(shí)際管理很多NameNode分配給它的很多數(shù)據(jù)塊,當(dāng)有文件塊變動(dòng)時(shí)會(huì)通知NameNode,同時(shí)也從NameNode接受指令。一個(gè)集群中有多個(gè)DataNode節(jié)點(diǎn),DataNode之間也會(huì)保持聯(lián)系,復(fù)制冗余文件塊,這樣當(dāng)一個(gè)DataNode出現(xiàn)故障后不會(huì)影響到文件的完整性。
Secondary NameNode
SNN只與NameNode通信,定時(shí)獲取HDFS元數(shù)據(jù)的快照,一個(gè)集群只有一個(gè)SNN,且SNN所在節(jié)點(diǎn)只運(yùn)行SNN守護(hù)進(jìn)程,不干其它的事情。當(dāng)NameNode出現(xiàn)故障后,可以人工啟用SNN作為NameNode。
JobTracker
JobTracker負(fù)責(zé)分配MapReduce任務(wù)給TaskTracker,負(fù)責(zé)監(jiān)控任務(wù)的執(zhí)行,如任務(wù)失敗后重啟任務(wù)。JobTracker守護(hù)進(jìn)程運(yùn)行在主節(jié)點(diǎn)上,通常該節(jié)點(diǎn)不運(yùn)行DataNode和TaskTracker守護(hù)進(jìn)程。
TaskTracker
TaskTracker負(fù)責(zé)完成JobTracker分配的任務(wù)并和JobTranker進(jìn)行通信,回報(bào)情況。TaskTracker守護(hù)進(jìn)程運(yùn)行在多個(gè)子節(jié)點(diǎn)上
看圖說話
上圖中,NameNode和JobTracker是分開的,如果集群規(guī)模不大也可以運(yùn)行在同一個(gè)節(jié)點(diǎn)上(如果這個(gè)節(jié)點(diǎn)出現(xiàn)故障該如何恢復(fù)?)
安裝Hadoop
在安裝Hadoop之前需要先安裝如下軟件:
JDK
ssh
sshd
ssh-kengen
我用的是Ubuntu16.04,已經(jīng)預(yù)裝了ssh和ssh-kengen了,只需要安裝jdk和sshd,可以通過執(zhí)行命令which命令來檢查是否安裝了某軟件,如which sshd安裝JDK8
下載壓縮包解壓即可:
sudo mkdir /usr/local/lib/jvm
sudo tar -zxv -f ~/setupFiles/jdk-8u101-linux-x64.tar.gz -C /usr/local/lib/jvm
配置環(huán)境變量:
修改 /etc/profile文件,追加:
export JAVA_HOME=/usr/local/lib/jvm/jdk1.8.0_101 export PATH=$JAVA_HOME/bin:$PATH
配置完畢后執(zhí)行命令source /etc/profile,此刻通過echo $JAVA_HOME應(yīng)該能看到剛才設(shè)置的了。
安裝sshd
sudo apt install openssh-server
安裝完了sshd后應(yīng)該可以通過ssh lcoalhost命令遠(yuǎn)程訪問了,但是需要輸入密碼,Hadoop集群節(jié)點(diǎn)間要進(jìn)行通信需要配置為無密碼登錄方式。
無密碼ssh登錄設(shè)置
執(zhí)行如下命令:
ssh-keygen -t rsacat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 0600 ~/.ssh/authorized_keys
其中,執(zhí)行ssh-keygen命令時(shí)一路回車不要輸入密碼,執(zhí)行完畢后會(huì)在/home/userName/.ssh路徑下生成公鑰和私鑰id_rsa和id_rsa.pub。如果一切順利的話,現(xiàn)在可以通過ssh localhost無密碼登錄了
安裝Hadoop
我下載的是1.0.4版本(2.X版本和1.X版本有著很大的差別,還是先學(xué)會(huì)1.X再看2.X吧,我們的課程也是以1.X為例的,事實(shí)上我剛才下的2.X,發(fā)現(xiàn)很多東西不懂,又退回1.X了,:-)),先把下載下來的壓縮包解壓到~/wiley/hadoop(其實(shí)最好放按照Linux的習(xí)慣放到/usr/local下,然后把hadoop目錄及里面的文件所屬用戶和所屬組改成當(dāng)前用戶和當(dāng)前用戶所屬組)
解壓后配置文件conf/hadoop-env.sh文件中的JAVA_HOME,反注釋如下行
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun,并且設(shè)置為相應(yīng)的Java所在路徑。
Hadoop可以在三種模式下工作:
單節(jié)點(diǎn)模式
偽分布式模式
分布式模式
工作環(huán)境下是分布式模式,開發(fā)環(huán)境下可以使用單節(jié)點(diǎn)模式或偽分布式模式,方便調(diào)試。解壓后不做配置就是單節(jié)點(diǎn)模式,而偽分布式模式意思是指集群中的各個(gè)節(jié)點(diǎn)實(shí)際配置為同一臺(tái)機(jī)器。下面的步驟用來配置偽分布式模式:
配置conf/core-site.xml
配置conf/hdfs-site.xml
配置conf/mapred-site.xml
啟動(dòng)Hadoop
在啟動(dòng)之前先格式和HDFS文件系統(tǒng):
cd ~/wiley/hadoop/bin ./hadoop namenode -format
然后啟動(dòng)Hadoop:./start-all.sh,如果一切順利的話用jps命令查看會(huì)有5個(gè)進(jìn)程(不包括jps本身):
此時(shí)可以打開兩個(gè)基于Web的界面
http://localhost:50070 :HDFS的狀態(tài)
http://localhost:50030 :MapReduce作業(yè)運(yùn)行狀態(tài)
運(yùn)行例子WordCount
文章的最后運(yùn)行一個(gè)簡(jiǎn)單的MapReduceJob:單詞統(tǒng)計(jì)。Hadoop中已經(jīng)附有一些實(shí)例Java代碼,放在了hadoop/src/examples/org/apache/hadoop/examples,其中一個(gè)叫做WordCount.java,是用來統(tǒng)計(jì)文件中單詞數(shù)量的,代碼很簡(jiǎn)單的,大家可以去看看。此處先運(yùn)行一下這個(gè)例子感受一下,執(zhí)行如下命令
mkdir test
mkdir test/classes
mkdir test/src
cp src/examples/org/apache/hadoop/examples/WordCount.java test/src
生成jar文件:
javac -classpath hadoop-core-1.0.4.jar:lib/commons-cli-1.2.jar -d test/classes test/src/WordCount.java
jar -cvf test/WordCount.jar -C test/classes/ .
運(yùn)行該程序需要兩個(gè)參數(shù)(可參考源碼文件),一個(gè)是放置文本文件的input路徑,一個(gè)是輸出結(jié)果的output路徑,先在HDFS中創(chuàng)建之:
bin/hadoop dfs -mkdir input
在本地文件系統(tǒng)中創(chuàng)建一個(gè)文本文件test/f1.txt,寫入一句話:2b or not 2b is ff,把文件put到HDFS里:
bin/hadoop fs -put test/f1.txt /user/joey/input
激動(dòng)人心的時(shí)刻到了:
bin/hadoop jar test/WordCount.jar org.apache.hadoop.examples.WordCount input output
由于input和output位于/user/joey下面,而/user/joey是默認(rèn)的工作目錄,所有直接寫input和output,不用在前面加/user/joey/?,F(xiàn)在看看運(yùn)行結(jié)果:
更多大數(shù)據(jù)與分析相關(guān)行業(yè)資訊、解決方案、案例、教程等請(qǐng)點(diǎn)擊查看>>>
詳情請(qǐng)咨詢在線客服!
客服熱線:023-66090381