
💌 所属专栏:【大数据学习笔记(华为云)】
😀 作 者:我是夜阑的狗🐶
🚀 个人简介:一个正在努力学技术的码仔,专注基础和实战分享 ,欢迎咨询!
💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘
您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩

前言
大家好,又见面了,我是夜阑的狗,本文是专栏【大数据学习笔记(华为云)】专栏的第3篇文章,主要讲解是华为云MapReduce编程实践。
专栏地址:【大数据学习笔记(华为云)】, 此专栏是我是夜阑的狗对华为云MapReduce编程实践,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
一、MapReduce编程实践
1.实验目的
1、通过实验掌握基本的MapReduce编程方法;
2、掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。
2.实验平台
1、操作系统:Linux
2、Hadoop版本:3.0.0或以上版本
3、JDK版本:1.6或以上版本
4、Java IDE:Eclipse
二、内容和要求以及代码实现
Step 1.编程实现文件合并和去重操作;
对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考。



思路:
1、先将上面的文件copy到自己的电脑,分别用A、B命名,然后将文件A、B上传到HDFS
2、编写 mapreduce 函数
i. map 函数功能是按行读取文件,然后 key 为这一行的内容,value 可以随意
ii. reduce 函数将相同key的输出一次即可
Merge.java
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Mapper.Context;
public class Merge {
public static class TokenizerMapper extends Mapper<Object, Text, Text, Text> {
private Text keyText = new Text();
private Text valueText = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
valueText.set("");//value设置为一个空值
keyText.set(value.toString());//将整行都作为key
context.write(keyText, valueText);
}
}
public static class IntSumReducer extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
Text str = values.iterator().next();//同一个key下的多个value,只输入第一个
context.write(key, str);
}
}
}
demo.java进行启动
public static void main(String[] args) throws Exception {
...
Job job = Job.getInstance(conf, "Merge");
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("/2000390105csh/merge/input/"));
FileOutputFormat.setOutputPath(job, new Path("/2000390105csh/merge/output/"));
job.waitForCompletion(true);
...
}
TokenizerMapper 为下面写的 mapper 操作,IntSumReducer 为下面写的 reuducers 操作,inputpath 为输入文件的路径,outputpath 为输入的目录
运行结果:



Step 2.编写程序实现对输入文件的排序
现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两个整数,第一个数字为第二个整数的排序位次,第二个整数为原待排列的整数。下面是输入文件和输出文件的一个样例供参考。



根据输入文件1、2和3得到的输出文件如下:

思路:
- 1、先将上面的文件copy到自己的电脑,分别用1、2、3命名,然后将文件1、2、3上传到HDFS的一个目录
- 2、编写mapreduce函数
Sort.java
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Mapper.Context;
public class Sort {
public static int counter = 1;
public static class TokenizerMapper extends Mapper<Object, Text, IntWritable, IntWritable> {
private IntWritable mapperValue = new IntWritable(); //存放key的值
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString(); //获取读取的值,转化为String
mapperValue.set(Integer.parseInt(line)); //将String转化为Int类型
context.write(mapperValue, new IntWritable(1)); //将每一条记录标记为(key,value) key--数字 value--出现的次数
//每出现一次就标记为(number,1)
}
}
public static class IntSumReducer extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable> {
private IntWritable postion = new IntWritable(1); //存放名次
@Override
protected void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
for (IntWritable item : values) { //同一个数字可能出多次,就要多次并列排序
context.write(postion, key); //写入名次和具体数字
System.out.println(postion + "\t" + key);
postion = new IntWritable(postion.get() + 1); //名次加1
}
}
}
}
执行mapreduce函数,demo.java进行启动
public static void main(String[] args) throws Exception {
...
Job job = Job.getInstance(conf, "Sort");
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("/2000390105csh/sort/SortInput/"));
FileOutputFormat.setOutputPath(job, new Path("/2000390105csh/sort/SortOutput/"));
job.waitForCompletion(true);
...
}
运行结果:



总结
通过本次实验基本掌握了基本的 MapReduce 编程方法;以及用 MapReduce 解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。在实验中遇到以下问题及解决方法:
问题1:在运行第二个程序的时候,出现只有文件夹没有输出结果的情况;
解决方法:在多次的调试下,发现是写排序 mapreduce 函数的类没有导入 demo 中,导入的是第一个程序的类,所以才出现这种情况,把类导入之后就可以成功运行了。
以上就是今天要记录的内容了。
感谢观看,如果有帮助到你,请给文章点个赞和收藏,让更多的人看到。🌹 🌹 🌹
也欢迎你,关注我。👍 👍 👍
原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉
更多专栏订阅:
- 😀 【LeetCode题解(持续更新中)】
- 🌼 【鸿蒙系统】
- 👑 【Python脚本笔记】
- 🚝 【Java Web项目构建过程】
- 💛 【微信小程序开发教程】
- ⚽ 【JavaScript随手笔记】
- 🤩 【大数据学习笔记(华为云)】
- 🦄 【程序错误解决方法(建议收藏)】
- 🚀 【软件安装教程】
订阅更多,你们将会看到更多的优质内容!!
386

被折叠的 条评论
为什么被折叠?



