. 编写 MapReduce 程序
-
使用 Java 编写 MapReduce 程序,包括定义 Mapper、Reducer 类以及主类中的 Job 配置代码。
-
例如,一个简单的单词计数程序:
java
复制
public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
2. 编译代码
-
在命令行中,进入包含源代码的目录。
-
使用
javac命令编译代码,生成.class文件。例如:bash
复制
javac -classpath /path/to/hadoop-common.jar:/path/to/hadoop-mapreduce-client-core.jar -d output/ WordCount.java其中,
-classpath参数用于指定 Hadoop 的相关 JAR 包路径,-d output/表示将编译后的类文件输出到output目录。
3. 打包
-
使用
jar命令将编译后的.class文件打包成一个 JAR 文件。例如:bash
复制
jar -cvf WordCount.jar -C output/ .这会将
output目录下的所有.class文件打包到WordCount.jar文件中。
4. 上传 JAR 文件到集群
-
将打包好的 JAR 文件上传到 Hadoop 集群中的某个节点上,通常可以上传到
/user/hadoop等目录下。可以使用scp命令进行上传,例如:bash
复制
scp WordCount.jar hadoop@master:/user/hadoop
5. 在集群上运行 MapReduce 程序
-
登录到集群的主节点。
-
使用
hadoop jar命令运行 MapReduce 程序。例如:bash
复制
hadoop jar /user/hadoop/WordCount.jar WordCount /input/path /output/path其中,
/user/hadoop/WordCount.jar是 JAR 文件的路径,WordCount是主类的名称,/input/path是输入文件所在的 HDFS 路径,/output/path是输出结果存储的 HDFS 路径。
注意事项
- 确保 Hadoop 集群已经正确安装并启动,可以通过
jps命令查看 Hadoop 的守护进程是否正常运行。 - 输入文件需要提前上传到 HDFS 中,可以使用
hadoop fs -put命令将本地文件上传到 HDFS。 - 输出路径不能预先存在,否则会报错。如果需要重新运行程序,可以先删除输出路径,使用
hadoop fs -rm -r /output/path命令删除输出目录。 - 在编写 MapReduce 程序时,需要注意 Hadoop 的版本与 API 的兼容性,不同版本的 Hadoop 可能会有细微的差异。