Hadoop學習筆記(2) ——解讀Hello World


Hadoop學習筆記(2)

——解讀Hello World

上一章中,我們把hadoop下載、安裝、運行起來,最后還執行了一個Hello world程序,看到了結果。現在我們就來解讀一下這個Hello Word。

 

OK,我們先來看一下當時在命令行里輸入的內容:

  1. $mkdir input
  2. $cd input
  3. $echo "hello world">test1.txt
  4. $echo "hello hadoop">test2.txt
  5. $cd ..
  6. $bin/hadoop dfs -put input in
  7. $bin/hadoop jar build/hadoop-0.20.2-examples.jar wordcount in out
  8. $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]]

顯示幫助

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM