Hadoop學習筆記(1)
——菜鳥入門
Hadoop是什么?先問一下百度吧:
【百度百科】一個分布式系統基礎架構,由Apache基金會所開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力進行高速運算和存儲。 Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬件上;而且它提供高傳輸率(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統中的數據。Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數據提供了存儲,則MapReduce為海量的數據提供了計算。
Hadoop主要用於一些分布式計算。在這個大數據年代,那這個的確是一個很不錯的工具。所以很有必要來學一學。
如何開展這個學習呢,不管怎樣,學習一樣新東西,我喜歡這樣的順序:先依葫蘆畫瓢,一步一步行將其運行起來,再來分析一些應用場景及運行的情況,然后深入看一下其高級應用, 最后由於這個是一個開源產品,正好來借此機會來讀一讀大牛們的代碼,學學其精華。
好了,開始行動:
-
運行環境搭建
首先,這個是需要運行在linux系統中的,所以得安裝個linux才行,市面上有很多個linux的版本,如紅帽子、Fedra、Ubuntu。選哪種呢,對我這種習慣windows的來說,當然要使用方便的,所以選擇了Ubuntu。
安裝Ubuntu,這里我就不多說了,在官網上有很多,其實也很簡單,一路下一步。當然這里可以安裝在Vmware虛擬機上,也可以直接安裝在硬盤上。 我個人建議,可以直接安裝在硬盤上,與現有windows做個雙系統。因為后面還要跑開發環境 eclipse,在虛擬機上會有點吃力。 同時安裝在硬盤上后,還可以這樣玩,在進入windows后,安裝 vmware,然后新建虛擬機后,不要創建硬盤,直接使用硬盤的分區,這樣, 就可以在vmware中啟動安裝在硬盤上的ubuntu了。做到雙系統,雙啟動。
這樣好處是,當要開發時,可以直接進ubuntu系統,當只是看看代碼,以及后面模擬分布式部署時,就可以用vmware來啟動,同時再建上幾個虛擬機來進行分布式部署。
操作系統准備好后,就需要一些組件了,hadoop比較簡單,只需要ssh和java環境,再加個下代碼的SVN。
先用 sudo apt-get install subversion ssh ant 這個命令,把SSH、Ant和SVN安裝起來。
java環境,可以在網上下載一個JDK安裝包,如:jdk-6u24-linux-i586.bin
安裝直接在目錄下運行./jdk-6u24-linux-i586.bin即可。
然后配置jdk目錄:
先進入安裝目錄 cd jdk-6u24-…
然后輸入 PWD 就可以看到java安裝目錄,復制下來:
命令行執行:sudo gedit /etc/profile
在打開的文件里,追加:
export JAVA_HOME=/home/administrator/hadoop/jdk1.6.0_27 //這里要寫安裝目錄
export PATH=${JAVA_HOME}/bin:$PATH
執行source /etc/profile 立即生效
驗證是否安裝完成,那比較容易了,在命令行下運行 java -version ant svn ssh 看是否找不到命令,如果都能找到,說明OK了。
-
下載代碼:
這是個開源的系統,代碼很方便用SVN就可以下載到,版本也很多,在這里我選擇0.20.2版本,一個是網上好多書都基於這個版本的,另外是看源碼,還是以前點版本吧,后面的版本里面肯定又加了很多。
運行這個命令來下載:
svn co http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.20.2/
下載完成后,會在當前文件夾內產生一個新文件夾release-0.20.2,這里面就是代碼了。
為了后面方便操作,把這文件夾重命令一下:
mv release-0.20.2/ hadoop-0.20.2
好了,用圖形界面進入該文件夾,看一看:
-
編譯代碼
剛下完的代碼是無法直接運行的,需要編譯一下,但用什么編譯呢?
編譯前先修改一下build.xml,打開,將里面的版本號改成:0.20.2,如下:
看到代碼里面有個build.xml,這個是典型的用ant編譯用的配置文件,所以直接在命令行里輸入:
~/hadoop-0.20.2$ant
~/hadoop-0.20.2$ant jar
~/hadoop-0.20.2$ant examples
[注意] 編譯時需要聯網,否則在自動下載jar包時會掛掉。
然后屏幕會刷啊刷,等到完成看到下面字符時,也就OK了:
-
配置SSH
我們了解到,這個hadoop是支持分布式運行的,每台機器到時都會來安裝hadoop程序,如果想啟動所有程序怎么辦? 一台台去啟動? 那也太土了, 當然是遠程去啟動咯。為實現這個目標,就得用上SSH了。
SSH是什么,說白了,這個就是一個遠程登陸器,跟遠程桌面、telnet差不多。在linux上所有操作都可以用命令行來完成,所有SSH也就是一個命令行形式,同時比telnet高級,因為通過了加密通道傳輸信息。
那我們就部署了一台機器,還要這個SSH嗎? 答案是要的,因為在運行hadoop里,即使是本機的,里面也要通過SSH localhost的方式來啟動,這樣代碼統一。
前面不是安裝過SSH了么,還要配置什么?SSH正常登陸時,是需要輸入用戶名密碼的,但是當所有的hadoop子服務都受主服務管了后,最好就直接信任了,不要輸入帳號信息,所以我們配置的目的也就是這個。
先試一下,我用SSH登陸當前本機信息:
可以看到,登陸本機時,也要輸入一下密碼,怎么辦?
SSH是能過RSA加密的,所以有公鑰私鑰的說法,所以,我們先產生一對固定的公私鑰,運行這個ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa命令:
這里產生公私鑰,並生成在.ssh文件夾下,於是我們就進入看一下:
果然,這里多了兩個文件,id_dsa為私鑰,id_dsa.pub為公鑰
然后再把公鑰復制成authorized_key,即將這個公鑰固定為SSH登陸所用。
這步很重要,做完這步后,就可以再試一下登陸本機了:
看,現在再ssh localhost時,就直接進入,沒有再輸入帳號了。
到這里,SSH配置就成功了。
-
修改配置文件
在正式運行之前,還要修改一下配置文件才地,這里具體的配置參數,就不講,葫蘆畫瓢么,先跑起來,后面再來研究這是為啥:
在代碼的conf文件夾內,就可以找到下面幾個配置文件,分別配置成以下內容:
core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/zjf/hadoop-0.20.2/tmpPath</value> !這里改下路徑
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://localhost:9001</value>
</property>
</configuration>
修改conf/hadoop-env.sh
將里面的JAVA_HOME注釋打開,並把里面的地址配置正確。
-
運行
Hadoop是一頭神奇的大象,那我們得站在大象背上說句Hello world了。
進入hadoop目錄: $cd Hadoop-0.20.2
首次運行,需要對namenode進行格式化:bin/hadoop namenode -format
啟動hadoop:
bin/start-all.sh
關閉hadoop可以用:
bin/stop-all.sh
如果驗證啟動成功呢?有兩種方式
-
訪問一下管理頁面看:
Job跟蹤:http://localhost:50030
NameNode結點:http://localhost:50070
-
用jps看一下有幾個java進程在運行,如果是下面幾個就正常了:
主要有DataNode NameNode SecondaryNameNode TaskTracker JobTracker這幾個進程,就表示正常了
系統啟動正常后,跑個程序吧
$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/*
最關健的是,最后輸入:
輸出這個結果這就表示我們的程序運行成功了。至於這結果是什么意思,我想看到后大概也猜到了吧,至於詳細解說,下期再看。