Hadoop2.0是對Hadoop1.0全面升級,針對Namenode單點問題,提出了HDFS Federation,讓多個NameNode分管不一樣的目錄進而實現訪問隔離和橫向擴展。誕生了通用的計算框架YARN,YARN系統的引入使得計算框架進入了平臺化時代,從雲計算分層概念上講,YARN可看作PAAS層,不少計算框架或者應用程序再也不基於傳統的操做系統開發,而是基於YARN這個雲操做系統。典型的表明是DAG計算框架Tez,固然還有一些其餘知名的自運行的計算集羣系統也在YARN上有開源版本,好比Storm-on-yarn,Spark-on-yarn。咱們先安裝一個Hadoop2.0環境,做爲一切的開始。html
單機環境中,Hadoop有僞分佈式模式,即「單點集羣」,在該模式下,全部的守護進程均會運行在單個節點上。java
僞分佈式模式安裝好了以後,繼續動態加datanode,而後就是徹底分佈式的hadoopnode
但願瞭解hadoop2.0的改進以及設計的亮點能夠看這篇博文,HADOOP2.0(HDFS2)以及YARN設計的亮點linux
本文的hadoop版本是2.2.0,源碼以及編譯包的獲取地址:http://hadoop.apache.org/releases.htmlgit
[root@localhost hadoop]# pwd /root/hadoop [root@localhost hadoop]# ls hadoop-2.2.0 hadoop-2.2.0.tar.gz [root@localhost hadoop]# cd hadoop-2.2.0 [root@localhost hadoop-2.2.0]# ls bin etc include lib libexec LICENSE.txt logs NOTICE.txt README.txt sbin share
修改Hadoop配置文件 ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh,這個根據實際狀況修改,不過java7好像不太兼容,我這邊使用java6github
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
而後修改conf目錄下的mapred-site.xml,core-site.xml,yarn-site.xml和hdfs-site.xml四個文件,省略了最外圍的<configuration></configuration>面試
<!-- mapred-site.xml --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
<!-- core-site.xml --> <property> <name>fs.default.name</name> <value>hdfs://192.168.12.67:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/hadoop-tmp</value>
<!-- 設置一個不會被linux按期刪除的文件夾,默認狀況下namenode和datanode的文件都會存在這個目錄下 --> </property>
<!-- yarn-site.xml -->
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value>
<!-- 2.2版本中不支持中劃線‘-’這邊用下劃線 --> </property>
<!-- hdfs-site.xml -->
<property> <name>dfs.replication</name> <value>1</value>
<!-- 默認狀況下,hdfs數據塊的副本數是3,在集羣規模小於3的集羣中,默認參數會致使錯誤,因此調整爲1 --> </property>
修改/etc/hosts,把本機hostname從原來的127.0.0.1修改成本機ipshell
192.168.12.67 localhost
修改${HADOOP_HOME}/etc/hadoop/slavesapache
192.168.12.67
#生成免密碼公密鑰對,而後把公鑰加入本身的受權文件中,完成本機對本機的免密碼登陸 ssh-keygen -t rsa cd ~/.ssh/ cat id_ras.pub >> authorized_keys
格式化HDFS架構
./bin/hadoop namenode -format
啓動HDFS
cd $HADOOP_HOME ./sbin/start-dfs.sh
啓動YARN
cd $HADOOP_HOME ./sbin/start-yarn.sh
經過如下URL可查看YARN是否啓動成功: http://192.168.12.67:8088/
jps能夠看到運行的進程
[root@localhost hadoop-2.2.0]# jps 21454 SecondaryNameNode 31987 Jps 21302 DataNode 21718 NodeManager 21191 NameNode 21623 ResourceManager
能夠把hadoop的執行腳本加入PATH,這樣方便之後直接調用hadoop腳本,具體就是修改/etc/profile文件,而後source /etc/profile生效
export PATH=$PATH:/root/hadoop/hadoop-2.2.0/bin
運行下hadoop腳本,就能夠看到hdfs的文件系統了
[root@localhost hadoop-2.2.0]# hadoop fs -ls
hadoop提供了一個跑在yarn上的示例,能夠運行
hadoop jar share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.2.0.jar org.apache.hadoop.yarn.applications.distributedshell.Client --jar share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.2.0.jar --shell_command ls --num_containers 10 --container_memory 350 --master_memory 350 --priority 10
顯示hadoo上正在運行的做業
hadoop job -list
僞分佈式安裝完成,下面試試徹底分佈式安裝(就是動態加datanode場景)、
這裏我隨便找了兩臺機器,把新加兩臺機器hostname dns解析加入namenode機器的/etc/hosts中,全部新加的機器的/etc/hosts上都要同步這個配置。不然有datanode沒法鏈接到namenode exception
192.168.1.57 yhserver
192.168.24.33 rhel6
修改${HADOOP_HOME}/etc/hadoop/slaves,加入新機器兩臺
192.168.1.57 192.168.24.33
注意,我在加加機器的時候規範了下hdfs-site.xml配置文件,把namenode文件和datanode文件,指定相應的目錄,固然這樣改了以後,就須要從新作namenode格式化的操做了。若是一開始就規範好了,就能夠不停下namenode,直接加datanode了。默認沒有配置,就是在hadoop.tmp目錄下,各創建dfs name目錄保存相應文件。
<property> <name>dfs.namenode.name.dir</name> <value>/hadoop/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/hadoop/dfs</value> </property>
而後往新加的兩臺機器上,同步hadoop工程以及配置文件,而後設置免密碼登陸新加的兩臺機器,而後新加的機器上,各自單獨執行
./sbin/hadoop-daemon.sh start datanode
而後就能夠看到新加的兩個datanode生效了
error: org.apache.hadoop.hdfs.server.protocol.DisallowedDatanodeException: Datanode denied communication with namenode
datanode沒法鏈接到namenode,是由於沒有在全部機器的/etc/hosts,配置好hostname ip對應關係。配置好了,重啓就能夠。
FATAL org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices: Failed to initialize mapreduce_shuffle java.lang.RuntimeException: No class defiend for mapreduce_shuffle at org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.init(AuxServices.java:94) at org.apache.hadoop.yarn.service.CompositeService.init(CompositeService.java:58) at org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl.init(ContainerManagerImpl.java:181) at org.apache.hadoop.yarn.service.CompositeService.init(CompositeService.java:58) at org.apache.hadoop.yarn.server.nodemanager.NodeManager.init(NodeManager.java:185) at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:328) at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:351) FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager java.lang.RuntimeException: No class defiend for mapreduce_shuffle at org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.init(AuxServices.java:94) at org.apache.hadoop.yarn.service.CompositeService.init(CompositeService.java:58) at org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl.init(ContainerManagerImpl.java:181) at org.apache.hadoop.yarn.service.CompositeService.init(CompositeService.java:58) at org.apache.hadoop.yarn.server.nodemanager.NodeManager.init(NodeManager.java:185) at org.apache.hadoop.yarn.server.nodemanager.NodeManager.initAndStartNodeManager(NodeManager.java:328) at org.apache.hadoop.yarn.server.nodemanager.NodeManager.main(NodeManager.java:351)
不一樣版本間參數名稱不同,修改yarn-site.xml文件
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>mapreduce_shuffle</value>
</property>
參考
《Hadoop技術內幕-深刻解析YARN架構設計與實現原理》
DAG計算框架Tez:http://tez.incubator.apache.org/
"Storm On YARN" Yahoo!開源: https://github.com/yahoo/storm-yarn
"Spark On YARN":http://spark.apache.org/docs/0.9.0/running-on-yarn.html