MapReduce编程:join操作和聚合操作

news2024/11/18 22:58:05

文章目录

  • MapReduce 编程:join操作和聚合操作
    • 一、实验目标
    • 二、实验要求及注意事项
    • 三、实验内容及步骤
  • 附:系列文章

MapReduce 编程:join操作和聚合操作

一、实验目标

  1. 理解MapReduce计算框架的分布式处理工作流程
  2. 掌握用mapreduce计算框架实现Map端的本地聚合操作
  3. 掌握MapReduce编程的map端join操作

二、实验要求及注意事项

  1. 给出每个实验的主要实验步骤、实现代码和测试效果截图。
  2. 对本次实验工作进行全面的总结分析。
  3. 所有程序需要本地测试和集群测试,给出相应截图。
  4. 建议工程名,类名或包名等做适当修改,显示个人学号或者姓名

三、实验内容及步骤

实验任务1:使用MapReduce编程,如果涉及到join操作,一般使用的是reduce端的join;但如果其中一个文件较小,可以将其添加到分布式缓存当中去,在map阶段时,每一个map task开始运行前,先从分布式缓存中取出此小文件,在map方法中对数据进行join操作,即map join操作。本实验使用的输入文件分别是uid-list和sogou,uid-lis保存着搜索过“电影”的用户的UID(比较小),sogou是日志文件;对于处于uid-list中的用户,把他们在sogou日志文件中的uid及搜索关键词输出到HDFS。实现效果如图1和图2所示。

1.1

1.2

主要实现步骤和运行效果图:

(1)进入虚拟机并启动Hadoop集群,完成文件上传。
(2)启动Eclipse客户端,新建一个java工程;在该工程中创建package,导入jar包,完成环境配置,依次创建包、Mapper类,Reducer类和主类等;

1.3

(3)完成代码编写。

JoinMap

package hadoop;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.io.*;


public class WjwJoinMap extends Mapper<Object, Text, Text, Text>{
	private Map<String, Integer> map = new HashMap<String, Integer>();
	private Text uid = new Text();
	protected void setup(Context context) throws IOException, InterruptedException{
		@SuppressWarnings("resource")
		BufferedReader br = new BufferedReader(new FileReader("uuid"));
		String line = null;
		while((line=br.readLine())!=null){
			System.out.println(line);
			map.put(line.trim(), 1);
		}
	}
	protected void map(Object key, Text value, Context context) throws IOException, InterruptedException{
		String[] arr = value.toString().split("\t");
		String keyword = arr[2];
		if(arr[1]!=null && map.get(arr[1])!=null){
			uid.set(arr[1]);
			context.write(uid, new Text(keyword));
			
		}
	}

}

JoinMain

package hadoop;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.*;
import org.apache.hadoop.mapreduce.lib.output.*;

public class WjwJoinMain {
	public static void main(String[] args) throws IOException, URISyntaxException, ClassNotFoundException, InterruptedException{
		if(args==null || args.length!=3){
			System.out.println("error");
			System.exit(0);
		}
		Job job = Job.getInstance(new Configuration(), "WjwJoinMain");
		job.setJarByClass(WjwJoinMain.class);
		job.setMapperClass(WjwJoinMap.class);
		job.setNumReduceTasks(0);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		Path path = new Path(args[0]);
		String pathLink = path.toUri().toString() + "#uuid";
		job.addCacheFile(new URI(pathLink));
		FileInputFormat.addInputPath(job, new Path(args[1]));
		FileOutputFormat.setOutputPath(job, new Path(args[2]));
		job.waitForCompletion(true);
	}

}

(4)测试程序,并查看输出结果。

1.4

实验任务2: Map端本地聚合,读取文本文件/home/zkpk/word.txt,进行单词计数,为了减少网络传输数据量,且使用本地聚合不会影响最终结果,在map端进行本地聚合。

2.1

2.2

主要实现步骤和运行效果图:

(1)进入虚拟机并启动Hadoop集群,完成文件上传。
(2)启动Eclipse客户端,新建一个java工程;在该工程中创建package,导入jar包,完成环境配置,依次创建包、Mapper类,Reducer类和主类等;

2.3

(3)完成代码编写。

WordMap

package hadoop;

import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

import org.apache.hadoop.io.*;

public class WjwWordMap extends Mapper<Object, Text, Text, IntWritable>{
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException{
    	String arr[] = value.toString().split(" ");
    	for(String word:arr){
    		context.write(new Text(word), new IntWritable(1));
    	}
    }
}

WordReduce

package hadoop;

import java.io.IOException;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Reducer;

public class WjwWordReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
	protected 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));
	}

}

WordMain

package hadoop;

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;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;

public class WjwWordMain {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
		if(args==null || args.length!=2){
			System.out.println("error");
		}
		Job job = Job.getInstance(new Configuration(), "WjwWordMain");
		job.setJarByClass(WjwWordMain.class);
		job.setMapperClass(WjwWordMap.class);
		job.setCombinerClass(WjwWordReduce.class);
		job.setReducerClass(WjwWordReduce.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		job.waitForCompletion(true);
	}

}

(4)测试程序,并查看输出结果。

2.4

附:系列文章

实验文章目录直达链接
实验01Hadoop安装部署https://want595.blog.csdn.net/article/details/132767284
实验02HDFS常用shell命令https://want595.blog.csdn.net/article/details/132863345
实验03Hadoop读取文件https://want595.blog.csdn.net/article/details/132912077
实验04HDFS文件创建与写入https://want595.blog.csdn.net/article/details/133168180
实验05HDFS目录与文件的创建删除与查询操作https://want595.blog.csdn.net/article/details/133168734
实验06SequenceFile、元数据操作与MapReduce单词计数https://want595.blog.csdn.net/article/details/133926246
实验07MapReduce编程:数据过滤保存、UID 去重https://want595.blog.csdn.net/article/details/133947981
实验08MapReduce 编程:检索特定群体搜索记录和定义分片操作https://want595.blog.csdn.net/article/details/133948849
实验09MapReduce 编程:join操作和聚合操作https://want595.blog.csdn.net/article/details/133949148
实验10MapReduce编程:自定义分区和自定义计数器https://want595.blog.csdn.net/article/details/133949522

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1120804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python调用astra进行人脸检测(使用CascadeClassifier)

1、简述 方法&#xff1a;使用opecv中&#xff0c;CascadeClassifier 级联分类器实现人脸检测&#xff0c;CascadeClassifier就是opencv下objdetect模块中用来做目标检测的级联分类器的一个类&#xff0c;它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别…

C++17中std::string_view的使用

为了解决std::string初始化(或拷贝)成本高昂的问题&#xff0c;C17引入了std::string_view。std::string_view提供对现有字符串(C风格字符串、std::string、或另一个std::string_view)的只读访问&#xff0c;而无需进行拷贝。当想要有效地处理和操作字符串而不修改它们时&#…

用python计算积分

先安装这个包 pip install scipy运行 import tkinter as tk from scipy.integrate import quad# 创建主窗口 root tk.Tk() root.title("积分计算器")# 定义计算积分的函数 def calculate_integral():# 获取用户输入的函数表达式function function_entry.get()# 获…

2023年最全的外贸建站新手教程

凡做外贸的&#xff0c;我相信在过去几年中通过亚马逊、速卖通等电商平台上都取得了一定的成功。然而&#xff0c;近年来电商平台上的竞争激烈&#xff0c;利润空间有限&#xff0c;流量获取困难和昂贵&#xff0c;这对许多外贸从业者造成了困扰。因此&#xff0c;为了减少对平…

分析概览 文章管理 草稿管理 图片管理 站点管理 主站 关于 登出 手写操作系统项目----进程

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 这里记录了&#xff0c;手写操作系统项目中关于进程的部分。 进程四要素 首先进程有四要素。 …

golang 八股文整理

目录 进程、线程、协程Go 的垃圾回收机制GC 的触发条件GC 的调优GMP 调度和 CSP 模型Goroutine 的调度原理Goroutine 的切换时机Context 结构原理Context 工作原理Context 使用场景Golang 的内存分配机制竞态问题内存逃逸golang 内存对齐机制golang 中 new 和 make 的区别&…

数二思维导图

高数上 第一章&#xff1a;函数、极限、连续 函数 函数的单调性、周期性、奇偶性复合函数 极限 求直接代入型的极限求∞∞型的极限用等价无穷小代换求00型的极限用洛必达法则求00型或∞∞型的极限求∞•0型的极限求幂指函数的极限函数的左右极限及需要求左右极限的情形极限的…

还不知道光场相机吗?

1.什么是光场&#xff1f; 光场&#xff08;light field&#xff09;&#xff1a;就是指光在每一个方向通过每一个点的光量。 从概念里&#xff0c;你至少可以得到两点信息&#xff1a; 光场包含光的方向光场包含一个点的光量 2.什么是光场相机 我们知道普通的相机拍照成像…

Parallels Client for Mac:改变您远程控制体验的革命性软件

在当今数字化的世界中&#xff0c;远程控制软件已经成为我们日常生活和工作中不可或缺的一部分。在众多远程控制软件中&#xff0c;Parallels Client for Mac以其独特的功能和出色的性能脱颖而出&#xff0c;让远程控制变得更加简单、高效和灵活。 Parallels Client for Mac是…

Redis的五种常用(基本)数据类型

目录 1、Redis简介 2、五种常用&#xff08;基本&#xff09;数据类型 2.1 String 数据结构 ⭐常用用法 举例&#xff08;Linux版本&#xff09; 2.2 List 数据结构 ⭐常用用法 举例&#xff08;Linux版本&#xff09; 2.3 Set 数据结构 ⭐常用用法 举例&#xf…

【未完待续】计算机组成与体系结构第三次试验:微程序控制器实验

计算机组成与体系结构第三次试验&#xff1a;微程序控制器实验 前言一、实验目的二、实验内容三、实验器件四、实验原理五、 实验步骤六、 实验结果七、思考题 前言 为了帮助同学们完成痛苦的实验课程设计&#xff0c;本作者将其作出的实验结果及代码贴至CSDN中&#xff0c;供…

机器学习中的核方法

一、说明 线性模型很棒&#xff0c;因为它们易于理解且易于优化。他们受苦是因为他们只能学习非常简单的决策边界。神经网络可以学习更复杂的决策边界&#xff0c;但失去了线性模型良好的凸性特性。 使线性模型表现出非线性的一种方法是转换输入。例如&#xff0c;通过添加特征…

BetaFlight飞控AOCODAF435V2MPU6500固件编译

BetaFlight飞控AOCODAF435V2MPU6500固件编译 1. 源由2. 准备2.1 板子2.2 代码2.3 工具 3. 配置修改4. 编译4.1 获取代码4.2 获取配置4.3 编译固件4.4 DFU烧录4.5 版本核对 5. 总结 1. 源由 刚拿到一块Aocoda F405V2 (MPU6500) AT32F435飞控板(替换主控芯片)。 Aocoda-RC F40…

unity中方向的两种表示:欧拉角和四元数

欧拉角&#xff1a;简单来说就是你可以选择 0度~360度 的范围 四元数&#xff1a;在计算机图像学中&#xff0c;四元数用于物体的旋转&#xff0c;是一种复杂&#xff0c;但效率较高的旋转方式 Quaternion结构体代表一个四元数&#xff0c;包含一个标量和一个三维向量&#x…

02、Python 字符串

目录 字符串的基础用法字符串包含引号字符串拼接获取用户输入长字符串原始字符串字节串字符串与字节串转换 字符串的基础用法 列字符串的内容几乎可以包含任何字符&#xff0c;英文字符也行&#xff0c;中文字符也行。 既可用单引号&#xff0c;也可用双引号 字符串包含引号…

函数和执行上下文

一.变量提升与函数提升 变量提升&#xff1a;通过var关键字定义&#xff08;声明&#xff09;的变量&#xff0c;在定义语句之前就可以访问到&#xff0c;只不过其值是undefined 函数提升&#xff1a;通过function声明的函数&#xff0c;在之前就可以调用&#xff0c;值是函数…

onehot-词嵌入-图嵌入

目录 一、为什么要有词嵌入&#xff1f; 二、one-hot编码&#xff1a; 三、什么是词嵌入&#xff08;word embedding&#xff09; 1、什么是嵌入矩阵&#xff1f; 2、为什么要设置维数&#xff1f; 3、相比one-hot编码的优点 4、什么是word2vec和GLove&#xff1f; 四、…

【计算机毕设案例推荐】高校学术研讨信息管理系统小程序SpringBoot+Vue+小程序

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的高校学术研讨信息管理系统小程序 技术栈 SpringBoot小程序VueMySQLMaven 文…

珠宝行业软件,虽简约但不简单

作者&#xff1a;永远的新手 从学习猫框以来&#xff0c;一直向猫老师请教如何学习猫框和VFP的基础知识&#xff0c;猫老师不厌其烦传授知识于我。因为我是一位纯业余VFP爱好者&#xff0c;我的VFP几乎是零基础&#xff0c;接触猫框后&#xff0c;虽说时间很短&#xff0c;但其…