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