之前在Hadoop的开发过程中,一直犯了一个比较严重的错误:一直将windows下的hadoop的本地运行模式理解为hadoop的集群运行模式,现将Hadoop的运行模式总结如下:
1、独立模式即本地运行模式(standalone或local mode)
无需运行任何守护进程(daemon),所有程序都在单个JVM上执行。由于在本机模式下测试和调试MapReduce程序较为方便,因此,这种模式适宜用在开发阶段。
具体实现方式:
①在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行
—-输入输出数据可以放在本地路径下(c:/wc/srcdata/)
—-输入输出数据也可以放在hdfs中(hdfs://hadoop20:9000/dir)
②在linux的eclipse里面直接运行main方法,但是不要添加yarn相关的配置,也会提交给localjobrunner执行
—-输入输出数据可以放在本地路径下(/usr/local/)
—-输入输出数据也可以放在hdfs中(hdfs://hadoop20:9000/dir)
2、伪分布运行模式
如果Hadoop对应的Java进程都运行在一个物理机器上,称为伪分布运行模式,伪分布运行模式常用于开发者机器环境受限的情况下使用。
注意:伪分布模式就是在一台服务器上面模拟集群环境,但仅仅是机器数量少,其通信机制与运行过程与真正的集群模式是一样的,hadoop的伪分布运行模式可以看做是集群运行模式的特殊情况。
3、集群模式
如果Hadoop对应的Java进程运行在多台物理机器上,称为集群模式.[集群就是有主有从]
具体实现方式:
①将工程打成jar包,上传到服务器,然后用hadoop命令hadoop jar xxx.jar 将jar包分发到集群中运行。
②在linux的eclipse中直接运行main方法,进而将程序提交到集群中去运行,但是必须采取以下措施:
第一:在工程src目录下加入 mapred-site.xml 和 yarn-site.xml 这两个配置文件或者在代码中加入:
Configuration conf = new Configuration();
conf.set("mapreduce.framework.name", "yarn");
conf.set("yarn.resourcemanager.hostname", "hadoop20");
第二:同时将工程打成jar包(xxx.jar),并在main方法中添加一个conf的配置参数 conf.set(“mapreduce.job.jar”,”路径/xxx.jar”);
还是以WordCount程序为例:
③在windows的eclipse中直接运行main方法,进而将程序提交给集群运行,但是因为平台不兼容,需要做很多的设置修改:
第一:要在windows中存放一份hadoop的安装包(解压好的)
第二:要将其中的lib和bin目录替换成根据你的windows版本重新编译出的文件(lib和bin都是和本地平台相关的东西)
第三:再要配置系统环境变量 HADOOP_HOME 和 PATH
第四:修改YarnRunner这个类的源码
从上面的介绍可以看出:在windows的eclipse里面跑集群模式非常不方便,没有任何实际意义—不推荐!!!!
综上,以后在实际看法过程中,推荐用下述方式进行开发:
第一种方式:首先在windows中通过本地模式对编写出的程序进行调试,确定程序无误后,将工程打成jar包上传到服务器,然后用hadoop命令—hadoop jar xxx.jar 将jar包分发到集群中运行。
当然如果仅仅是简单的逻辑测试,用本地模式就可以了,不必到集群中运行。
第二种方式:因为linux对hadoop具有很好的平台兼容性,所以我们可以直接在linux的eclipse中进行集群模式的运行。