Hadoop入门(二十四)Mapreduce的求TopK程序

一、简介

求TopK是算法中最常使用到的,现在使用Mapreduce在海量数据中统计数据的求TopK。

 

二、例子

(1)实例描述
给出三个文件,每个文件中都存储了若干个数值,求所有数值中的求Top 5。

样例输入:                                            
1)file1:  

1
2
3
7
9
-99
2


2)file2:  

11
2
23
17
9
199
22


3)file3:  

21
12
3
17
2
39
12


 期望输出:

199
39
23
22
21

 

(2)问题分析
实现统计海量数据的求TopK,不能将所有的数据加载到内存,计算只能使用类似外部排序的方式,加载一部分数据统计求TopK,接着加载另一部分进行统计TopK。

(3)实现步骤

1)Map过程 
    首先使用默认的TextInputFormat类对输入文件进行处理,得到文本中每行的偏移量及其内容。显然,Map过程首先必须分析输入的<key,value>对,得到数值,然后在mapper中统计单个分块的求TopK。

2)Reduce过程 
    经过map方法处理后,Reduce过程将获取每个mapper的求TopK进行统计,分行统计出总的TopK。

 

(3)关键代码

package com.mk.mapreduce;import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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 java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class TopK {public static class TopKMapper extends Mapper<LongWritable, Text, IntWritable, NullWritable> {private List<Integer> top5 = new ArrayList<>(5);@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {if (StringUtils.isBlank(value.toString())) {System.out.println("空白行");return;}Integer v = Integer.valueOf(value.toString().trim());if(top5.size()<5){top5.add(v);}else{Integer min = Collections.min(top5);if (min < v) {top5.remove(min);top5.add(v);}}}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {for (Integer v : top5)context.write(new IntWritable(v), NullWritable.get());}}public static class TopKReducer extends Reducer< IntWritable, NullWritable,IntWritable, NullWritable> {private List<Integer> top5 = new ArrayList<>(5);@Overrideprotected void reduce(IntWritable key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {Integer v = key.get();if(top5.size()<5){top5.add(v);}else{Integer min = Collections.min(top5);if (min < v) {top5.remove(min);top5.add(v);}}}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {top5.sort((a,b)->b-a);for (Integer v : top5)context.write(new IntWritable(v), NullWritable.get());}}public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {String uri = "hdfs://192.168.150.128:9000";String input = "/topk/input";String output = "/topk/output";Configuration conf = new Configuration();if (System.getProperty("os.name").toLowerCase().contains("win"))conf.set("mapreduce.app-submission.cross-platform", "true");FileSystem fileSystem = FileSystem.get(URI.create(uri), conf);Path path = new Path(output);fileSystem.delete(path, true);Job job = new Job(conf, "TopK");job.setJar("./out/artifacts/hadoop_test_jar/hadoop-test.jar");job.setJarByClass(TopK.class);job.setMapperClass(TopKMapper.class);job.setReducerClass(TopKReducer.class);job.setMapOutputKeyClass(IntWritable.class);job.setMapOutputValueClass(NullWritable.class);job.setOutputKeyClass(IntWritable.class);job.setOutputValueClass(NullWritable.class);FileInputFormat.addInputPaths(job, uri + input);FileOutputFormat.setOutputPath(job, new Path(uri + output));boolean ret = job.waitForCompletion(true);System.out.println(job.getJobName() + "-----" + ret);}
}

 

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

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

相关文章

DML、DDl、DQL实战

表的创建与删除 create table 学生成绩( id int primary key, name char(10) not null, sex char(10) not null, 物理 int not null, 语文 int not null, 英语 int not null, 数学 int )DEFAULT CHARSETutf8mb4; drop table 学生成绩; DML 数据操纵语言DML主要有三种形式&a…

Scaffolding Template on Asp.Net Core Razor Page

Scaffolding Template Intro 我们知道在Asp.Net MVC中&#xff0c;如果你使用的EF的DBContext的话&#xff0c;你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器&#xff0c;然后vs会根据你选择的Model自动生成相应的CURD的控制器和View&#xff0c;非常便利&…

jzoj3895-数字对【RMQ,GCD,二分答案,单调队列】

正题 题目大意 一个序列aaa 对于[L..R][L..R][L..R]若ak∈[L..R]∣ai∈[L..R]a_k \in [L..R]|a_i\in[L..R]ak​∈[L..R]∣ai​∈[L..R]则这个一个特殊区间。 求最长特殊区间。 解题思路 先RMQRMQRMQ求区间GCDGCDGCD&#xff0c;然后二分答案。 之后aka_kak​肯定是这个区间最…

Hadoop生态hive(一)介绍

一、Hive是什么 起源自facebook由Jeff Hammerbacher领导的团队&#xff0c;构建在Hadoop上的数据仓库框架。设计目的是让SQL技能良好&#xff0c;但Java技能较弱的分析师可以查询海量数据。2008年facebook把hive项目贡献给Apache。 由facebook开源&#xff0c;最初用于解决海量…

jzoj3896-战争游戏【tarjan,割点,点双联通分量】

正题 题目大意 求每个点是多少个点对之间路径的必经点。 解题思路 首先若一个点是在点不是割点&#xff0c;那么答案就是n−1n-1n−1&#xff0c;因为这个点不是除了它自己以为任何点对的必经点。 之后我们记录每个可以割掉的联通分量的大小。对于一个割点&#xff0c;是两种…

使用混合云的SQL Server

近期发布的Microsoft SQL Server 2017&#xff0c;表明Microsoft公司正寻求不断降低其所交付的工具对平台的绑定。在SQL Server 2017中&#xff0c;这一趋势可以从“混合云”&#xff08;Hybrid Cloud&#xff09;术语和多平台本质这两个方面得以证实。下面让我们分别一窥这两个…

Hadoop生态hive(二)安装

一、安装模式 内嵌模式&#xff1a;元数据保持在内嵌的Derby模式&#xff0c;只允许一个会话连接 本地独立模式&#xff1a;在本地安装Mysql&#xff0c;把元数据放到Mysql内 远程模式&#xff1a;元数据放置在远程的Mysql数据库 官方文档&#xff1a; https://cwiki.apac…

.NET Core多平台项目模板eShopOnContainers编译手记

之前写了一个功能性的文件上传asp.net core的小程序&#xff0c;加上点七七八八的东西&#xff0c;勉强能够应付了&#xff0c;打算学习一下微软的官方.NET CORE微服务示例https://github.com/dotnet-architecture/eShopOnContainers。这个例子很全面地展现了微服务、docker以及…

欢乐纪中某B组赛【2019.1.25】

前言 还算OKOKOK 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC4442017myself2017myself2017myself1801801801001001008080800005552017zyc2017zyc2017zyc1601601606060601001001000001111112017hzb2017hzb2017hzb14014014060606080…

如何改变Idea的背景

进入Idea 按下ctrlshifta 点击set background 选择自己准备好的图片地址&#xff0c;就可以更改背景了 更改后效果 关于接口的插件 GsonFormat插件 安装还是和别的插件一样&#xff0c;在plugin里搜索GsonFormat&#xff0c;下载并重启 然后在model里的类 按下alts 出现 将…

jzoj1252,P5194-天平【dfs,set】

正题 题目大意 nnn个砝码&#xff0c;选择若干个要求重量不超过ccc的情况下最重。 解题思路 拆成两部分来dfsdfsdfs&#xff0c;第一部分将答案加入setsetset。 第二部分对于每个答案在setsetset中查询。 时间复杂度O(2n2logn)O(2^{\frac{n}{2}}\ log\ n)O(22n​ log n) cod…

包依赖

thymeleaf <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

TFS在项目中Devops落地进程(上)

作为一名开发,经过近2年折腾,基于TFS的Devops主线工程大体落地完毕。 在此大体回忆下中间的各种历程。 开始之前简单说下什么是TFS(Team Foundation Server)。 TFS是微软推出的一款ALM&#xff08;Application Lifecycle Management)管理工具。 透过TFS你将能获取到从代码版本管…

Hadoop生态hive(三)Hive QL介绍

一、表 创建表 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name CREATE TABLE 创建一个指定名字的表。Hive 创建内部表时&#xff0c;会将数据移动到数据仓库指向的路径&#xff1b; EXTERNAL 关键字可以让用户创建一个外部表&#xff0c;在建表的同时指定一个指向实…

抖音上非常火的旋转图快速部署

本教程不需要你有服务器&#xff01; 本教程不需要你有服务器&#xff01; 本教程不需要你有服务器&#xff01; 点击我看旋转图 总共两步 1、注册一个码云账号 2、新建一个仓库&#xff0c;上传文件即可 1、注册账号的话&#xff0c;直接浏览器搜索码云&#xff0c;手机号…

hive命令出现问题Failed with exception Java.io.IOException:java.lang.IllegalArgumentException: java.NET.URI

转载自 hive命令出现问题Failed with exception Java.io.IOException:java.lang.IllegalArgumentException: java.NET.URI 一&#xff0c;问题描述&#xff1a;    登录到hive数据仓库后&#xff0c;输入一些命令&#xff0c;例如&#xff08;show databases &#xff0c…

Microsoft的现代数据管理

PASS 2017峰会是面向SQL Server及Microsoft相关数据技术用户的大会。在大会的第一天&#xff0c;Microsoft的Rohan Kumar先生到场做了开幕式的主题演讲&#xff0c;并借此机会展示了Microsoft在SQL Server和Azure数据库方面的最新进展。 Kumar的演讲涉及数据、人工智能和云这三…

jzoj1274-游历的路线【分层图,SPFA】

正题 题目大意 nnn个点每个点之间的边权是一个周期。 求从111出发经过mmm条边到nnn的最小权值 解题思路 分成mmm层表示天数&#xff0c;然后连边跑SPFASPFASPFA codecodecode #include<cstdio> #include<queue> #include<cstring> #define N 40100 using …

vue 3.4x以上如何改变项目运行端口号

我用3.4版本的vue-cli构建了一个vue项目&#xff0c;然后我想修改项目运行之后的访问端口 在网上查了一下&#xff0c;很多都是2.0的版本&#xff0c;查来查去都说是什么在 config目录下index.js文件中修改端口号。。。。。。。 都抄来抄去的 新的vue项目目录结构下并没有con…

Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

转载自 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient hive初始化&#xff08;mysql为元数据库&#xff09;完成后&#xff0c;执行SQL语句报错 经过各种查询资料&#xff0c;找到了一种解决办法&#xff0c;大家可以参考。 首先进…