原文:http://www.cnblogs.com/edisonchou/
一、Hadoop的發展歷史
說到Hadoop的起源,不得不說到一個傳奇的IT公司—全球IT技術的引領者Google。Google(自稱)為雲計算概念的提出者,在自身多年的搜索引擎業務中構建了突破性的GFS(Google File System),從此文件系統進入分布式時代。除此之外,Google在GFS上如何快速分析和處理數據方面開創了MapReduce並行計算框架,讓以往的高端服務器計算變為廉價的x86集群計算,也讓許多互聯網公司能夠從IOE(IBM小型機、Oracle數據庫以及EMC存儲)中解脫出來,例如:淘寶早就開始了去IOE化的道路。然而,Google之所以偉大就在於獨享技術不如共享技術,在2002-2004年間以三大論文的發布向世界推送了其雲計算的核心組成部分GFS、MapReduce以及BigTable。Google雖然沒有將其核心技術開源,但是這三篇論文已經向開源社區的大牛們指明了方向,一位大牛:Doug Cutting使用Java語言對Google的雲計算核心技術(主要是GFS和MapReduce)做了開源的實現。后來,Apache基金會整合Doug Cutting以及其他IT公司(如Facebook等)的貢獻成果,開發並推出了Hadoop生態系統。Hadoop是一個搭建在廉價PC上的分布式集群系統架構,它具有高可用性、高容錯性和高可擴展性等優點。由於它提供了一個開放式的平台,用戶可以在完全不了解底層實現細節的情形下,開發適合自身應用的分布式程序。
二、Hadoop的整體框架
Hadoop由HDFS、MapReduce、HBase、Hive和ZooKeeper等成員組成,其中最基礎最重要的兩種組成元素為底層用於存儲集群中所有存儲節點文件的文件系統HDFS(Hadoop Distributed File System)和上層用來執行MapReduce程序的MapReduce引擎。


三、Hadoop的核心設計
3.1 HDFS
HDFS是一個高度容錯性的分布式文件系統,可以被廣泛的部署於廉價的PC之上。它以流式訪問模式訪問應用程序的數據,這大大提高了整個系統的數據吞吐量,因而非常適合用於具有超大數據集的應用程序中。
HDFS的架構如下圖所示。HDFS架構采用主從架構(master/slave)。一個典型的HDFS集群包含一個NameNode節點和多個DataNode節點。NameNode節點負責整個HDFS文件系統中的文件的元數據保管和管理,集群中通常只有一台機器上運行NameNode實例,DataNode節點保存文件中的數據,集群中的機器分別運行一個DataNode實例。在HDFS中,NameNode節點被稱為名稱節點,DataNode節點被稱為數據節點。DataNode節點通過心跳機制與NameNode節點進行定時的通信。
可以看作是分布式文件系統中的管理者,存儲文件系統的meta-data,主要負責管理文件系統的命名空間,集群配置信息,存儲塊的復制。
是文件存儲的基本單元。它存儲文件塊在本地文件系統中,保存了文件塊的meta-data,同時周期性的發送所有存在的文件塊的報告給NameNode。
就是需要獲取分布式文件系統文件的應用程序。
下面來看看在HDFS上如何進行文件的讀/寫操作:
文件寫入:
1. Client向NameNode發起文件寫入的請求
2. NameNode根據文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。
3. Client將文件划分為多個文件塊,根據DataNode的地址信息,按順序寫入到每一個DataNode塊中。
文件讀取:
1. Client向NameNode發起文件讀取的請求
2. NameNode返回文件存儲的DataNode的信息。
3. Client讀取文件信息。
3.2 MapReduce
MapReduce是一種編程模型,用於大規模數據集的並行運算。Map(映射)和Reduce(化簡),采用分而治之思想,先把任務分發到集群多個節點上,並行計算,然后再把計算結果合並,從而得到最終計算結果。多節點計算,所涉及的任務調度、負載均衡、容錯處理等,都由MapReduce框架完成,不需要編程人員關心這些內容。
下圖是一個MapReduce的處理過程:
用戶提交任務給JobTracer,JobTracer把對應的用戶程序中的Map操作和Reduce操作映射至TaskTracer節點中;輸入模塊負責把輸入數據分成小數據塊,然后把它們傳給Map節點;Map節點得到每一個key/value對,處理后產生一個或多個key/value對,然后寫入文件;Reduce節點獲取臨時文件中的數據,對帶有相同key的數據進行迭代計算,然后把終結果寫入文件。
如果這樣解釋還是太抽象,可以通過下面一個具體的處理過程來理解:(WordCount實例) Hadoop的核心是MapReduce,而MapReduce的核心又在於map和reduce函數。它們是交給用戶實現的,這兩個函數定義了任務本身。
- map函數:接受一個鍵值對(key-value pair)(例如上圖中的Splitting結果),產生一組中間鍵值對(例如上圖中Mapping后的結果)。Map/Reduce框架會將map函數產生的中間鍵值對里鍵相同的值傳遞給一個reduce函數。
- reduce函數:接受一個鍵,以及相關的一組值(例如上圖中Shuffling后的結果),將這組值進行合並產生一組規模更小的值(通常只有一個或零個值)(例如上圖中Reduce后的結果)
但是,Map/Reduce並不是萬能的,適用於Map/Reduce計算有先提條件:
①待處理的數據集可以分解成許多小的數據集;
②而且每一個小數據集都可以完全並行地進行處理;
若不滿足以上兩條中的任意一條,則不適合使用Map/Reduce模式;
四、Hadoop的安裝配置
Hadoop共有三種部署方式:本地模式,偽分布模式及集群模式;本次安裝配置以偽分布模式為主,即在一台服務器上運行Hadoop(如果是分布式模式,則首先要配置Master主節點,其次配置Slave從節點)。以下說明如無特殊說明,默認使用root用戶登錄主節點,進行以下的一系列配置。
安裝配置前請先准備好以下軟件:
- vmware workstation 8.0或以上版本
- redhat server 6.x版本或centos 6.x版本
- jdk-6u24-linux-xxx.bin
- hadoop-1.1.2.tar.gz
4.1 設置靜態IP地址
命令模式下可以執行setup命令進入設置界面配置靜態IP地址;x-window界面下可以右擊網絡圖標配置;
配置完成后執行service network restart重新啟動網絡服務;
驗證:執行命令ifconfig
4.2 修改主機名
<1>修改當前會話中的主機名(這里我的主機名設為hadoop-master),執行命令hostname hadoop-master
<2>修改配置文件中的主機名,執行命令vi /etc/sysconfig/network
驗證:重啟系統reboot
4.3 DNS綁定
執行命令vi /etc/hosts,增加一行內容,如下(這里我的Master節點IP設置的為192.168.80.100):
192.168.80.100 hadoop-master
保存后退出
驗證:ping hadoop-master
4.4 關閉防火牆及其自動運行
<1>執行關閉防火牆命令:service iptables stop
驗證:service iptables stauts
<2>執行關閉防火牆自動運行命令:chkconfig iptables off
驗證:chkconfig –list | grep iptables
4.5 SSH(Secure Shell)的免密碼登錄
<1>執行產生密鑰命令:ssh-keygen –t rsa,位於用戶目錄下的.ssh文件中(.ssh為隱藏文件,可以通過ls –a查看)
<2>執行產生命令:cp id_rsa.pub authorized_keys
驗證:ssh localhost
4.6 復制JDK和Hadoop-1.1.2.tar.gz至Linux中
<1>使用WinScp或CuteFTP等工具將jdk和hadoop.tar.gz復制到Linux中(假設復制到了Downloads文件夾中);
<2>執行命令:rm –rf /usr/local/* 刪除該文件夾下所有文件
<3>執行命令:cp /root/Downloads/* /usr/local/ 將其復制到/usr/local/文件夾中
4.7 安裝JDK
<1>在/usr/local下解壓jdk安裝文件:./jdk-6u24-linux-i586.bin(如果報權限不足的提示,請先為當前用戶對此jdk增加執行權限:chmod u+x jdk-6u24-linux-i586.bin)
<2>重命名解壓后的jdk文件夾:mv jdk1.6.0_24 jdk(此步湊非必要,只是建議)
<3>配置Linux環境變量:vi /etc/profile,在其中增加幾行:
export JAVA_HOME=/usr/local/jdk
export PATH=.:JAVAHOME/bin:</strong>PATH
<4>生效環境變量配置:source /etc/profile
驗證:java –version
4.8 安裝Hadoop
<1>在/usr/local下解壓hadoop安裝文件:tar –zvxf hadoop-1.1.2.tar.gz
<2>解壓后重命名hadoop-1.1.2文件夾:mv hadoop-1.1.2 hadoop(此步湊非必要,只是建議)
<3>配置Hadoop相關環境變量:vi /etc/profile,在其中增加一行:
export HADOOP_HOME=/usr/local/hadoop
然后修改一行:
export PATH=.:JAVAHOME/bin:<strong>HADOOP_HOME:$PATH
<4>生效環境變量:source /etc/profile
<5>修改Hadoop的配置文件,它們位於$HADOOP_HOME/conf目錄下。
分別修改四個配置文件:hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml;
具體下修改內容如下:(由於修改內容較多,建議使用WinScp進入相關目錄下進行編輯和保存,可以節省較多時間和精力)
5.1【hadoop-env.sh】 修改第九行:
export JAVA_HOME=/usr/local/jdk/
如果虛擬機內存低於1G,還需要修改HADOOP_HEAPSIZE(默認為1000)的值:
export HADOOP_HEAPSIZE=100
5.2【core-site.xml】 在configuration中增加以下內容(其中的hadoop-master為你配置的主機名):
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop-master:9000</value>
<description>change your own hostname</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
5.3 【hdfs-site.xml】 在configuration中增加以下內容:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
5.4 【mapred-site.xml】 在configuration中增加以下內容(其中的hadoop-master為你配置的主機名):
<property>
<name>mapred.job.tracker</name>
<value>hadoop-master:9001</value>
<description>change your own hostname</description>
</property>
<6>執行命令對Hadoop進行初始格式化:hadoop namenode –format
<7>執行命令啟動Hadoop:start-all.sh(一次性啟動所有進程)
第二種方式:通過執行如下方式命令單獨啟動HDFS和MapReduce:start-dfs.sh和start-mapred.sh啟動,stop-dfs.sh和stop-mapred.sh關閉;
第三種方式:通過執行如下方式命令分別啟動各個進程:
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start secondarynamenode
hadoop-daemon.sh start jobtracker
hadoop-daemon.sh start tasktracker
這種方式的執行命令是hadoop-daemon.sh start [進程名稱],這種啟動方式適合於單獨增加、刪除節點的情況,在安裝集群環境的時候會看到。
驗證:
① 執行jps命令查看java進程信息,如果是start-all.sh則一共顯示5個java進程。
②在瀏覽器中瀏覽Hadoop,輸入URL:hadoop-master:50070和hadoop-master:50030。如果想在宿主機Windows中瀏覽,可以直接通過ip地址加端口號訪問,也可以配置C盤中System32/drivers/etc/中的hosts文件,增加DNS主機名映射,例如:192.168.80.100 hadoop-master。
訪問效果如下圖:
namenode
jobtracker
<8>NameNode進程沒有啟動成功?可以從以下幾個方面檢查:
沒有對NameNode進行格式化操作:hadoop namenode –format(PS:多次格式化也會出錯,保險操作是先刪除/usr/local/hadoop/tmp文件夾再重新格式化)
Hadoop配置文件只復制沒修改: 修改四個配置文件需要改的參數
DNS沒有設置IP和hostname的綁定:vi /etc/hosts
SSH的免密碼登錄沒有配置成功:重新生成rsa密鑰
<9>Hadoop啟動過程中出現以下警告?
可以通過以下步湊去除該警告信息:
①首先執行命令查看shell腳本:vi start-all.sh(在bin目錄下執行),可以看到如下圖所示的腳本
雖然我們看不懂shell腳本的語法,但是可以猜到可能和文件hadoop-config.sh有關,我們再看一下這個文件的源碼。執行命令:vi hadoop-config.sh(在bin目錄下執行),由於該文件特大,我們只截取最后一部分,見下圖。
從圖中的紅色框框中可以看到,腳本判斷環境變量HADOOP_HOME和HADOOP_HOME_WARN_SUPPRESS的值,如果前者為空,后者不為空,則顯示警告信息“Warning„„”。
我們在前面的安裝過程中已經配置了HADOOP_HOME這個環境變量,因此,只需要給HADOOP_HOME_WARN_SUPPRESS配置一個值就可以了。所以,執行命令:vi /etc/profile,增加一行內容(值隨便設置一個即可,這里設為0):
export HADOOP_HOME_WARN_SUPPRESS=0
保存退出后執行重新生效命令:source /etc/profile,生效后重新啟動hadoop進程則不會提示警告信息了。
至此,一個Hadoop的Master節點的安裝配置結束,接下來我們要進行從節點的配置。
————————————————————————————————————————–