MapReduce编程模型——自定义序列化类实现多指标统计

news2024/10/2 8:23:54

🏠Hadoop序列化

👉序列化

序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。

👉为什么要序列化

一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。

👉为什么不用Java的序列化

Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以,Hadoop自己开发了一套序列化机制(Writable)。
Hadoop序列化特点:

(1) 紧凑:高效使用存储空间
(2) 快速:读写数据的额外开销小
(3) 可扩展:随着通信协议的升级而可升级
(4) 互操作:支持多语言的交互

👉常用序列化类型

常用数据类型对应的Hadoop数据序列化类型如下:

Java 类型Hadoop Writable 类型
booleanBooleanWritable
byteByteWritable
intIntWritable
floatFloatWritable
longLongWritable
doubleDoubleWritable
StringText
mapMapWritable
arrayArrayWritable

👉自定义 bean 对象实现序列化

自定义 bean 要想实现序列化传输,必须实现 org.apache.hadoop.io.Writable 接口并且覆写 toString 方法以便将结果显示在文件中。

本文通过一个案例来演示自定义序列化类实现多指标统计。

🏠案例

本文任务的输入文件如下:

1,13736230513,10,30
2,13736230513,11,55
3,13956435636,22,66
4,13956435636,44,49
5,13966251146,15,50
6,13788413164,1432,101
8,13788413164,56,200
9,13788413164,400,210
10,13788413164,60,200
11,13966251146,69,35
12,13966251146,19,500

输入文件利用逗号分割字段内容,从左到右的字段依次代表序号、手机号码、上行流量和下行流量。
任务的目标是统计各个手机号码的总上行流量、总下行流量、最大上行流量以及最大下行流量。

本文主要用于演示,故采用本地文件系统。

👉代码

pom文件和日志输出配置以及环境相关问题可参考作者的另一篇博文《MapReduce编程模型——在idea里面邂逅CDH MapReduce》,其他代码如下
自定义序列化类:

import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class DataBean implements Writable {
    // 上行流量
    private long up;

    // 下行流量
    private long down;

    // 最大上行流量
    long maxUp;

    // 最大下行流量
    long maxDown;

    @Override
    public void write(DataOutput out) throws IOException {
        out.writeLong(up);
        out.writeLong(down);
        out.writeLong(maxUp);
        out.writeLong(maxDown);
    }

    @Override
    public void readFields(DataInput in) throws IOException {
        up = in.readLong();
        down = in.readLong();
    }

    @Override
    public String toString() {
        return this.up + "\t" + this.down + "\t" + this.maxUp + "\t" + this.maxDown;
    }

    public long getUp() {
        return up;
    }

    public void setUp(long up) {
        this.up = up;
    }

    public long getDown() {
        return down;
    }

    public void setDown(long down) {
        this.down = down;
    }

    public long getMaxUp() {
        return maxUp;
    }

    public void setMaxUp(long maxUp) {
        this.maxUp = maxUp;
    }

    public long getMaxDown() {
        return maxDown;
    }

    public void setMaxDown(long maxDown) {
        this.maxDown = maxDown;
    }
}

Mapper类:

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;

public class MyMapper extends Mapper<LongWritable, Text, Text, DataBean> {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // 分词
        String[] report = value.toString().split(",");
        DataBean flow = new DataBean();
        flow.setUp(Long.parseLong(report[2]));
        flow.setDown(Long.parseLong(report[3]));
        // 电话号码
        Text phone = new Text();
        phone.set(report[1]);
        context.write(phone, flow);
    }
}

Reducer类如下

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;

public class MyReducer extends Reducer<Text, DataBean, Text, DataBean> {

    @Override
    protected void reduce(Text key, Iterable<DataBean> values, Context context) throws IOException, InterruptedException {
        // 总上行流量
        long totalUp = 0;
        // 总下行流量
        long totalDown = 0;
        // 最大上行流量
        long maxUp = 0;
        // 最大下行流量
        long maxDown = 0;
        // 统计
        for (DataBean flow : values) {
            totalUp += flow.getUp();
            totalDown += flow.getDown();
            if (flow.getUp() > maxUp){
                maxUp = flow.getUp();
            }
            if (flow.getDown() > maxDown){
                maxDown = flow.getDown();
            }
        }
        // 最终结果
        DataBean result = new DataBean();
        result.setUp(totalUp);
        result.setDown(totalDown);
        result.setMaxUp(maxUp);
        result.setMaxDown(maxDown);
        context.write(key, result);
    }
}

主程序如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;

public class App {

    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        // 任务配置
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "flow");
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(MyReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(DataBean.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(DataBean.class);
        job.setJarByClass(App.class);
        // 输入输出路径
        Path inputPath = new Path("D:\\mrdemo\\input");
        Path outputPath = new Path("D:\\mrdemo\\output");
        // 输出目录若存在,则进行删除
        FileSystem fileSystem = FileSystem.get(conf);
        if(fileSystem.exists(outputPath)){
            fileSystem.delete(outputPath, true);
        }
        // 给任务设置输入输出路径
        FileInputFormat.addInputPath(job, inputPath);
        FileOutputFormat.setOutputPath(job, outputPath);
        // 提交任务
        boolean flag = job.waitForCompletion(true);
        if (flag){
            System.out.println("程序运行结束!!");
        }
    }
}

程序运行后,产生的结果文件内容如下:
在这里插入图片描述
作者这水平有限,有不足之处欢迎留言指正!!

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

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

相关文章

7天酒店亮相中国国际饭店业大会元宇宙线上展 创见酒店投资新未来

11月12日&#xff0c;由中国饭店协会主办的第一届酒旅菁英品牌嘉年华“元宇宙”线上展成功举行。7天酒店“元宇宙”展馆首度亮相&#xff0c;通过数字化交互、虚拟展厅、线上路演等&#xff0c;为行业和市场带来耳目一新的创新营销形式。 作为第七届中国国际饭店业大会的线上分…

基于微信小程序的药店管理系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mav…

蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)

前言 本篇为蓝牙HID系列篇章之一&#xff0c;本篇以红米K30&#xff08;MIUI13即Android 12&#xff09;手机作为蓝牙HID设备&#xff0c;可以与电脑、手机、平板等其他蓝牙主机进行配对从而实现鼠标触控板的功能。 蓝牙HID系列篇章&#xff1a; 蓝牙HID——将android设备变成…

babel-plugin-import 实现按需引入

官方文档&#xff1a;https://github.com/umijs/babel-plugin-import#usage 为什么需要这个插件&#xff1f; 在 antd 和 element 两个组件库中&#xff0c;index.js 分别是这样的&#xff1a; // antd export { default as Button } from ./button; export { default as Tab…

智能云门禁解决方案来了

传统门禁存在的问题 01、安全性差&#xff1a;传统门禁卡易被复制和盗用无法精准识别进出人员身份造成较大安全隐患。 02、通行不便&#xff1a;要求人员近距离操作&#xff0c;当使 用者双手被占用时通行不便 门禁卡丢失或密码遗忘造成 无法开门。 03、管理困难&#xff1a…

Multilevel Cooperative Coevolution for Large Scale Optimization

0、论文背景 本文在CCEA_G的基础上&#xff0c;提出了MLCC框架。在MLCC中&#xff0c;基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环&#xff0c;在每个周期开始时&#xff0c;MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获…

数据结构-图的存储结构

目录 图的存储结构邻接矩阵邻接表图的邻接矩阵和邻接表两种存储结构各有什么优缺点?图的存储结构 邻接矩阵 邻接矩阵的主要特点:

spring7:总结56

1.handler的形参解析&#xff08;即如何把请求参数转化为形参&#xff09; 注解参数解析原理 model and map解析原理 自定义对象处理原理 2.数据响应原理&#xff08;即如何把返回值传给前端&#xff09; 整体返回原理 详解其中的内容协商流程&#xff08;基于请求头&#x…

数据库分区的通俗解释

关于数据库分区&#xff0c;分表&#xff0c;分库&#xff0c;我通俗易懂的来举几个栗子&#xff0c;看过还不懂&#xff0c;你打我。。。 村里一家四口人(老爹叫A)有两儿子(分别是A1&#xff0c;A2)&#xff0c;长大了要自己种地了&#xff0c;就嚷嚷着要分家&#xff0c;把村…

虚拟机(Vmware)磁盘扩容(xfs格式)

先将虚拟机关机&#xff0c;按上图调整虚拟磁盘大小。 1.开启并进入虚拟机&#xff0c;打开终端&#xff0c;输入命令 df -Th 查看格式&#xff0c;图示中 /dev/mapper/centos-root 类型为xfs。 [mangolocalhost ~]$ df -Th Filesystem Type Size Used Ava…

luffy-(9)

内容概览 redis图形化客户端redis字符串操作redis hash操作redis列表操作redis管道redis其他操作django中集成rediscelery介绍 redis图形化客户端 安装图形化客户端redis-desktop-manager 新版本收费&#xff0c;可以使用老版本 QT平台&#xff1a;可以写图形化界面 python&…

腾讯云~Kafka 监控 Kafka Eagle 图形化版本

文章目录1. 安装包下载2. 开启kafka JMX3. 安装JDK&#xff0c;配置JAVA_HOME4. 上传安装包、解压5. 配置Kafka-eagle环境变量6. 配置Kafka_eagle7. 配置ke.sh8. 启动Kafka_eagle9. 防火墙10. 访问Kafka eagle1. 安装包下载 官网地址&#xff1a;EFAK 本文使用3.0.1版本 2. …

【保姆级·创建对象】如何利用resolveBeforeInstantiation()在预处理阶段返回一个Bean的实例对象

前情回顾 之前有篇文章我们有详细介绍了prepareMethodOverrides()方法并详细例举了一个lookup-method标签的例子 【保姆级】lookup-method标签实践与分析_AQin1012的博客-CSDN博客 本文我们来盘盘prepareMethodOverrides()方法后面的resolveBeaforeInstantiation()的函数&…

Android中SQLite数据库增删改查/使用ListView显示数据库内容(有完整源码)

android作业笔记 文章目录效果展示一、前言源码获取实验功能描述注意事项实现步骤二、代码展示activity_main.xml布局文件MyOpenHelper.javaMainActivity.javaList_item.xml三、&#xff08;补充&#xff09;ListView实现数据列表显示效果展示 编写SQLite数据库相关操作的代码…

【附源码】Python计算机毕业设计数据时代下的疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

达梦数据库,数据库重置主键id从1开始

一、前言 今天中国国寿XX项目XC环境达梦遇到id主键自增顺序不对的问题&#xff0c;那么如何修改一个表的自增主键顺序呢&#xff1f;下边通过具体测试案例进行深入分析&#xff0c;通过delete/update/truncate/alter观察数据的变换总结出结论&#xff0c;欢迎各位喜欢达梦数据…

值得推荐的小型 C 语言开源项目:Triggerhappy

这几天在知乎上看到了一个好问题&#xff1a; 有哪些值得推荐的小型 C 语言开源项目&#xff1f; 题主很可能是想要一个这样的开源项目&#xff1a;功能小巧、代码质量高&#xff0c;可读性好&#xff0c;以便自己循序渐进地学习 C 语言。 作为一个嵌入式开发人员&#xff0…

趁年轻,大胆闯

趁年轻&#xff0c;大胆闯如果我是20岁&#xff0c;我会拿出未来的十年&#xff0c;全力已赴的赚钱&#xff0c;折腾&#xff0c;不要任何安全感。 出来创业&#xff0c;就是为100倍以上的赔率来的。

HTTPS

一、HTTPS是什么 HTTPS也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层。 由于HTTP协议内容一般都是本文方式明文传输的&#xff0c;这就导致它在传输过程中会出现被篡改的情况。 经典案例就是万恶的“运营商劫持”&#xff01; 除了运营商可以劫持&a…

如何快速从零开始搭建一个前端项目

2022 年了&#xff0c;如何快速从零开始搭建一个合适的前端项目&#xff1f; 准备工作 首先本地需要安装好 node 环境以及包管理工具&#xff0c;推荐直接使用 pnpm&#xff0c;也可以通过 pnpm 来直接管理 nodejs 版本。 pnpm 安装&#xff1a; # Mac or Linux curl -fsSL…