mapreduce-打包运行在集群中

95 阅读2分钟

. 编写 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 可能会有细微的差异。