hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式:
1.将生成的jar包,复制到hadoop集群中的节点,然后运行
$HADOOP_HOME/bin/hadoop xxx.jar xxx.WordCount /input/xxx.txt /output
2.或者直接在IDE环境中调试(参见eclipse/intellij idea 远程调试hadoop 2.6.0)
但是生产环境中,更多的情况是:没有ide环境,且各应用最终生成的jar包部署在应用服务器上(应用服务器并非hadoop集群中的服务器节点),所以需要jar能独立运行并能连接到hadoop环境,以下是关键点:
1. pom.xml中将WordCount所依赖的jar包依赖项,全添加进来(这样最终运行时,这些jar包就不用依赖ide或hadoop运行环境)
2. 参考maven: 打包可运行的jar包(java application)及依赖项处理 一文将依赖的jar包导出,且通过maven插件自动修改MANIFEST.MF中的Main-Class信息
3. core-site.xml要复制到maven项目的resources目录下(这样打包后,xml会复制到classpath下,运行时,根据这个配置文件,WordCount就能知道去连哪里的hadoop)
4. 部署时,将最终生成的WordCount jar包及依赖的lib包,全上传到应用服务器
然后就能直接以类似
java -jar hadoop-helloworld.jar /jimmy/input/README.txt /jimmy/output 运行
最后附几个关键文件内容:
a. pom.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>cn.cnblogs.yjmyzz</groupId> 8 <artifactId>hadoop-helloworld</artifactId> 9 <version>1.0</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>org.apache.hadoop</groupId> 14 <artifactId>hadoop-common</artifactId> 15 <version>2.6.0</version> 16 </dependency> 17 <dependency> 18 <groupId>org.apache.hadoop</groupId> 19 <artifactId>hadoop-hdfs</artifactId> 20 <version>2.6.0</version> 21 </dependency> 22 <dependency> 23 <groupId>org.apache.hadoop</groupId> 24 <artifactId>hadoop-mapreduce-client-jobclient</artifactId> 25 <version>2.6.0</version> 26 </dependency> 27 <dependency> 28 <groupId>commons-cli</groupId> 29 <artifactId>commons-cli</artifactId> 30 <version>1.2</version> 31 </dependency> 32 </dependencies> 33 34 <build> 35 <finalName>${project.artifactId}</finalName> 36 37 <plugins> 38 <plugin> 39 <groupId>org.apache.maven.plugins</groupId> 40 <artifactId>maven-jar-plugin</artifactId> 41 <configuration> 42 <archive> 43 <manifest> 44 <mainClass>cn.cnblogs.yjmyzz.WordCount</mainClass> 45 <addClasspath>true</addClasspath> 46 <classpathPrefix>lib/</classpathPrefix> 47 </manifest> 48 </archive> 49 <classesDirectory> 50 </classesDirectory> 51 </configuration> 52 </plugin> 53 </plugins> 54 </build> 55 56 <!--mvn dependency:copy-dependencies -DoutputDirectory=target/lib--> 57 58 </project>