Hadoop學習筆記(2)
——解讀Hello World
上一章中,我們把hadoop下載、安裝、運行起來,最后還執行了一個Hello world程序,看到了結果。現在我們就來解讀一下這個Hello Word。
OK,我們先來看一下當時在命令行里輸入的內容:
-
$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行,進入input文件夾;
第3行,echo是指回顯示,可以理解為print, 大於符(>)為重定向,正常echo是顯示在屏幕上,而用了重定向后,即內容顯示在了text1.txt文件里。那這句話意思是,創建一個test1.txt文件,其內容是"hello world"。 第4行類同;
第5行,回上一級目錄
第6行,這里運行了一個hadoop命令, 參數為 dfs –put input in 意思是將input文件夾上傳到hadoop文件系統中,並存於目錄in中。
第7行,同樣是hadoop命令,參數 jar XXX.jar wordcount in out 是指運行jar程序中wordcount類的程序,並傳入參數 in out。 in 為輸入目錄 out 為輸出結果目錄,兩個目錄皆為hadoop文件系統中的目錄,而並不是當前操作系統目錄了。在第7行后,會看到屏幕在刷,是在計算。
第8行,cat是linux常用的命令,是將指定文件中的文本內容輸出。 所以這里 cat out/* 是指把out文件夾下所有文件的文本內容輸出,同時注意這里是dfs即是在hadoop文件系統中,且這個out正是第7步程序中輸出的目錄。所以輸入該命令后,我們看到了下面的結果:
這個簡單的程序目的是什么,其實比較容易看出來了,就是統計每個文件中的單詞出現的數量,並將結果合並后顯示出來。
可能有人就想,有什么啊,這程序我們C#、java幾行代碼也就實現了,有什么特別的?的確,初看過程就是。但我們深入來看一下。Hadoop的框架最核心的設計就是:HDFS和MapReduce。
HDFS就是分布式數據存儲,這就不一樣了,也就是說我的這里需要統計的文件很多的話,可能就不存在一台機器上了,而且存在不同機器上,不需要我們人為控制,而是交給Hadoop自動完成,而我們,只需要統一的接口(bin/Hadoop dfs)來訪問:
MapReduce當然就是負責計算咯,回頭一想,的確這程序不簡單,統計一個文件單詞出現的頻率容易,但時如果這些文件是分布在不同機器上,然后又需要將結果能很方便的合並起來,那就不是簡單幾行代碼就能搞定的了。所以MapReduce就是來負責這一塊的。
看到這里,我們就理解了上面的hello world,但是馬上會想,這個hadoop有哪些應用場景呢?或為什么它這現在這么牛,這么流行?
現在是一個大數據時代,首先是一個存儲問題,hadoop提供了一個很好的分布式文件系統,方便我們存大量數據,同時提供了統一接口。
其次,擁有了大數據,不代表能產生價值,在產生價值,就必須利用這些數據進行計算(查詢、分析等),但時傳統的計算就是在一台或多台機器上部署程序,然后把數據獲通過接口抓取到程序里進行分析,這稱之為移動數據。而hadoop不是,而是把程序自動分發到各hadoop結點上進行計算,然后通過一定機制把結果進行匯總最后返回出來,這稱之為移動計算。顯然,移動計算要比移動數據成本要低得多。
應用場景之一:就是搜索引擎,現在互聯網數據海量,如何存儲並搜索成為難點,那hadoop的兩大核心框架就正符合這用處,用網絡爬蟲取來的海量網頁數據存於分布式庫,然后當去搜索時,通過各子結點並發搜索,將數據返回合並后展示。 而hadoop的產生,也就是在google在2003年到2004年公布了關於GFS、MapReduce和BigTable三篇技術論文,即google的三駕馬車。Hadoop的HDFS對就google的GFS,MapReduce對就google的MapReduce,Hadoop的HBase對應google的BigTable。 (注:HBase是其於hadoop開發的類似數據操作的軟件)。
應用場景之二:生物醫療,大量DNA數據存儲,同時要進行比對工作,用Hadoop再合式不過了。
當然還有N多其他應用場景……
到現在hadoop的核心價值總算摸清了,一是分布式存儲,二是移動計算。
為了支撐這些功能,肯定會用到不少的進程,現在我們就來了解下這些進程以及相應的命令。
我們知道,運行$bin/start-all.sh來啟動整個hadoop。然后運行$bin/jps可以看到所有運行的進程:
這些進程現在是安裝在同一台機器上的,而實際分布式部署時,如下圖:
NameNode:是HDFS的守護進程,負責記錄文件是如何分割成數據塊以及分配存儲到哪個DataNode節點上,對內存及I/O進行集中管理。一個系統中只會有一個NameNode。
DataNode:數據結點,負責將數據包讀寫到硬盤上。當客戶端需要數據通訊時,先問NameNode獲取存放到哪個DataNode,然后,客戶端直接與DataNode進行通訊。
SecondaryNameNode:用來監控HDFS狀態的輔助進程。與NameNode不同的時,它不接收或記錄任何實時的數據變化,只與NameNode進行通信,以便定期地保存HDFS元數據的快照。由於NameNode是單點的,通過SecondaryNameNode的快照功能,可以將NameNode的宕機時間和數據損失降低到最小。同時NameNode發生問題時,Secondary NameNode可以及時地作為備用NameNode使用。
JobTracker:應用程序與Hadooop之間的紐帶,代碼提交到集群上,JobTracker將會確定執行計划,包括決定處理哪些文件,為不同的任務分配節點以及監察所有任務的運行,如果任務失敗,JobTracker將會自動重啟,但分配的節點可能會不同。
TaskTracker:負責執行由JobTracker分配的單項任務,雖然單個結點上只有一個TaskTracker,但可以利用多個JVM(Java虛擬機)並行處理多個Map或reduce任務。
了解了進程后,我們再來了解下有哪些文件操作命令,
bin/hadoop是一個批處理sh文件(與bat類似),運行時需要輸入子命令。子命令列表如下:
這里比較清楚了,各個子命令的描述,但這里有下fs,是我們常用的,同里里面會還有N多子命令,比如bin/hadoop fs -ls 列出文件內容。
其它fs參數清單如下:
命令 |
說明 |
[-ls <path>] |
列出文件夾下的內容 |
[-lsr <path>] |
遞歸列出文件夾下的內容 |
[-du <path>] |
顯示文件點用空間 |
[-mv <src> <dst>] |
移動文件 |
[-cp <src> <dst>] |
復制文件 |
[-rm [-skipTrash] <path>] |
刪除文件 |
[-rmr [-skipTrash] <path>] |
刪除文件夾 |
[-put <localsrc> ... <dst>] |
將本地文件上傳到服務器上 |
[-copyFromLocal <localsrc> ... <dst>] |
將服務器文件下載到本地 |
[-moveFromLocal <localsrc> ... <dst>] |
將服務器文件移至到本地 |
[-get [-ignoreCrc] [-crc] <src> <localdst>] |
將服務器文件下載到本地 |
[-getmerge <src> <localdst> [addnl]] |
將服務器文件夾內文件合並后下載到本地 |
[-cat <src>] |
顯示文件的文本內容 |
[-text <src>] |
顯示文件文本內容 |
[-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>] |
復制文件(夾)到本地 |
[-moveToLocal [-crc] <src> <localdst>] |
移動文件(夾)到本地 |
[-mkdir <path>] |
創建文件夾 |
[-setrep [-R] [-w] <rep> <path/file>] |
設置文件的復制數量 |
[-touchz <path>] |
寫一個時間戳放在文件同級目錄 |
[-test -[ezd] <path>] |
測試文件是否存在 |
[-stat [format] <path>] |
返回文件狀態 |
[-tail [-f] <file>] |
顯示文件最后1KB的內容 |
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] |
修改文件(夾)屬性 |
[-chown [-R] [OWNER][:[GROUP]] PATH...] |
修改文件owner屬性 |
[-chgrp [-R] GROUP PATH...] |
修改文件(夾)屬性 |
[-help [cmd]] |
顯示幫助 |