Hadoop程序的MR模式可以提供并行化运行环境,而HDFS是并行化的基础(HDFS毕竟把文件分割了,而local只是存在一台机器上),所以,如何在eclipse上跑程序,让其读取HDFS上的文件,是一个关键。一般来说,你要通过设置configuration来设置目录是hdfs还是local,如果你不设置,默认就是local,此时你如果把hdfs-site.xml放入eclipse建的工程的话,那么,跑的程序就会在HDFS上了,因为那个xml配置了程序默认的运行目录,清楚了如何在HDFS上跑程序,那么下一步是如何在eclipse调试程序。
eclipse上运行hadoop可以看作有2种模式,第一种就是Local模式,也叫本地模式,第二种就是我们正式的线上集群模式,当运行本地模式的时候,程序并不会被提交到Hadoop集群上,而是基于单机的模式跑的,但是单机的模式,运行的结果仍在是存储在HDFS上的,只不过没有利用hadoop集群的资源,单机的模式不要提交jar包到hadoop集群上,因此一般我们使用local来测试我们的MR程序是否能够正常运行,而且对于不复杂的程序运行的速度非常的快,比命令行提交jar的集群模式快得多,因为少了集群的job提交环节。
但是我们不想每次运行程序都要打包jar,然后通过命令行 hadoop jar 来提交,这个时候,我们可以通过eclipse 打包jar,然后在代码中设置提交的方法实现。eclipse打成jar包的方法很多,可以用ant之类的,这里请各位自行查阅相关资料,本文不再赘述,剩下的关键的一步是如何在代码中设置提交。类似于第一段提到的那样,我们在设置configuration的时候,什么都不设置,默认读写local目录运行,如果在configuration中设置hdfs,就可以在HDFS上跑,或者,把hdfs-site.xml拷贝到工程目录的src下面,也可以达到同样效果;如果我们要设置eclipse代码提交jar到集群,我们也要设置configuration,例如conf.set("mapred.job.tracker","192.168.75.130:9001");,或者把mapred-site.xml拷贝到工程的src下面,都是可以的。进行了设置,就可以提交任务到job上了。