大数据之hadoop MapReduce 作业输入案例 分片逻辑实践

大数据阿木 发布于 2025-07-12 10 次阅读


Hadoop MapReduce 作业输入案例:分片逻辑实践

Hadoop 是一个开源的分布式计算框架,它允许在大量廉价的硬件上处理大规模数据集。MapReduce 是 Hadoop 中最核心的组件之一,它提供了一种编程模型来处理分布式数据集。在 MapReduce 作业中,输入数据的分片逻辑是至关重要的,因为它直接影响到作业的并行度和效率。本文将围绕一个 MapReduce 作业输入案例,深入探讨分片逻辑的实践。

MapReduce 作业概述

MapReduce 作业通常包括两个主要阶段:Map 阶段和 Reduce 阶段。Map 阶段负责将输入数据分解成键值对,而 Reduce 阶段则负责对 Map 阶段输出的键值对进行聚合。

输入数据

在 MapReduce 作业中,输入数据可以是文件、目录或 HDFS(Hadoop Distributed File System)中的数据。为了进行分片,Hadoop 会将输入数据分割成多个分片(Split),每个分片由一个 Map 任务处理。

分片逻辑

分片逻辑决定了如何将输入数据分割成分片。Hadoop 默认的分片逻辑是基于文件块(Block)的。每个文件块通常为 128MB 或 256MB,具体大小取决于 Hadoop 配置。

分片实践

以下是一个简单的 MapReduce 作业输入案例,我们将通过代码实践分片逻辑。

代码实践

1. 创建 MapReduce 作业

我们需要创建一个简单的 MapReduce 作业。以下是一个使用 Java 实现的示例:

java

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.Mapper;


import org.apache.hadoop.mapreduce.Reducer;


import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;


import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

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 {


String[] words = value.toString().split("s+");


for (String word : words) {


this.word.set(word);


context.write(this.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. 配置分片逻辑

在上面的代码中,我们没有显式地配置分片逻辑。Hadoop 默认使用文件块作为分片单位。我们可以通过以下方式来调整分片逻辑:

java

conf.setLong("mapreduce.map.input.fileinputformat.split.maxsize", 512 1024 1024); // 设置分片大小为 512MB


3. 运行作业

将上面的代码保存为 `WordCount.java`,并使用以下命令编译和运行:

bash

javac WordCount.java


hadoop jar WordCount.jar wordcount input output


其中,`input` 是输入文件路径,`output` 是输出文件路径。

总结

本文通过一个简单的 MapReduce 作业输入案例,介绍了分片逻辑的实践。分片逻辑是 MapReduce 作业中至关重要的部分,它直接影响到作业的并行度和效率。通过调整分片大小,我们可以优化 MapReduce 作业的性能。在实际应用中,根据具体的数据特点和需求,我们可以进一步优化分片逻辑,以达到最佳的性能表现。