大数据从入门到实战 - 第3章 MapReduce基础实战_小啊呜的博客-程序员宅基地

技术标签: mapreduce  # 大数据&云计算基础  hadoop  大数据  


叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
在这里插入图片描述

一、关于此次实践

1、实战简介

MapReduce是Hadoop的核心功能之一,掌握它对学习Hadoop至关重要。

Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。

本章我们来通过几个示例来学习MapReduce的用法。

2、全部任务

在这里插入图片描述

二、实践详解

1、第 1 关:成绩统计

import java.io.IOException;
import java.util.StringTokenizer;
 
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {
    
    /********** Begin **********/
	//Mapper函数
    public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
        private int maxValue = 0;
        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    
            StringTokenizer itr = new StringTokenizer(value.toString(),"\n");
            while (itr.hasMoreTokens()) {
    
                String[] str = itr.nextToken().split(" ");
                String name = str[0];
                one.set(Integer.parseInt(str[1]));
                word.set(name);
                context.write(word,one);
            }
            //context.write(word,one);
        }
    }
    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    
        private IntWritable result = new IntWritable();
        public void reduce(Text key, Iterable<IntWritable> values, Context context)
                throws IOException, InterruptedException {
    
            int maxAge = 0;
            int age = 0;
            for (IntWritable intWritable : values) {
    
                maxAge = Math.max(maxAge, intWritable.get());
            }
            result.set(maxAge);
            context.write(key, result);
        }
    }
    public static void main(String[] args) throws Exception {
    
        Configuration conf = new Configuration();
        Job job = new Job(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        String inputfile = "/user/test/input";
        String outputFile = "/user/test/output/";
        FileInputFormat.addInputPath(job, new Path(inputfile));
        FileOutputFormat.setOutputPath(job, new Path(outputFile));
        job.waitForCompletion(true);
    /********** End **********/
    }
}

命令行
touch file01
echo Hello World Bye World
cat file01
echo Hello World Bye World >file01
cat file01
touch file02
echo Hello Hadoop Goodbye Hadoop >file02
cat file02
start-dfs.sh
hadoop fs -mkdir /usr
hadoop fs -mkdir /usr/input
hadoop fs -ls /usr/output
hadoop fs -ls /
hadoop fs -ls /usr
hadoop fs -put file01 /usr/input
hadoop fs -put file02 /usr/input
hadoop fs -ls /usr/input

测评
在这里插入图片描述

2、第 2 关:文件内容合并去重

import java.io.IOException;

import java.util.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Merge {
    

	/**
	 * @param args
	 * 对A,B两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C
	 */
	//在这重载map函数,直接将输入中的value复制到输出数据的key上 注意在map方法中要抛出异常:throws IOException,InterruptedException
	public static class Map  extends Mapper<Object, Text, Text, Text>{
    
	
    /********** Begin **********/

        public void map(Object key, Text value, Context content) 
            throws IOException, InterruptedException {
      
            Text text1 = new Text();
            Text text2 = new Text();
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
    
                text1.set(itr.nextToken());
                text2.set(itr.nextToken());
                content.write(text1, text2);
            }
        }  
	/********** End **********/
	} 
		
	//在这重载reduce函数,直接将输入中的key复制到输出数据的key上  注意在reduce方法上要抛出异常:throws IOException,InterruptedException
	public static class  Reduce extends Reducer<Text, Text, Text, Text> {
    
    /********** Begin **********/
        
        public void reduce(Text key, Iterable<Text> values, Context context) 
            throws IOException, InterruptedException {
    
            Set<String> set = new TreeSet<String>();
            for(Text tex : values){
    
                set.add(tex.toString());
            }
            for(String tex : set){
    
                context.write(key, new Text(tex));
            }
        }  
    
	/********** End **********/

	}
	
	public static void main(String[] args) throws Exception{
    

		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		conf.set("fs.default.name","hdfs://localhost:9000");
		
		Job job = Job.getInstance(conf,"Merge and duplicate removal");
		job.setJarByClass(Merge.class);
		job.setMapperClass(Map.class);
		job.setCombinerClass(Reduce.class);
		job.setReducerClass(Reduce.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		String inputPath = "/user/tmp/input/";  //在这里设置输入路径
		String outputPath = "/user/tmp/output/";  //在这里设置输出路径

		FileInputFormat.addInputPath(job, new Path(inputPath));
		FileOutputFormat.setOutputPath(job, new Path(outputPath));
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}

}

测评
在这里插入图片描述

3、第 3 关:信息挖掘 - 挖掘父子关系

import java.io.IOException;
import java.util.*;

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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class simple_data_mining {
    
	public static int time = 0;

	/**
	 * @param args
	 * 输入一个child-parent的表格
	 * 输出一个体现grandchild-grandparent关系的表格
	 */
	//Map将输入文件按照空格分割成child和parent,然后正序输出一次作为右表,反序输出一次作为左表,需要注意的是在输出的value中必须加上左右表区别标志
	public static class Map extends Mapper<Object, Text, Text, Text>{
    
		public void map(Object key, Text value, Context context) throws IOException,InterruptedException{
    
			/********** Begin **********/
		String line = value.toString();
             String[] childAndParent = line.split(" ");
             List<String> list = new ArrayList<>(2);
              for (String childOrParent : childAndParent) {
    
                 if (!"".equals(childOrParent)) {
    
                     list.add(childOrParent);
                  } 
              } 
              if (!"child".equals(list.get(0))) {
    
                  String childName = list.get(0);
                  String parentName = list.get(1);
                  String relationType = "1";
                  context.write(new Text(parentName), new Text(relationType + "+"
                        + childName + "+" + parentName));
                  relationType = "2";
                  context.write(new Text(childName), new Text(relationType + "+"
                        + childName + "+" + parentName));
              }
			/********** End **********/
		}
	}

	public static class Reduce extends Reducer<Text, Text, Text, Text>{
    
		public void reduce(Text key, Iterable<Text> values,Context context) throws IOException,InterruptedException{
    
				/********** Begin **********/

			    //输出表头
          if (time == 0) {
    
                context.write(new Text("grand_child"), new Text("grand_parent"));
                time++;
            }

				//获取value-list中value的child
List<String> grandChild = new ArrayList<>();

				//获取value-list中value的parent
 List<String> grandParent = new ArrayList<>();

				//左表,取出child放入grand_child
 for (Text text : values) {
    
                String s = text.toString();
                String[] relation = s.split("\\+");
                String relationType = relation[0];
                String childName = relation[1];
                String parentName = relation[2];
                if ("1".equals(relationType)) {
    
                    grandChild.add(childName);
                } else {
    
                    grandParent.add(parentName);
                }
            }

				//右表,取出parent放入grand_parent
 int grandParentNum = grandParent.size();
               int grandChildNum = grandChild.size();
               if (grandParentNum != 0 && grandChildNum != 0) {
    
                for (int m = 0; m < grandChildNum; m++) {
    
                    for (int n = 0; n < grandParentNum; n++) {
    
                        //输出结果
                    context.write(new Text(grandChild.get(m)), new Text(
                                grandParent.get(n)));
                    }
                }
            }
				/********** End **********/
		}
	}
	public static void main(String[] args) throws Exception{
    
		// TODO Auto-generated method stub
		Configuration conf = new Configuration();
		Job job = Job.getInstance(conf,"Single table join");
		job.setJarByClass(simple_data_mining.class);
		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		String inputPath = "/user/reduce/input";   //设置输入路径
		String outputPath = "/user/reduce/output";   //设置输出路径
		FileInputFormat.addInputPath(job, new Path(inputPath));
		FileOutputFormat.setOutputPath(job, new Path(outputPath));
		System.exit(job.waitForCompletion(true) ? 0 : 1);

	}
}

测评

在这里插入图片描述

Ending!
更多课程知识学习记录随后再来吧!

就酱,嘎啦!

在这里插入图片描述

注:
人生在勤,不索何获。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43543789/article/details/112575100

智能推荐

boa服务器实现温湿度显示,boa服务器实现CGI功能_梦终会碎的博客-程序员宅基地

CGI简介CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、VB 和Delphi 等。CG...

Airtest自动化测试——Airtest进阶和图像识别算法(下)_weixin_43802541的博客-程序员宅基地_airtest进行条件判断

Airtest的图像识别算法2.1 Airtest图像识别的基本原理以一个touch的动作为例,分析执行的日志:在识别图像的过程中,Airtest尝试用了SURFMatching、TemplateMatching和BRISKMatching这几个算法去查找,并且还分别告诉了我们这几个算法的执行结果是什么?TemplateMatching算法的执行结果里面,有一个’confidence’:0.4586929976940155,这个其实就是算法的可信度;如果算法识别的可信度(也就是confidenc

html表单下拉美化教程,使用css美化html表单控件详细示例(表单美化)_weixin_39655049的博客-程序员宅基地

一、html submit与bottom按钮基本语法结构1、html submit按钮在input标签里设置type="submit"即可设置此表单控件为按钮。submit按钮代码:submit按钮效果截图html submit按钮效果截图2、html bottom按钮在input标签里设置type="bottom"也是即可设置此表单控件为按钮。bottom按钮代码:bottom按钮截图:html...

达梦数据库学习札记-物理存储结构_林鑫燚的博客-程序员宅基地

DM数据库物理存储结构DM数据库典型的物理存储结构包括: 配置文件:用于进行功能设置 控制文件:用于记录文件分布 数据文件:用于保存用户实际数据 重做日志文件 归档日志文件 备份文件 跟踪日志文件:用于问题跟踪 ……配置文件用来设置功能选项的文本文件的集合,以ini为扩展名,主要功能如下: 1.启用/禁用特定功能 2.针对当前环境设置优化系统性能数据库服务配置 1.dm.ini文件,重要性同ORACLE的spfile文件。 1)每个DM数据库实例都会自动生成一个dm.i

我的创业之路——宁可啃馒头打地铺,也要当老板_weixin_34292287的博客-程序员宅基地

原文 我的创业之路——宁可啃馒头打地铺,也要当老板“宁可啃馒头打地铺,也要当老板”——题记家人的影响,让我热血沸腾    我生在一个不富裕的家庭,家里有四个小孩,大哥,我,小弟,妹妹。年纪都差别不大,之前同时读大学的时候,家里的经济压力特别大,父亲虽然愁白了头,表面 却装的若无其事;所以,老大大学时候,开始做兼职,KFC,便利店都做过店员。之后,开始在校园做生意,通过他独特的营销模...

NGUIJoysticK_weixin_30739595的博客-程序员宅基地

原始的:using UnityEngine;using System.Collections;public class NGUIJoystick : MonoBehaviour{ public float radius = 2.0f; public Vector3 scale = Vector3.one; private Plane ...

随便推点

Tailwind 真香_hyomei的博客-程序员宅基地_tailwind

一、导入在进入 Tailwindcss 主题之前,我们先来聊聊 css 的发展历程,这将有利于理解 tailwind 存在的意义。CSS 经历了三个阶段:原生阶段:需要什么就写什么。组件化阶段:将相同视觉的UI封装成一个组件,像Bootstrap、Element UI、Antd 都是采用这个做法,比如你需要一个按钮,要多次使用并且样式一致,就可以封装成一个按钮类,之后使用就直接用这个类名就ok了。原子化阶段:其实也是组件化的一种,只不过每个组件都是单一功能的 css 属性。举个例子

3、kafka的Java代码操作_礼彬fly的博客-程序员宅基地

maven依赖地址:http://www.mvnrepository.com/artifact/org.apache.kafka/kafka_2.10/0.8.2.0maven依赖:   org.apache.kafka kafka_2.10 0.8.2.0 生产者代码:package kafka;import java.util.Prop

【MySQL性能优化】Mysql基本性能分析命令详解_xian_02的博客-程序员宅基地

第一步 检查系统的状态通过操作系统的一些工具检查系统的状态,比如CPU、内存、交换、磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状态,因为cpu可能正等待IO的完成。除此之外,还应观注那些占用系统资源(cpu、内存)的进程。1.1 使用sar来检查操作系统是否存在IO问题#sar -u 2 10 — 即每隔2秒

Windows下安装Jenkins自动打包_一窝蜂117的博客-程序员宅基地

文章目录一、安装过程二、安装过程中可能遇到的问题1、Jenkins下载慢?2、Jenkins升级?3、插件安装失败?4、插件安装时各种异常错误?5、执行python脚本?6、发送邮件?7、钉钉消息三、参考资料原文链接:Windows下安装Jenkins自动打包一、安装过程下载jenkins安装包,windows下是一个msi文件。安装过程为傻瓜式,一直下一步就行。具体参考【Devops】【Jenkins】Jenkins插件安装失败处理方法即可。二、安装过程中可能遇到的问题1、Jenkins下载

nk_GCPANet:评测结果_计算机视觉-Archer的博客-程序员宅基地

SOD MAE=0.088190, F-score=0.860084, len(imgs)=300, fps=64.3109PASCALS MAE=0.062060, F-score=0.863891, len(imgs)=850, fps=64.6492ECSSD MAE=0.034574, F-score=0.942127, len(...

2021-11-16学习记录 浅析mybatis中mapper代理类执行select的方式_YOSHINO_Cream的博客-程序员宅基地_mapper select方法

准备一个测试方法 SqlSession sqlSession = sqlSessionFactory.openSession(); testMapper mapper = sqlSession.getMapper(testMapper.class); List&lt;User&gt; admin = mapper.selectUserByName("test1");进入selectUserByName()方法;进入到了MapperProxy.class中p

推荐文章

热门文章

相关标签