本節內容:java
1. Hadoop版本種類node
目前Hadoop發行版很是多,有華爲發行版、Intel發行版、Cloudera發行版(CDH)等,全部這些發行版均是基於Apache Hadoop衍生出來的,之因此有這麼多的版本,徹底是由Apache Hadoop的開源協議(http://www.apache.org/licenses/LICENSE-2.0)決定的:任何人能夠對其進行修改,並做爲開源或商業產品發佈/銷售。linux
國內絕大多數公司發行版是收費的,好比Intel發行版、華爲發行版等,儘管這些發行版增長了不少開源版本沒有的新feature,但絕大多數公司選擇Hadoop版本時會將把是否收費做爲重要指標,不收費的Hadoop版本主要有三個(均是國外廠商),分別是:Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,簡稱「CDH」)、Apache基金會hadoop、Hortonworks版本(Hortonworks Data Platform,簡稱「HDP」)。按順序表明了,在國內的使用率,CDH和HDP雖然是收費版本,可是他們是開源的,只是收取服務費用。web
Apache社區版本:徹底開源,免費,非商業。apache社區的hadoop版本分枝較多,並且部分hadoop存在bug。在選擇hadoop,hbase,hive等時,須要考慮兼容性。正則表達式
Cloudera版本:開源,免費,有商業和非商業版本。是在apache社區版本的hadoop基礎上,選擇相對穩定版本的hadoop,並在此基礎上,進行bug修改和維護。使用者沒必要考慮hadoop,hbase,hive等在使用過程當中,版本兼容性。shell
Hortonworks版本:開源,免費,有商業和非商業版本。是在Apache基礎上修改,具備apache的特點。apache
2. Apache Hadoop版本衍化vim
Apache Hadoop版本分爲兩代,咱們將第一代Hadoop稱爲Hadoop 1.0,第二代Hadoop稱爲Hadoop 2.0。第一代Hadoop包含三個大版本,分別是0.20.x,0.21.x和0.22.x,其中,0.20.x最後演化成1.0.x,變成了穩定版,而0.21.x和0.22.x則NameNode HA等新的重大特性。第二代Hadoop包含兩個版本,分別是0.23.x和2.x,它們徹底不一樣於Hadoop 1.0,是一套全新的架構,均包含HDFS Federation和YARN兩個系統,相比於0.23.x,2.x增長了NameNode HA和Wire-compatibility兩個重大特性。通過上面的大致解釋,你們可能明白了Hadoop以重大特性區分各個版本的,總結起來,用於區分Hadoop版本的特性有如下幾個:緩存
須要注意的是,Hadoop 2.0主要由Yahoo獨立出來的hortonworks公司主持開發。安全
2013年10月,Hadoop 2.0發佈。關鍵特性包括:
YARN是「Yet Another Resource Negotiator」的簡稱,它是Hadoop 2.0引入的一個全新的通用資源管理系統,可在其之上運行各類應用程序和框架,好比MapReduce、Tez、Storm等,它的引入使得各類應用運行在一個集羣中成爲可能。YARN是在MRv1基礎上衍化而來的,是MapReduce發展到必定程度的必然產物,它的出現使得Hadoop計算類應用進入平臺化時代,博客中包含大量介紹YARN的文章,有興趣的讀者可閱讀:http://dongxicheng.org/category/mapreduce-nextgen/
Hadoop 2.2.0同時解決了NameNode單點故障問題和內存受限問題,其中,單點故障是經過主備NameNode切換實現的,這是一種古老的解決服務單點故障的方案,主備NameNode之間經過一個共享存儲同步元數據信息,所以共享存儲系統的選擇稱爲關鍵,而Hadoop則提供了NFS、QJM和Bookeeper三種可選的共享存儲系統,具體可閱讀個人這篇文章:Hadoop 2.0單點故障問題方案總結。
前面提到HDFS 的NameNode存在內存受限問題,該問題也在2.2.0版本中獲得瞭解決。這是經過HDFS Federation實現的,它容許一個HDFS集羣中存在多個NameNode,每一個NameNode分管一部分目錄,而不一樣NameNode之間彼此獨立,共享全部DataNode的存儲資源,注意,NameNode Federation中的每一個NameNode仍存在單點問題,需爲每一個NameNode提供一個backup以解決單點故障問題。
HDFS快照是指HDFS文件系統(或者子系統)在某一時刻的只讀鏡像,它的出現使得管理員可定時爲重要文件或目錄作快照,以防止數據誤刪、丟失等。具體可閱讀:Snapshots for HDFS(使用說明),Support for RW/RO snapshots in HDFS。
經過NFSv3訪問HDFS
NFS容許用戶像訪問本地文件系統同樣訪問遠程文件系統,而將NFS引入HDFS後,用戶可像讀寫本地文件同樣讀寫HDFS上的文件,大大簡化了HDFS使用,這是經過引入一個NFS gateway服務實現的,該服務能將NFS協議轉換爲HDFS訪問協議,具體以下圖所示。有興趣的讀者可閱讀:Support NFSv3 interface to HDFS,以及相關設計文檔:HDFS NFS Gateway。
在2.2.0版本以前,Hadoop僅支持Linux操做系統,而Windows僅做爲實驗平臺使用。從2.2.0開始,Hadoop開始支持Windows操做系統,具體可閱讀我以前寫的一篇文章:Hadoop For Windows。
除了HDFS、MapReduce和YARN這三個核心系統外,Hadoop生態系統還包括Hbase、Hive、Pig等系統,這些系統底層依賴於Hadoop內核,而相比於Hadoop 1.0,Hadoop 2.0的最大變化出如今內核(HDFS、MapReduce和YARN),但與生態系統中其餘系統進行集成測試是必需的。
除了以上特性外,Apache官方還給出了兩個特殊說明:
(1)HDFS變化:HDFS的symlinks(相似於Linux中的軟鏈接)被將移到了2.3.0版本中
(2)YARN/MapReduce注意事項:管理員在NodeManager上設置ShuffleHandler service時,要採用「mapreduce_shuffle」,而非以前的「mapreduce.shuffle」做爲屬性值。
新版本不只加強了核心平臺的大量功能,同時還修復了大量bug。新版本對HDFS作了兩個很是重要的加強:
(1)支持異構的存儲層次;
(2)經過數據節點爲存儲在HDFS中的數據提供了內存緩存功能。
藉助於HDFS對異構存儲層次的支持,咱們將可以在同一個Hadoop集羣上使用不一樣的存儲類型。此外咱們還可使用不一樣的存儲媒介——例如商業磁盤、企業級磁盤、SSD或者內存等——更好地權衡成本和收益。若是你想更詳細地瞭解與該加強相關的信息,那麼能夠訪問這裏。相似地,在新版本中咱們還能使用Hadoop集羣中的可用內存集中地緩存並管理數據節點內存中的數據集。MapReduce、Hive、Pig等相似的應用程序將可以申請內存進行緩存,而後直接從數據節點的地址空間中讀取內容,經過徹底避免磁盤操做極大地提升掃描效率。Hive如今正在爲ORC文件實現一個很是有效的零複製讀取路徑,該功能就使用了這項新技術。
在YARN方面,令咱們很是興奮的事情是資源管理器自動故障轉移功能已經進入尾聲,雖然在2.3.0這個版本中該功能尚未被髮布,可是極有可能會包含在Hadoop-2.4中。此外,2.3.0版本還對YARN作了一些關鍵的運維方面的加強,例如更好的日誌、錯誤處理和診斷等。
MapReduce的一個關鍵加強MAPREDUCE-4421。藉助於該功能咱們已經再也不須要在每一臺機器上安裝MapReduce二進制程序,僅僅須要經過YARN分佈式緩存將一個MapReduce包複製到HDFS中就能夠了。固然,新版本還包含大量的bug修復以及其餘方面的加強。例如:
2014年4月,Hadoop 2.4.0發佈。關鍵特性包括:
安全對於Hadoop來講相當重要,因此在Hadoop 2.4.0版本中對HDFS的全部訪問(包括WebHDFS, HsFTP甚至是web-interfaces)都支持了HTTPS。在Hadoop 2.4.0解決了ResourceManager的單點故障。這樣會在集羣中存在兩個ResourceManager,其中一個處於Active;另外一個處於 standby。當Active的出現故障,這樣Hadoop能夠自動平滑地切換到另一個ResourceManager,這個新的ResourceManager將會自動的重啓那些提交的applications。在下一階段,Hadoop將會增長一個熱standby(add a hot standby),這個standby能夠繼續從故障點運行的應用程序,以保存任何已經完成的工做。
2014年8月,Hadoop 2.5.0發佈。關鍵特性包括:
使用HTTP代理服務器時認證改進。當經過代理服務器使用WebHDFS時這是很是有用的。
增長了一個新的Hadoop指標監控sink,容許直接寫到Graphite。
Hadoop文件系統兼容相關的規範工做。
支持 POSIX風格的擴展文件系統。更多細節查看Extended Attributes in HDFS文檔。
支持離線image瀏覽,客戶端如今能夠經過WebHDFS的API瀏覽一個fsimage。
NFS網關獲得大量可支持性的改進和bug修復。Hadoop portmapper不在須要運行網關,網關如今能夠拒絕沒有權限的端口的鏈接。
SecondaryNameNode, JournalNode, and DataNode 的web UI已經使用HTML5和JS美化。
YARN的REST API如今支持寫/修改操做。用戶能夠用REST API提交和殺死應用程序。
時間線存儲到YARN,用來存儲一個應用通用的和特殊的信息,支持Kerberos認證。
公平調度器支持動態分層用戶隊列,運行時,用戶隊列在任一指定的父隊列中被動態的建立。
2014年11月,Hadoop 2.6.0發佈。關鍵特性包括:
Hadoop Key Management Server(KMS)是一個基於HadoopKeyProvider API編寫的密鑰管理服務器。他提供了一個client和一個server組件,client和server之間基於HTTP協議使用REST API通訊。Client是一個KeyProvider的實現,使用KMS HTTP REST API與KMS交互。KMS和它的client有內置的安全機制,支持HTTP SPNEGO Kerberos認證和HTTPS安全傳輸。KMS是一個Java Web應用程序,運行在與Hadoop發行版綁定在一塊兒的預先配置好的Tomcat服務器上。
HDFS-5274增長了追蹤經過HDFS的請求的功能,此功能使用了開源的庫,HTrace。你們能夠看一下HTrace,功能很強大,Cloudera開源出來的。
Transparent Encryption,HDFS實現了一個透明的,端到端的加密方式。一旦配置了加密,從HDFS讀出數據解密和寫入數據加密的過程對用戶應用程序代碼帶來講都是透明的。加密過程是端到端的,這意味着數據只能在客戶端被加密解密。HDFS歷來不存儲,也不訪問未加密的數據和數據加密密鑰。這樣知足了加密過程的兩個典型的需求:at-rest encryption(靜態加密,也就是說,數據持久化在像硬盤這樣的媒介上),in-transit encryption(在途加密,例如,當數據在網絡中傳輸的時候)。
Storage SSD && Memory。ArchivalStorage(檔案存儲器)是將計算能力與不斷增加的存儲能力分離。擁有高密度低成本的存儲可是計算能力較低的節點將變得可用,能夠在集羣中作冷存儲。增長更多的節點做爲冷存儲能夠提升集羣的存儲能力,跟集羣的計算能力無關。
這一部分主要是一些bug的修復和改進。增長了兩個新的新特,在2.5.2裏已經有所描述了。這裏在簡單看一下。
ResourceManger Restart
容許AM發送歷史事件信息到timeline server。
NodeManager Restart:這個特性可使NodeManager在不丟失運行在節點中的活動的container的狀況下從新啓動。
Docker Container Executor:DockerContainer Executor(DCE)容許YARN NodeManager在Docker container中啓動YARN container。用戶能夠指定他們想用來運行YARN container的Docker的鏡像。這些container提供了一個能夠自定義的軟件環境,用戶的代碼能夠運行在其中,與NodeManager運行的環境隔離。這些運行用戶代碼的container能夠包含應用程序須要的特定的庫,它們能夠擁有與NodeManager不一樣版本的Perl,Python甚至是Java。事實上,這些container能夠運行與NodeManager所在的OS不一樣版本的Linux。儘管YARN container必須定義運行Job所需的全部的環境和庫,可是NodeManager中的全部的東西都不會共享。
Docer爲YARN提供了一致和隔離兩種模式,一致模式下,全部的YARN container將擁有相同的軟件環境,在隔離模式下,無論物理機器安裝了什麼都不干擾。
2015年7月,Hadoop 2.7.0發佈。關鍵特性包括:
支持Windows Azure Storage,BLOB做爲Hadoop中的文件系統。
Hadoop HDFS
支持文件截斷(file truncate);
支持每一個存儲類型配額(Support for quotas per storage type);
支持可變長度的塊文件
YARN的本地化資源能夠自動共享,全局緩存(測試版)
Hadoop MapReduce
可以限制運行的Map/Reduce做業的任務
爲很是的大Job(有許多輸出文件)加快了FileOutputCommitter。
支持文件截斷(file truncate);
支持每一個存儲類型配額(Support for quotas per storage type);
支持可變長度的塊文件
可以限制運行的Map/Reduce做業的任務
爲很是的大Job(有許多輸出文件)加快了FileOutputCommitter。
2015年7月,Hadoop 2.7.1發佈。關鍵特性包括:
本版本屬於穩定版本,是自Hadoop 2.6.0以來又一個穩定版,同時也是Hadoop 2.7.x版本線的第一個穩定版本,也是 2.7版本線的維護版本,變化不大,主要是修復了一些比較嚴重的Bug(其中修復了131個Bugs和patches)
Hadoop 有兩個主要版本,Hadoop 1.x.y 和 Hadoop 2.x.y 系列,比較老的教材上用的多是 0.20 這樣的版本。Hadoop 2.x 版本在不斷更新。
Hadoop安裝部署模式有3種:
1. 安裝部署本地模式Hadoop
本次實驗使用的版本是hadoop-2.7.2,實驗環境以下:
主機名 | IP地址 | 操做系統版本 | 安裝軟件 |
node3 | 172.16.7.153 | CentOS 7.1 | hadoop-2.7.2 |
(1)安裝JDK1.7
Hadoop Java Versions
Version 2.7 and later of Apache Hadoop requires Java 7. It is built and tested on both OpenJDK and Oracle (HotSpot)'s JDK/JRE.
Earlier versions (2.6 and earlier) support Java 6.
[root@node3 ~]# mkdir /usr/java [root@node3 ~]# tar zxf /usr/local/jdk-7u80-linux-x64.gz -C /usr/java/ [root@node3 ~]# vim /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_80 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar [root@node3 ~]# source /etc/profile
(2)安裝依賴包ssh和rsync
對於Redhat/CentOS系列的,安裝系統時通常都會默認安裝openssh軟件,裏面包含了ssh客戶端和ssh服務端,因此先檢查下這個軟件包是否安裝了:
# yum list all openssh
若是沒有安裝,安裝:
# yum install -y openssh
在檢查rsync軟件包是否安裝:
# yum list all rsync
(3)添加Hadoop運行用戶
# groupadd -g 1000 hadoop # useradd -g 1000 -u 1000 hadoop # echo "wisedu" | passwd --stdin hadoop &> /dev/null
(4)配置主節點登陸本身和其餘節點不須要輸入密碼
使用hadoop用戶登陸主機,配置其ssh鏈接localhost不須要輸入密碼:
$ ssh-keygen -t rsa -P ''
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@localhost
此時再用 ssh localhost,無需輸入密碼就能夠直接登錄了,以下圖所示:
(5)解壓hadoop
root用戶登陸shell:
[root@node3 ~]# cd /usr/local/ [root@node3 local]# tar zxf hadoop-2.7.2.tar.gz [root@node3 local]# ln -sv hadoop-2.7.2 hadoop ‘hadoop’ -> ‘hadoop-2.7.2’
(6)配置hadoop環境變量
[root@node3 ~]# vim /etc/profile # Hadoop HADOOP_HOME=/usr/local/hadoop PATH=$HADOOP_HOME/bin:$PATH export HADOOP_HOME PATH [root@node3 ~]# source /etc/profile [root@node3 ~]# hadoop version
修改/usr/local/hadoop的屬主和屬組爲hadoop:
[root@node3 local]# chown -R hadoop.hadoop /usr/local/hadoop/
(7)配置本地模式並測試
Hadoop 默認模式爲非分佈式模式,無需進行其餘配置便可運行。非分佈式即單 Java 進程,方便進行調試。不使用集羣文件系統的,只是個調試查看模式,不會啓動什麼DataNode這類的進程。
能夠執行例子來感覺下 Hadoop 的運行。Hadoop 附帶了豐富的例子(運行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 能夠看到全部例子),包括 wordcount、terasort、join、grep 等。
在此選擇運行 grep 例子,咱們將 input 文件夾中的全部文件做爲輸入,篩選當中符合正則表達式 dfs[a-z.]+ 的單詞並統計出現的次數,最後輸出結果到 output 文件夾中。
hadoop用戶登陸shell:
[hadoop@node3 ~]$ cd /usr/local/hadoop [hadoop@node3 hadoop]$ mkdir input [hadoop@node3 hadoop]$ cp etc/hadoop/*.xml input # 將配置文件做爲輸入文件
[hadoop@node3 hadoop]$ cat output/* # 查看運行結果
執行成功後以下所示,輸出了做業的相關信息,輸出的結果是符合正則的單詞 dfsadmin 出現了1次:
注意: Hadoop 默認不會覆蓋結果文件,所以再次運行上面實例會提示出錯,須要先將 ./output 刪除。
2. 安裝部署僞分佈式Hadoop
Hadoop 能夠在單節點上以僞分佈式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既做爲 NameNode 也做爲 DataNode,同時,讀取的是 HDFS 中的文件。
(1)Hadoop配置文件說明
Hadoop 的配置文件位於 /usr/local/hadoop/etc/hadoop/ 中,僞分佈式須要修改2個配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每一個配置以聲明 property 的 name 和 value 的方式來實現。
Hadoop 的運行方式是由配置文件決定的(運行 Hadoop 時會讀取配置文件),所以若是須要從僞分佈式模式切換回非分佈式模式,須要刪除 core-site.xml 中的配置項。
此外,僞分佈式雖然只須要配置 fs.defaultFS 和 dfs.replication 就能夠運行(官方教程如此),不過若沒有配置 hadoop.tmp.dir 參數,則默認使用的臨時目錄爲 /tmp/hadoo-hadoop,而這個目錄在重啓時有可能被系統清理掉,致使必須從新執行 format 才行。因此咱們進行了設置,同時也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,不然在接下來的步驟中可能會出錯。
(2)修改配置文件 core-site.xml,配置Hadoop的核心屬性
[hadoop@node3 hadoop]$ vim etc/hadoop/core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
(3)修改配置文件 hdfs-site.xml,定義hdfs的屬性
[hadoop@node3 hadoop]$ vim etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
注意: 若是須要其它用戶對hdfs有寫入權限,還須要在hdfs-site.xml添加一項屬性定義。
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
HDFS進程有許多屬性能夠定義其工做路徑,如dfs.namenode.name.dir屬性定義的HDFS元數據持久存儲路徑,默認爲${hadoop.tmp.dir}/dfs/name。
dfs.datanode.data.dir屬性定義DataNode用於存儲數據塊的目錄路徑,默認爲${hadoop.tmp.dir}/dfs/data。
fs.checkpoint.dir屬性定義的SecondaryNameNode用於存儲檢查點文件的目錄,默認爲${hadoop.tmp.dir}/dfs/namesecondary。
爲了數據可用性及冗餘的目的,HDFS會在多個節點上保存同一個數據塊的多個副本,其默認爲3個。而只有一個節點的僞分佈式環境中其僅用保存一個副本,這能夠經過dfs.replication屬性進行定義。
(4)執行 NameNode 的格式化
[hadoop@node3 hadoop]$ bin/hdfs namenode -format
成功的話,會看到 「successfully formatted」 和 「Exitting with status 0」 的提示,若爲 「Exitting with status 1」 則是出錯。
(5)開啓 NameNode 和 DataNode 守護進程
[hadoop@node3 hadoop]$ sbin/start-dfs.sh Error: JAVA_HOME is not set and could not be found.
解決:
[hadoop@node3 hadoop]$ vim etc/hadoop/hadoop-env.sh
再次啓動:
[hadoop@node3 hadoop]$ sbin/start-dfs.sh
啓動完成後,能夠經過命令 jps 來判斷是否成功啓動,若成功啓動則會列出以下進程: 「NameNode」、」DataNode」 和 「SecondaryNameNode」(若是 SecondaryNameNode 沒有啓動,請運行 sbin/stop-dfs.sh 關閉進程,而後再次嘗試啓動嘗試)。若是沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查以前步驟,或經過查看啓動日誌排查緣由。The hadoop daemon log output is written to the $HADOOP_LOG_DIR directory (defaults to $HADOOP_HOME/logs)。
(6)查看NameNode 信息
成功啓動後,能夠訪問 Web 界面 http://172.16.7.153:50070 查看 NameNode 和 Datanode 信息,還能夠在線查看 HDFS 中的文件。
(7)測試hadoop
上面本地模式的例子,grep讀取的是本地文件系統上的數據,本地模式是不使用集羣文件系統HDFS的。
僞分佈式讀取的則是 HDFS 上的數據。要使用 HDFS,首先須要在 HDFS 中建立用戶目錄。
a. 在HDFS中建立目錄:
[hadoop@node3 ~]$ cd /usr/local/hadoop [hadoop@node3 hadoop]$ bin/hdfs dfs -mkdir -p /user/hadoop
b. 接着將 ./etc/hadoop 中的 xml 文件做爲輸入文件複製到分佈式文件系統中,即將 /usr/local/hadoop/etc/hadoop 複製到分佈式文件系統中的 /user/root/input 中。咱們使用的是hadoop用戶,而且已建立相應的用戶目錄 /user/hadoop ,所以在命令中就可使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:
[hadoop@node3 hadoop]$ bin/hdfs dfs -mkdir input [hadoop@node3 hadoop]$ bin/hdfs dfs -put ./etc/hadoop/*.xml input
c. 複製完成後,能夠經過以下命令查看文件列表:
[hadoop@node3 hadoop]$ bin/hdfs dfs -ls input
d. 僞分佈式運行 MapReduce 做業的方式跟單機模式相同,區別在於僞分佈式讀取的是HDFS中的文件(能夠將單機步驟中建立的本地 input 文件夾,輸出結果 output 文件夾都刪掉來驗證這一點)
hadoop@node3 hadoop]$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
e. 查看運行結果的命令(查看的是位於 HDFS 中的輸出結果):
[hadoop@node3 hadoop]$ bin/hdfs dfs -cat output/*
結果以下,注意到剛纔咱們已經更改了配置文件,因此運行結果不一樣。
f. 咱們也能夠將運行結果取回到本地
[hadoop@node3 hadoop]$ rm -r ./output # 先刪除本地的 output 文件夾(若是存在) [hadoop@node3 hadoop]$ bin/hdfs dfs -get output ./output # 將HDFS 上的 output 文件夾拷貝到本機
[hadoop@node3 hadoop]$ cat ./output/*
g. Hadoop 運行程序時,輸出目錄不能存在,不然會提示錯誤
「org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists」 ,所以若要再次執行,須要執行以下命令刪除 output 文件夾:
[hadoop@node3 hadoop]$ bin/hdfs dfs -rm -r output 16/06/27 23:37:30 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted output
注意: 運行 Hadoop 程序時,爲了防止覆蓋結果,程序指定的輸出目錄(如 output)不能存在,不然會提示錯誤,所以運行前須要先刪除輸出目錄。在實際開發應用程序時,可考慮在程序中加上以下代碼,能在每次運行時自動刪除輸出目錄,避免繁瑣的命令行操做:
Configuration conf = new Configuration(); Job job = new Job(conf); Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true);
h. 若要關閉 Hadoop,則運行
[hadoop@node3 hadoop]$ sbin/stop-dfs.sh
注意:下次啓動 hadoop 時,無需進行 NameNode 的初始化,只須要運行 sbin/start-dfs.sh 就能夠了。
(8)啓動YARN
注意:僞分佈式不啓動 YARN 也能夠,通常不會影響程序執行。
玩過Hadoop V1版本的可能會疑惑,啓動 Hadoop 後,見不到所說的 JobTracker 和 TaskTracker進程,這是由於新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也稱爲 YARN,Yet Another Resource Negotiator)。
YARN 是從 MapReduce 中分離出來的,負責資源管理與任務調度。YARN 運行於 MapReduce 之上,提供了高可用性、高擴展性。
上述經過 sbin/start-dfs.sh 啓動 Hadoop,僅僅是啓動了 MapReduce 環境,咱們能夠啓動 YARN ,讓 YARN 來負責資源管理與任務調度。
a. 首先修改配置文件 mapred-site.xml
[hadoop@node3 ~]$ cd /usr/local/hadoop [hadoop@node3 hadoop]$ mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml [hadoop@node3 hadoop]$ vim mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
b. 修改配置文件 yarn-site.xml
[hadoop@node3 hadoop]$ vim yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
c. 啓動 YARN (須要先執行過 ./sbin/start-dfs.sh)
[hadoop@node3 hadoop]$ sbin/start-yarn.sh
[hadoop@node3 hadoop]$ sbin/mr-jobhistory-daemon.sh start historyserver # 開啓歷史服務器,才能在Web中查看任務運行狀況
啓動 YARN 以後,運行實例的方法仍是同樣的,僅僅是資源管理方式、任務調度不一樣。觀察日誌信息能夠發現,不啓用 YARN 時,是 「mapred.LocalJobRunner」 在跑任務,啓用 YARN 以後,是 「mapred.YARNRunner」 在跑任務。啓動 YARN 有個好處是能夠經過 Web 界面查看任務的運行狀況:http://localhost:8088/cluster,以下圖所示。
在執行下上面的任務:
[hadoop@node3 hadoop]$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
但 YARN 主要是爲集羣提供更好的資源管理與任務調度,然而這在單機上體現不出價值,反而會使程序跑得稍慢些。所以在單機上是否開啓 YARN 就看實際狀況了。
e. 關閉 YARN 的腳本以下
[hadoop@node3 hadoop]$ sbin/stop-yarn.sh [hadoop@node3 hadoop]$ sbin/mr-jobhistory-daemon.sh stop historyserver
注意:不啓動 YARN 需重命名 mapred-site.xml。若是不想啓動 YARN,務必把配置文件 mapred-site.xml 重命名,改爲 mapred-site.xml.template,須要用時改回來就行。不然在該配置文件存在,而未開啓 YARN 的狀況下,運行程序會提示 「Retrying connect to server: 0.0.0.0/0.0.0.0:8032」 的錯誤,這也是爲什麼該配置文件初始文件名爲 mapred-site.xml.template。