在配置了伪分布式 hadoop 集群后, 接下来就可以写 MapReduce 程序, 在集群中运行并且可以调试. 一般来说需要将代码打成 jar 包, 然后在 hadoop 集群中使用 hadoop jar 命令来运行, 但是这样无法调试打断点, 因此 IDEA 远程调试是有必要的.
本地准备 hadoop 包
将安装了 hadoop 集群的 tar 包, 在 Windows 选择一个目录, 进行解压保存一份.
IDEA 中导包
IDEA 中建立 Module 后, 需要导入依赖 jar 包, 来源就是上面解压的 share 目录下的 jar 包, 需要在对应 Module 点击 Dependencies 导入 common,hdfs,MapReduce 和 yarn 下的包, 导入后效果如图.
准备 winutils.exe 等文件
hadoop 天然对 Windows 开发不友好, 因此需要添加如下插件, 将其整体粘贴到本地 hadoop 的 bin 目录下, 并且双击 winutils.exe 文件运行一下. 如果不设置, 后面运行 MapReduce 会提示 winutils 文件找不到的错误.
Windows 环境变量
以上配置完成后, 依然是无法远程调试的, 还需要修改 Windows 环境变量, 添加本地 hadoop 的 bin 目录, 并且还需要添加 HADOOP_USER_NAME 这样系统变量.
(1)hadoop 环境变量设置.
(2)添加 HADOOP_USER_NAME 系统变量, 值为 root, 如果不设置后面运行 MapReduce 会报权限不够.
准备 MapReduce 程序
再完成上面的配置后, 才能到这一步. 这里简单的准备一个 MapReduce 程序, 就是统计一段文本中单词出现的次数, 需要使用空格拆分每行数据.
mapper 类
- package com.boe.mapreduce02;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Mapper;
- import java.io.IOException;
- /**
- * Mapper 类, 来完成 Map 阶段
- */
- public class CharMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- // 每行读取
- //context 用它写到 reducer
- String[] str = value.toString().split(" ");
- for (String c : str) {
- context.write(new Text(c),new IntWritable(1));
- }
- }
- }
- View Code
reducer 类
package com.boe.mapreduce02; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; /** * Reducer */ public class CharReducer extends Reducer<Text,IntWritable,Text,IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { //values 是迭代器, reduce 阶段和并分区数据, 并将结果存入到迭代器中, 结果为 [1111111...] 这样的数据 //context, 用它写到 hdfs int sum=0; for (IntWritable value : values) { sum+=value.get(); } context.write(key,new IntWritable(sum)); } } View Code
主类
package com.boe.mapreduce02; 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; import java.io.IOException; /** * mapreduce 入门 */ public class CharacterCount { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { // 向 yarn 提交一个 job Job job=Job.getInstance(new Configuration()); // 设置入口类 job.setJarByClass(CharacterCount.class); // 设置 mapper 类和 reducer 类 job.setMapperClass(CharMapper.class); job.setReducerClass(CharReducer.class); // 设置 map 输出格式 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); // 设置 reduce 输出格式 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 如果 map 输出格式和 reduce 输出格式一样, 就只需要设置 reduce 就行 // 设置读取的文件 FileInputFormat.addInputPath(job,new Path("hdfs://192.168.200.100:9000/txt/words.txt")); // 设置输出路径 // 输出路径必须不存在 FileOutputFormat.setOutputPath(job,new Path("hdfs://192.168.200.100:9000/wordcount")); // 提交 job.waitForCompletion(true); } } View Code
准备 words.txt 文件
运行后查看输出结果, 发现正常的输出统计结果, 单词和统计数值之间是使用制表符''\t''来分开, 发现它们间距有些不一致. 因为一个制表符是 8 个空格的位置, 比如 football 刚好 8 个空格, 和 1 之间就会有 8 位的空格, 而 about 这种不到 8 位的单词, 它后面的 1 就会按照 about 的首字母 a 来开始算, 往后退 8 个空格展示, 因此就有了看上去不整齐的结果.
这样就完成了 Windows 下 IDEA 实现远程调试 Hadoop 伪分布式集群的配置使用, 记录一下后面查看用.
参考博文:
(1)
来源: http://www.bubuko.com/infodetail-3319860.html