华为云MapReduce编程实践学习笔记(三)

请添加图片描述

  • 💌 所属专栏:【大数据学习笔记(华为云)】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的码仔,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是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 中,导入的是第一个程序的类,所以才出现这种情况,把类导入之后就可以成功运行了。
  以上就是今天要记录的内容了。

  感谢观看,如果有帮助到你,请给文章点个赞和收藏,让更多的人看到。🌹 🌹 🌹

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:



订阅更多,你们将会看到更多的优质内容!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是夜阑的狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值