基于MapReduce的应用案例

MapReduce综合应用案例 EduCoder上的大数据技术原理与应用的实训项目。 阅读详情

项目托管于 Github,欢迎Star | Fork 互相学习 基于MapReduce的应用案例

环境说明

Hadoop搭建环境:

| 虚拟机操作系统: CentOS6.3 64位,单核,1G内存
| JDK:1.7.0_60 64位
| Hadoop:2.4.1

MR程序编译环境:

| Eclipse IED
| mapred.LocalJobRunner本地运行模式

准备测试数据

测试数据包括两个文件dept(部门)和emp(员工),其中各字段用逗号分隔:

dept文件内容:

10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON

emp文件内容:

7369,SMITH,CLERK,7902,17-12月-80,800,,20
7499,ALLEN,SALESMAN,7698,20-2月 -81,1600,300,30
7521,WARD,SALESMAN,7698,22-2月 -81,1250,500,30
7566,JONES,MANAGER,7839,02-4月 -81,2975,,20
7654,MARTIN,SALESMAN,7698,28-9月 -81,1250,1400,30
7698,BLAKE,MANAGER,7839,01-5月 -81,2850,,30
7782,CLARK,MANAGER,7839,09-6月 -81,2450,,10
7839,KING,PRESIDENT,,17-11月-81,5000,,10
7844,TURNER,SALESMAN,7698,08-9月 -81,1500,0,30
7900,JAMES,CLERK,7698,03-12月-81,950,,30
7902,FORD,ANALYST,7566,03-12月-81,3000,,20
7934,MILLER,CLERK,7782,23-1月 -82,1300,,10

应用案例

例子1:求各个部门的总工资

问题分析

MapReduce中的join分为好几种,比如有最常见的 reduce side join、map side join和semi join 等。reduce join 在shuffle阶段要进行大量的数据传输,会造成大量的网络IO效率低下,而map side join 在处理多个小表关联大表时非常有用 。
Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样我们可以将小表复制多份,让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。为了支持文件的复制,Hadoop提供了一个类DistributedCache,使用该类的方法如下:

(1)用户使用静态方法DistributedCache.addCacheFile()指定要复制的文件,它的参数是文件的URI(如果是HDFS上的文件,可以这样:hdfs://jobtracker:50030/home/XXX/file)。JobTracker在作业启动之前会获取这个URI列表,并将相应的文件拷贝到各个TaskTracker的本地磁盘上。

(2)用户使用:在分布式环境DistributedCache.getLocalCacheFiles()/在伪分布式环境DistributedCache.getCacheFiles()方法获取文件目录,并使用标准的文件读写API读取相应的文件。
在下面代码中,将会把数据量小的表(部门dept)缓存在内存中,在Mapper阶段对员工部门编号映射成部门名称,该名称作为key输出到Reduce中,在Reduce中计算按照部门计算各个部门的总工资。

处理流程图

求各个部门的总工资处理流程图

代码

Q1SumDeptSalary.java


例子2:求各个部门的人数和平均工资

问题分析

求各个部门的人数和平均工资,需要得到各部门工资总数和部门人数,通过两者相除获取各部门平均工资。首先和问题1类似在Mapper的Setup阶段缓存部门数据,然后在Mapper阶段抽取出部门编号和员工工资,利用缓存部门数据把部门编号对应为部门名称,接着在Shuffle阶段把传过来的数据处理为部门名称对应该部门所有员工工资的列表,最后在Reduce中按照部门归组,遍历部门所有员工,求出总数和员工数,输出部门名称和平均工资。

处理流程图

求各个部门的人数和平均工资处理流程图

代码

Q2DeptNumberAveSalary.java


例子3:求每个部门最早进入公司的员工姓名

问题分析

求每个部门最早进入公司员工姓名,需要得到各部门所有员工的进入公司日期,通过比较获取最早进入公司员工姓名。首先和问题1类似在Mapper的Setup阶段缓存部门数据,然后Mapper阶段抽取出key为部门名称(利用缓存部门数据把部门编号对应为部门名称),value为员工姓名和进入公司日期,接着在Shuffle阶段把传过来的数据处理为部门名称对应该部门所有员工+进入公司日期的列表,最后在Reduce中按照部门归组,遍历部门所有员工,找出最早进入公司的员工并输出。

处理流程图

求每个部门最早进入公司的员工姓名处理流程图

代码

Q3DeptEarliestEmp.java


例子4:求各个城市的员工的总工资

问题分析

求各个城市员工的总工资,需要得到各个城市所有员工的工资,通过对各个城市所有员工工资求和得到总工资。首先和测试例子1类似在Mapper的Setup阶段缓存部门对应所在城市数据,然后在Mapper阶段抽取出key为城市名称(利用缓存数据把部门编号对应为所在城市名称),value为员工工资,接着在Shuffle阶段把传过来的数据处理为城市名称对应该城市所有员工工资,最后在Reduce中按照城市归组,遍历城市所有员工,求出工资总数并输出。

处理流程图

求各个城市的员工的总工资处理流程图

代码

Q4SumCitySalary.java


例子5:列出工资比上司高的员工姓名及其工资

问题分析

求工资比上司高的员工姓名及工资,需要得到上司工资及上司所有下属员工,通过比较他们工资高低得到比上司工资高的员工。在Mapper阶段输出经理数据和员工对应经理表数据,其中经理数据key为员工编号、value为”M,该员工工资”,员工对应经理表数据key为经理编号、value为”E,该员工姓名,该员工工资”;然后在Shuffle阶段把传过来的经理数据和员工对应经理表数据进行归组,如编号为7698员工,value中标志M为自己工资,value中标志E为其下属姓名及工资;最后在Reduce中遍历比较员工与经理工资高低,输出工资高于经理的员工。

处理流程图

列出工资比上司高的员工姓名及其工资处理流程图

代码

Q5EarnMoreThanManager.java


例子6:列出工资比公司平均工资要高的员工姓名及其工资

问题分析

求工资比公司平均工资要高的员工姓名及工资,需要得到公司的平均工资和所有员工工资,通过比较得出工资比平均工资高的员工姓名及工资。这个问题可以分两个作业进行解决,先求出公司的平均工资,然后与所有员工进行比较得到结果;也可以在一个作业进行解决,这里就得使用作业setNumReduceTasks方法,设置Reduce任务数为1,保证每次运行一个reduce任务,在该例子中,只需要一个reduce任务就可以处理完数据,从而能先求出平均工资,然后进行比较得出结果。

在Mapper阶段输出两份所有员工数据,其中一份key为0、value为该员工工资,另外一份key为1、value为”该员工姓名 ,员工工资”;然后在Shuffle阶段把传过来数据按照key进行归组,在该任务中有key值为0和1两组数据;最后在Reduce中对key值0的所有员工求工资总数和员工数,获得平均工资;对key值1,比较员工与平均工资的大小,输出比平均工资高的员工和对应的工资。

处理流程图

列出工资比公司平均工资要高的员工姓名及其工资处理流程图

代码

Q6HigherThanAveSalary.java


例子7:列出名字以J开头的员工姓名及其所属部门名称

问题分析

求名字以J开头的员工姓名机器所属部门名称,只需判断员工姓名是否以J开头。首先和问题1类似在Mapper的Setup阶段缓存部门数据,然后在Mapper阶段判断员工姓名是否以J开头,如果是抽取出员工姓名和员工所在部门编号,利用缓存部门数据把部门编号对应为部门名称,转换后输出结果。

处理流程图

列出名字以J开头的员工姓名及其所属部门名称处理流程图

代码

Q7NameDeptOfStartJ.java


例子8:列出工资最高的头三名员工姓名及其工资

问题分析

求工资最高的头三名员工姓名及工资,可以通过冒泡法得到。在Mapper阶段输出经理数据和员工对应经理表数据,其中经理数据key为0值、value为”员工姓名,员工工资”;最后在Reduce中通过冒泡法遍历所有员工,比较员工工资多少,求出前三名。

处理流程图

列出工资最高的头三名员工姓名及其工资处理流程图

代码

Q8SalaryTop3Salary.java


例子9:将全体员工按照总收入(工资+提成)从高到低排列

问题分析

求全体员工总收入降序排列,获得所有员工总收入并降序排列即可。在Mapper阶段输出所有员工总工资数据,其中key为员工总工资、value为员工姓名,在Mapper阶段的最后会先调用job.setPartitionerClass对数据进行分区,每个分区映射到一个reducer,每个分区内又调用job.setSortComparatorClass设置的key比较函数类排序。由于在本作业中Map的key只有0值,故能实现对所有数据进行排序。

处理流程图

将全体员工按照总收入(工资+提成)从高到低排列处理流程图

代码

Q9EmpSalarySort.java


例子10:求任何两名员工信息传递所需要经过的中间节点数

问题分析

该公司所有员工可以形成入下图的树形结构,求两个员工的沟通的中间节点数,可转换在员工树中求两个节点连通所经过的节点数,即从其中一节点到汇合节点经过节点数加上另一节点到汇合节点经过节点数。例如求M到Q所需节点数,可以先找出M到A经过的节点数,然后找出Q到A经过的节点数,两者相加得到M到Q所需节点数。

求M到Q所需节点数

在作业中首先在Mapper阶段所有员工数据,其中经理数据key为0值、value为”员工编号,员工经理编号”,然后在Reduce阶段把所有员工放到员工列表和员工对应经理链表Map中,最后在Reduce的Cleanup中按照上面说所算法对任意两个员工计算出沟通的路径长度并输出。

处理流程图

求任何两名员工信息传递所需要经过的中间节点数处理流程图

代码

Q10MiddlePersonsCountForComm.java

走向云计算之MapReduce应用案例详解 一、概述前面关于MapReduce的wordcount程序已经做了比较详细的分析,这里再给出MapReduce应用的几个小案例,来更加深入的理解MapReduce的设计理念和应用方法。部分内容参考了书籍《hadoop实战》中的内容。二、MapReduce应用之数据去重在统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重这个操作。1、情境要求假设有如下两个数据样本 阅读详情

相关推荐

Hadoop-MapReduce应用案例

数单词数据源China officially the People's Republic of China (PRC) is a unitary sovereign state in East Asia With a population of over 1 381 billion it is the world's most populous state [16] The state is

不瘦十斤不换名字 1411

MapReduce之序列化对象作为key来进行排序

MapReduce之序列化对象作为key来进行排序一、需求说明二、测试数据三、编程思路四、实现步骤四、打包上传到集群中运行(参考如下步骤) 一、需求说明 要求:按照员工的部门号排序 select * from emp order by deptno; 按照员工的部门号、薪水排序 select * from emp order by deptno asc,sal desc; 二、测试数据 参考测试数据 三、编程思路 思路: 1、定义一个java类,实现WritableComparable接口

聚焦大数据、AI、数据库三大核心领域,分享 Flink/Spark 实时计算、数仓架构设计、AI 模型落地、数据库性能调优的实战干货,附可直接运行的源码与方案。提供企业技术内训、项目咨询与定制化服务,助力开发者与企业高效搞定数智技术难题。 798

python的MapReduce的应用案例

在学习这个项目中用到许多数学公式,有的自己不太懂,所以上传上来进行实地应用。 参考资料: generate_train_feature_map.py #!/usr/bin/env python # encoding=UTF-8 """ 生成训练数据 支持CTR/CVR 支持特征选择 支持紧密和稀疏2种特征格式 输入数据格式(24)...

Lsx2018223的博客 535

MapReduce的高级特性 3、分区: Partition

MapReduce的高级特性 3、分区: Partition (*)MR默认只有一个分区(一个输出的文件);如果有多个分区,就有多个输出文件       /output/0918/s8/part-r-00000   /output/0918/s8/part-r-00001   /output/0918/s8/part-r-00002    (*)什么是分区?结合一下Oracle的表

lkq0112的博客 1484

Hadoop之MapReduce的应用案例

如题: 学生id,课程id,分数 1,12,80 2,30,91 2,21,98 3,2,100 4,1,50 4,2,58 4,3,65 1,11,75 请实现: (1)找出每门课不及格学生信息按照格式 “课程id:学生id1,学生id2”格式输出。 (2)找到所有科目都及格的学生id,按照id的升序排序。 (3)统计每门课的学生分数段按照 如下格式输出:课程id:[100,90]分数段学生人数,(90,80]分数段学生人数,(80,70]分数段学生人数,(70,60]分数段学生人数,不及格学生人数。 (

在有我的世界 2570

mapreduce综合应用案例 — 气象数据清洗

目的本项目旨在运用MapReduce技术对气象数据进行清洗,以提高数据质量,使其更适用于后续的气象分析和研究工作。气象数据来源广泛且格式复杂,通过清洗可以去除错误、缺失和冗余的数据,提取有价值的信息,为气象领域的决策提供可靠依据。数据来源数据来源于气象观测站的原始观测记录,以文本文件形式存储,每行记录包含多个字段,如观测时间、观测地点、温度、湿度、气压等信息。数据可能存在一些问题,例如部分观测值超出合理范围(如温度低于绝对零度)、某些字段缺失或格式不统一等。创建一个类来表示气象数据记录,例如。

huanghm88的专栏 2968

MapReduce统计部门员工组别,并排序

学习目标:MapReduce统计部门员工 员工数据 孙悟空 23 西游部 筋斗云 武松 33 水浒部 醉拳 关胜 32 水浒部 大刀 猪八戒 21 西游部 吃吃吃 贾宝玉 21 红楼部 呵呵 林黛玉 16 红楼部 嘻嘻 沙僧 25 西游部 潜水 王熙凤 46 红楼部 提示:有一个员工缺少一个技能属性字段 学习内容:现根据员工的组别进行自然排序,之后按照年龄排序 实体类 import org.apache.hadoop.io.WritableComparable; import java.io.Data

qq_53561431的博客 494

MapReduce综合应用案例 — 气象数据清洗

2005,01,01,16,-6,-28,10157,260,31,卷云,0,-9999。根据提示,在右侧编辑器补充代码,对数据按照一定规则进行清洗。本关任务:对数据按照一定规则进行清洗。运行比较耗时,所以评测时间较长,大概在。命令行输入:start-all.sh。具体本关的预期输出请查看右侧测试集。因为大数据实训消耗资源较大,且。评测之前先在命令行启动。秒左右,请耐心等待。

m0_70030344的博客 4862

【MapReduce】分区(分区实战案例)、Combiner、Shuffer

分区(分区实战案例)、Combiner、Shuffer1 分区2 根据部门号建立分区3 Combiner4 Shuffer 手动反爬虫,禁止转载:原博地址 https://blog.youkuaiyun.com/lys_828/article/details/118990176(优快云博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在优快云网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 分区 在MapReduce中,通过我们指定分区,会将同一个分区的数据发送到同一个Red

lys_828的博客 3514

mapreduce综合应用案例 — 招聘数据清洗

假设我们有一个大规模的招聘数据集,其中包含了职位描述、公司信息、薪资范围、工作地点等信息。我们的目标是清洗这些数据,以确保数据的一致性、准确性和可用性。

youyouxiong的博客 2583

MapReduce的编程开发-格式整理

采用 name-m-nnnnn 形式的文件用于 map 输出,采用 name-r-nnnnn 形式的文件名用于 reduce 输出。我们考虑这样一个需求:按学生的年龄段,将数据输出到不同的文件路径下。有时可能需要对输出的文件名进行控制或让每个 reducer 输出多个文件。要求根据部门编号对员工进行分区,如果编号为 10,则放置在 1 分区,编号为 20 放置在 2 分区,其余全部放在 3 分区;本类主要用于描述输出数据的格式,它能够将用户提供的 key/value 对写入特定格式的文件中。

Junds0的博客 1337

头歌 MapReduce综合应用案例 — 电信数据清洗

头歌 MapReduce综合应用案例 — 电信数据清洗 摘要:本案例展示了一个基于Hadoop MapReduce的电信数据清洗系统。系统通过LogMR类实现数据清洗功能,包含MyMapper类处理原始通话记录数据,结合MySQL数据库中的用户和地区信息进行数据关联。DBHelper类提供MySQL数据库连接功能,PhoneLog类封装通话记录对象。测试时需先启动Hadoop集群,系统会自动创建所需MySQL表结构。

一名敲代码的苦13程序员 1701

MapReduce在招聘数据清洗的应用案例

数据清洗是一个数据预处理的过程,旨在提高数据质量。其核心目的是识别并修正或移除数据中的不一致、不完整、错误和无关数据。在数据挖掘、数据分析、机器学习等数据密集型任务中,高质数据是成功的关键因素之一。数据清洗的目的是为了构建更准确的模型和更有效的决策支持系统。在当今信息化迅速发展的时代,大规模数据处理已经成为IT行业和相关领域必不可少的一部分。大规模数据处理指的是利用特定的数据处理技术和方法,对海量的数据进行收集、存储、管理、分析和挖掘的过程。

weixin_30218749的博客 1113

05 MapReduce应用案例01

单词计数 在一定程度上反映了MapReduce设计的初衷--对日志文件进行分析。 public class WordCountMapper extends Mapper{ //该方法循环调用,从文件的split中读取每行调用一次,把该行所在的下标为key,该行的内容为value protected void map(LongWritable key, Text value,C

weixin_37289816的博客 506

深入实践:HBase与MapReduce的综合应用案例分析

HBase是Apache软件基金会的一个开源非关系型分布式数据库(NoSQL),建立在Hadoop文件系统之上,主要用于存储半结构化或非结构化的大数据集合。HBase借鉴了Google Bigtable的数据模型,并且拥有高性能、可伸缩、以及灵活的特性,特别适合大规模数据的实时读写访问。MapReduce是一种编程模型,最初由Google开发用于处理和生成大数据集。它的核心思想在于将数据处理任务拆分为两个阶段:Map(映射)阶段和Reduce(归约)阶段,使得并行处理数据变得简单高效。

weixin_42561464的博客 492

AD2S1210与DSP28335 SPI通信中的GPIO配置陷阱与解决

本文深入剖析了AD2S1210与DSP28335进行SPI通信时,因GPIO输入限定配置不当导致数据整体右移的典型问题。文章指出,错误地将MISO引脚配置为带采样周期的同步模式是根本原因,并提供了将输入选择限制正确设置为异步模式的解决方案。同时,总结了不同应用场景下GPIO输入限定的配置原则,为高速同步通信的稳定实现提供了关键指导。

weixin_29163857的博客 146

头歌 | MapReduce综合应用案例 — 招聘数据清洗

若未出现预期结果可私信我答疑。

m0_61546943的博客 7087

别再死记硬背窗函数公式了!用MATLAB实战汉宁窗FIR滤波器,从频谱图看懂‘主瓣’和‘旁瓣’

本文通过MATLAB实战演示汉宁窗FIR滤波器的设计过程,帮助读者从频谱图直观理解主瓣与旁瓣的特性。文章详细对比了矩形窗与汉宁窗的频谱差异,并提供了高通滤波器设计的完整代码示例,适用于数字信号处理学习和工程应用。

weixin_30555125的博客 490

MapReduce综合应用案例 — 电信数据清洗

因为大数据实训消耗资源较大,且map/reduce运行比较耗时,所以评测时间较长,大概在60秒左右,请耐心等待。评测之前先在命令行启动hadoop:start-all.sh;点击测评后MySQL所需的数据库和表会自动创建好。在该箭头所指的位置进行代码文件的切换。具体本关的预期输出请查看右侧测试集。LogMR:MapReduce操作。DBHelper:MySQL工具类。之后在命令行启动hadoop。PhoneLog:封装对象。

2301_77225918的博客 6529

万象RK3506-EG1800网关使用说明

摘要:HD-RK3506-EG1800是一款高性能工业物联网边缘计算网关,支持Buildroot和Ubuntu双系统。文档详细介绍了网关的网络配置(包括ETH0/ETH1的静态IP设置、WiFi连接)、时钟同步、HSL软件安装配置(含开机自启动服务)、系统日志优化以及刷机操作指南(Loader/Maskrom模式)。特别提供了基于lighttpd的网页管理方案,通过HTML界面实现网络参数可视化配置,包含身份验证、实时状态显示和表单提交功能。网关默认ETH0固定IP为192.168.1.10,提供完整的CL

tian_jiangnan的博客 177

【Xilinx】如何在petalinux下编译vcu-gst-app以及独立编译vcu-gst-app

Xilinx从2018.1开始,提供了一套基于zcu106的vcu参考设计。里面提供了一套基于GStreamer的程序,即vcu-gst-app。如何脱离petalinux直接编译呢,这里以为例,其他版本也是类似的操作。

王师傅 3041

Hadoop中的MapReduce框架原理、Join应用、Reduce Join、案例实操、Map Join、采用DistributedCache、案例实操

Map端的主要工作:为来自不同表或文件的key、value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出、Reduce端的主要工作:在Reduce端以连接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在Map阶段已经打标志)分开,最后进行合并就ok了、Map Join适用于一张表十分小、一张表很大的场景、在Map端缓存多张表,提前处理业务逻辑,这样增加Map端业务,减少Reduce端数据的压力,尽可能的减少数据

Redamancy06的博客 859

Cadence PCB仿真 使用Allegro PCB SI为BRD文件创建通用型IBIS模型的方法图文教程

本文简单介绍使用Allegro PCB SI软件为BRD PCB设计文件中的元器件创建IBIS模型的方法。

fydar的博客 2170
上一篇: 十二月新阶段的备战春招安排计划
下一篇: 基于Hadoop的分布式云存储系统
gamedev˚
博客等级 码龄12年 280粉丝 293原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值