编写MapReduce程序,实现统计字符数功能,待统计数字位于HDFS分布式文件系统上,路径为/wordcount/input下,然后生成面包,提交给YATN集群运行。
时间: 2025-07-06 10:57:56 浏览: 5
### 编写MapReduce程序统计HDFS上的字符数量
为了实现这一目标,可以创建一个简单的Java MapReduce应用程序来计算给定输入文件中的总字符数。此过程涉及定义Mapper类和Reducer类,在这里不需要复杂的逻辑处理,因为只需关注字符的数量。
#### Mapper设计
Mapper的任务是从每条记录读取数据并输出键值对。对于字符计数问题来说,可以直接忽略Key部分而专注于Value即文本行本身,并假设每个映射阶段产生的中间结果为(任意常量, 字符串长度),这里的字符串长度代表单个输入行内的字符数目。
```java
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class CharCountMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable> {
private final static IntWritable one = new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
int charNum = line.length(); // 计算当前行的字符总数
context.write(one, new IntWritable(charNum));
}
}
```
#### Reducer设计
Reducer负责接收来自多个Mappers的数据并对它们进行汇总操作。在这个例子中,Reducer会接收到形如`(1, N)`这样的键值对集合,其中`N`表示某一行里的字符数量;因此,只需要累加所有的`N`值得到最终的结果——整个文档集里所有字符的总量。
```java
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;
public class CharCountReducer extends Reducer<IntWritable,IntWritable,IntWritable,IntWritable> {
public void reduce(IntWritable key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values){
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
```
#### 配置Job设置以便于提交至YARN集群执行
为了让上述编写的MapReduce应用能够在真实的生产环境中工作,还需要适当配置作业参数以适应实际部署情况下的需求。特别是当计划让该任务在基于Apache YARN框架管理资源调度器之上运行时,则应确保设置了如下几个重要属性:
- `mapreduce.framework.name=yarn`: 指明采用YARN作为MRv2版本下默认的工作模式。
- `yarn.resourcemanager.hostname=hadoop000`: 明确指出ResourceManager服务端口所在主机名或IP地址。
- `mapreduce.app-submission.cross-platform=true`: 启用跨平台提交功能允许远程客户端向不同操作系统环境发起请求。
最后一步就是构建完整的Driver代码用于启动这个特定用途的应用实例并向集群发送指令完成相应运算流程[^2]。
```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class CharCount {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "char count");
job.setJarByClass(CharCount.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(CharCountMapper.class);
job.setCombinerClass(CharCountReducer.class); // 可选:如果希望减少网络传输开销可启用组合器
job.setReducerClass(CharCountReducer.class);
FileInputFormat.addInputPath(job, new Path("/wordcount/input"));
FileOutputFormat.setOutputPath(job, new Path("/output"));
conf.set("mapreduce.framework.name", "yarn");
conf.set("yarn.resourcemanager.hostname", "hadoop000");
conf.set("mapreduce.app-submission.cross-platform", "true");
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
阅读全文
相关推荐


















