Hadoop 如何提交任务:实际案例分析

Hadoop 作为一种分布式计算平台,广泛用于大数据处理。对于数据工程师或数据科学家而言,准确高效地提交任务至关重要。本文将通过一个实际案例,深入探讨如何使用 Hadoop 提交任务,并详细介绍代码和配置的实现步骤。

实际问题

假设我们有一个 CSV 文件,其中包含用户交易记录。数据结构如下所示:

用户ID 交易金额 交易日期
1 100.5 2023-01-01
2 200.0 2023-01-03
1 150.0 2023-01-02
3 300.0 2023-01-04

我们的目标是计算每个用户的总交易金额,并将结果保存到 Hadoop 的 HDFS 中。

环境准备

在开始之前,请确保您已正确配置 Hadoop 集群,并具备一个可用的 HDFS 环境。此外,请安装 Java,并配置好 Hadoop 环境变量。

代码实现

1. 编写 MapReduce 程序

我们需要编写一个 MapReduce 程序来读取 CSV 文件,计算每个用户的总交易金额。以下是一个示例代码:

Mapper Class
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class TransactionMapper extends Mapper<Object, Text, Text, IntWritable> {
    private final static IntWritable amount = new IntWritable();
    private Text userId = new Text();

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String[] fields = value.toString().split(",");
        if (fields.length == 3) {
            userId.set(fields[0]);
            amount.set(Integer.parseInt(fields[1]));
            context.write(userId, amount);
        }
    }
}
Reducer Class
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class TransactionReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable totalAmount = 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();
        }
        totalAmount.set(sum);
        context.write(key, totalAmount);
    }
}
Driver Class
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class TransactionJob {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "transaction amount");
        job.setJarByClass(TransactionJob.class);
        job.setMapperClass(TransactionMapper.class);
        job.setReducerClass(TransactionReducer.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. 编译代码

将上述代码保存在本地文件夹中,并使用 Maven 或其他构建工具进行编译。得到的 JAR 包将用于提交任务。

3. 提交任务

上传数据到 HDFS

首先,将 CSV 文件上传至 HDFS:

hdfs dfs -put /local/path/to/transactions.csv /user/hadoop/input/
提交 MapReduce 任务

接下来,使用以下命令提交我们的 MapReduce 任务:

hadoop jar /path/to/your/jar/TransactionJob.jar TransactionJob /user/hadoop/input/transactions.csv /user/hadoop/output/

注意:完成任务后,输出路径必须为空,否则任务将失败。

4. 查看结果

任务执行完毕后,我们可以使用以下命令查看结果:

hdfs dfs -cat /user/hadoop/output/part-00000

输出结果将类似于:

1   250
2   200
3   300

这表示用户 ID 为 1 的用户总交易金额为 250,用户 ID 为 2 的总交易金额为 200,用户 ID 为 3 的总交易金额为 300。

结尾

通过上述步骤,我们实现了一个简单的 Hadoop MapReduce 程序,用于计算用户的总交易金额。Hadoop 提交任务的流程包括代码编写、数据上传及任务提交等环节。掌握这些基本操作后,您可以根据需求扩展更复杂的任务和逻辑,从而更好地适应大数据处理的需求。希望本文对您理解 Hadoop 提交任务有所帮助!