MapReduce 程序运行方式

本文详细介绍了MapReduce程序的两种运行方式:本地运行模式和集群运行模式。本地运行模式适用于调试和测试,可通过Eclipse在本地环境中运行,数据输入输出既可在本地也可在HDFS。集群运行模式则涉及打jar包并提交到集群运行,适用于处理大规模数据集。

MapReduce 程序运行方式

MapReduce 程序运行方式:
本地运行模式
集群运行模式
本地运行模式:
Eclipse 开发环境下本地运行,好处是方便调试和测试
要点一:MapReduce 程序是被提交给 LocalJobRunner 在本地以单进程的形式运行
要点二:数据输入输出可以在本地,也可以在 HDFS
要点三:怎么实现本地运行?在你的 MapReduce 程序当中不要带集群的配置文件(本质就是由mapreduce.framework.name和yarn.resourcemanager.hostname两个参数决定)
要点四:要想实现本地运行,还得做一件事:给 eclipse 安装 hadoop,
有两种方式处理:
1、这个 hadoop 安装必须是 hadoop 在 windows 平台上编译的对应版本。
需要在 windows 本地配置环境变量:
%HADOOP_HOME% = c:/myProgram/hadoop-2.6.1
%PATH% = %HADOOP_HOME%\bin
并且要将 c:/myProgram/hadoop-2.6.1 的 lib 和 bin 目录替换成 windows 平台编译版本
2、这个 hadoop 也可以 apache 官网的安装包,也可以是其他平台编译的,但是需要windows 平台运行的其他工具支持。
注意,windows 本地也需要安装 hadoop,并且配置环境变量

然后,寻找对应 hadoop 版本的 hadoop.dll 和 winutils.exe 文件,分别做如下处理:
1、hadoop.dll 放置在 c:/windows/system32 文件夹中
2、winutils.exe 放置在$HADOOP_HOME/bin 目录中
3、给 eclipse 配置 hadoop 安装目录,
windows -> preferences ->Hadoop Map/Reduce ->Hadoop Installation Direcotry
然后重启 eclipse 即可

集群运行模式:
打 jar 包,提交任务到集群运行
要点一:首先要把代码打成 jar 上传到 linux 服务器
要点二:用 hadoop jar 的命令去提交代码到 yarn 集群运行
要点三:处理的数据和输出结果应该位于 hdfs 文件系统
要点四:如果需要在 windows 中的 eclipse 当中直接提交 job 到集群,则需要修改

综合以上两种方式的的运行发现,第 1 种和第 2 种比较方便做调试。

<think>嗯,用户想了解如何编写和运行MapReduce程序。这是一个非常实用的技术需求,特别是对于处理大数据的开发者。我可以根据之前的系统级引用和标准MapReduce知识来组织回答。用户提到的引用[1]关于MRJob工具特别值得展开,因为它提供了本地调试的轻量级解决方案。引用[2][3]提到的IDEA配置细节也很关键,这些是实际开发中最常遇到的痛点。准备从三个核心部分来回应:首先是基本程序结构,要强调Mapper和Reducer的抽象关系;然后是运行方式的比较说明;最后是开发环境配置的具体技巧。对于每个要点,都应该给出具体示例和配置说明,比如Python的MRJob示例和Java的IDEA配置要点。用户看起来像是有编程基础的开发者,可能会在意实际配置细节,所以需要详细说明mapred-site.xml等配置文件的修改位置。同时要注意Hadoop环境差异的提示,这能帮助避免兼容性问题。考虑在最后添加常见问题部分,因为运行环境搭建往往充满陷阱,Hadoop版本冲突等问题可以帮助用户少走弯路。如果能提供可运行的Python代码示例就更好了,这样用户可以直接复制测试。</think> 编写和运行MapReduce程序主要分为以下步骤(以**Java + Hadoop 3.x**为例): --- ### 一、编写MapReduce程序 #### 1. **程序结构** ```java public class WordCount { // Mapper类 public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> { @Override public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { context.write(new Text(itr.nextToken()), new IntWritable(1)); } } } // Reducer类 public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override public void reduce(Text 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)); } } // 主函数 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.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); } } ``` --- ### 二、运行方式 #### 1. **本地模式调试** ```bash # 设置Hadoop为本地模式 export HADOOP_CONF_DIR=/path/to/empty_conf_dir # 清空配置指向 # 直接运行Java程序 (需包含hadoop依赖) java -classpath hadoop-classpath:your.jar WordCount input.txt output ``` #### 2. **使用MRJob (Python版快速开发)** ```python # word_count.py from mrjob.job import MRJob class MRWordCount(MRJob): def mapper(self, _, line): for word in line.split(): yield word, 1 def reducer(self, word, counts): yield word, sum(counts) if __name__ == '__main__': MRWordCount.run() ``` 运行命令: ```bash python word_count.py -r local input.txt > output.txt # 本地测试[^1] ``` #### 3. **集群模式运行** ```bash # 打包程序为JAR mvn package # Maven项目 # 提交到Hadoop集群 hadoop jar target/your-app.jar WordCount /hdfs/input /hdfs/output ``` --- ### 三、开发环境配置(IDEA) 1. **关键配置项**: ```xml <!-- mapred-site.xml 示例配置 --> <property> <name>mapreduce.job.jar</name> <value>D:\project\target\your-app.jar</value> <!-- JAR包路径 --> </property> <property> <name>mapreduce.app-submission.cross-platform</name> <value>true</value> <!-- 跨平台支持[^2] --> </property> ``` 2. **Log4j日志输出配置**(调试用): ```properties log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5p | %-16t | %-32c{1} | %4L | %m%n[^3] ``` --- ### 四、连接HDFS ```java // Java连接HDFS示例 Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://namenode:9000"); FileSystem fs = FileSystem.get(conf); // 读写操作 fs.copyFromLocalFile(new Path("local.txt"), new Path("/hdfs/dir")); ``` --- **常见问题解决**: - **ClassNotFoundException**:确保`mapreduce.job.jar`指向正确JAR - **跨平台错误**:启用`mapreduce.app-submission.cross-platform` - **权限问题**:配置`core-site.xml`中的HDFS用户 - **Python依赖**:使用`virtualenv`安装`mrjob`包 > **注意**:Hadoop 2.x/3.x配置差异较大,需核对版本文档。实际提交时建议通过`hadoop classpath`获取依赖路径[^2][^3]。 --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值