写在前面
本文以 Hadoop 2.7.7 分布式集群环境下的一个HDFS的判断文件存不存在的小实例来介绍Hadoop2.x 版本中如何使用命令行编译打包运行HDFS程序。
将 Hadoop 的classhpath 信息添加到 CLASSPATH 变量
Hadoop 2.x 版本中 jar 不再集中在一个 hadoop-core*.jar 中,而是分成多个 jar,如使用 Hadoop 2.7.7 运行 WordCount 实例至少需要如下三个 jar:
- $HADOOP_HOME/share/hadoop/common/hadoop-common-2.7.7.jar
- $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.7.jar
- $HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar
实际上,通过命令 hadoop classpath
我们可以得到运行 Hadoop 程序所需的全部 classpath 信息。
我们将 Hadoop 的classhpath 信息添加到 CLASSPATH 变量中,在 ~/.bashrc 中增加如下几行:
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
别忘了执行 source ~/.bashrc
使变量生效。
编译、打包和执行HDFS程序
编写HDFS程序,这里以一个判断指定文件存不存在的小栗子为例
vi FileExist.java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class FileExist {
public static void main(String[] args){
try{
String fileName = "test";
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://Master:9000");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path(fileName))){
System.out.println("文件存在");
}else{
System.out.println("文件不存在");
}
}catch (Exception e){
e.printStackTrace();
}
}
}
javac
命令编译FileExist.java
javac FileExist.java
编译后可以看到生成了一个 .class 文件
接着把 .class 文件打包成 jar,才能在 Hadoop 中运行
jar -cvf FileExist.jar ./FileExist*.class
打包完成后,可以发现生成了一个FileExist.jar包
接下来我们可以运行jar包
hadoop jar FileExist.jar FileExist
FileExist.jar为我们运行的jar包,FileExist为jar包的main方法所在的类
运行结果
使用命令行编译打包运行HDFS程序的小示例就写到这里,当然你也可以使用命令行编译打包运行MapReduce程序,与编译打包运行HDFS程序异曲同工,具体可参考 使用命令行编译打包运行自己的MapReduce程序