4.MapReduce 序列化

目录

  • 概述
  • 序列化
    • 序列化
    • 反序例化
    • java自带的两种
      • Serializable
      • 非Serializable
    • hadoop序例化
      • 实践
    • 分片/InputFormat & InputSplit
      • 日志
  • 结束

概述

序列化是分布式计算中很重要的一环境,好的序列化方式,可以大大减少分布式计算中,网络传输的数据量。

序列化

序列化

对象 --> 字节序例 :存储到磁盘或者网络传输
MR 、Spark、Flink :分布式的执行框架 必然会涉及到网络传输

java 中的序列化:Serializable
Hadoop 中序列化特点: 紧凑、速度、扩展性、互操作
Spark 中使用了其它的序例化框架 Kyro

反序例化

字节序例 —> 对象

java自带的两种

Serializable

此处是 java 自带的 序例化 方式,这种方式简单方便,但体积大,不利于大数据量网络传输。

public class JavaSerDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {Person person = new Person(1, "张三", 33);ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("download/person.obj"));out.writeObject(person);ObjectInputStream in = new ObjectInputStream(new FileInputStream("download/person.obj"));Object o = in.readObject();System.out.println(o);}static class Person implements Serializable {private int id;private String name;private int age;public Person(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
}

非Serializable

public class DataSerDemo {public static void main(String[] args) throws IOException {Person person = new Person(1, "张三", 33);DataOutputStream out = new DataOutputStream(new FileOutputStream("download/person2.obj"));out.writeInt(person.getId());out.writeUTF(person.getName());out.close();DataInputStream in = new DataInputStream(new FileInputStream("download/person2.obj"));// 这里要注意,上面以什么顺序写出去,这里就要以什么顺序读取int id = in.readInt();String name = in.readUTF();in.close();System.out.println("id:" + id + " name:" + name);}/***  注意: 不需要继承 Serializable*/static class Person {private int id;private String name;private int age;public Person(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
}

hadoop序例化

官方地址速递

The key and value classes have to be serializable by the framework and hence need to implement the Writable interface. Additionally, the key classes have to implement the WritableComparable interface to facilitate sorting by the framework.
在这里插入图片描述
注意:Writable 两个方法,一个 write ,readFields

@InterfaceAudience.Public
@InterfaceStability.Stable
public interface Writable {void write(DataOutput out) throws IOException;void readFields(DataInput in) throws IOException;
}

实践

public class PersonWritable implements Writable {private int id;private String name;private int age;// 消费金额private int consumption;// 消费总金额private long consumptions;public PersonWritable() {}public PersonWritable(int id, String name, int age, int consumption) {this.id = id;this.name = name;this.age = age;this.consumption = consumption;}public PersonWritable(int id, String name, int age, int consumption, long consumptions) {this.id = id;this.name = name;this.age = age;this.consumption = consumption;this.consumptions = consumptions;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getConsumption() {return consumption;}public void setConsumption(int consumption) {this.consumption = consumption;}public long getConsumptions() {return consumptions;}public void setConsumptions(long consumptions) {this.consumptions = consumptions;}@Overridepublic String toString() {return"id=" + id +", name='" + name + '\'' +", age='" + age + '\'' +", consumption=" + consumption + '\'' +", consumptions=" + consumptions;}@Overridepublic void write(DataOutput out) throws IOException {out.writeInt(id);out.writeUTF(name);out.writeInt(age);out.writeInt(consumption);out.writeLong(consumptions);}@Overridepublic void readFields(DataInput in) throws IOException {id = in.readInt();name = in.readUTF();age = in.readInt();consumption = in.readInt();consumptions = in.readLong();}
}
/*** 统计 个人 消费*/
public class PersonStatistics {static class PersonStatisticsMapper extends Mapper<LongWritable, Text, IntWritable, PersonWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String[] split = value.toString().split(",");int id = Integer.parseInt(split[0]);String name = split[1];int age = Integer.parseInt(split[2]);int consumption = Integer.parseInt(split[3]);PersonWritable writable = new PersonWritable(id, name, age, consumption, 0);context.write(new IntWritable(id), writable);}}static class PersonStatisticsReducer extends Reducer<IntWritable, PersonWritable, NullWritable, PersonWritable> {@Overrideprotected void reduce(IntWritable key, Iterable<PersonWritable> values, Context context) throws IOException, InterruptedException {long count = 0L;PersonWritable person = null;for (PersonWritable data : values) {if (Objects.isNull(person)) {person = data;}count = count + data.getConsumption();}person.setConsumptions(count);PersonWritable personWritable = new PersonWritable(person.getId(), person.getName(), person.getAge(), person.getConsumption(), count);context.write(NullWritable.get(), personWritable);}}public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {Configuration configuration = new Configuration();String sourcePath = "data/person.data";String distPath = "downloadOut/person-out.data";FileUtil.deleteIfExist(configuration, distPath);Job job = Job.getInstance(configuration, "person statistics");job.setJarByClass(PersonStatistics.class);//job.setCombinerClass(PersonStatistics.PersonStatisticsReducer.class);job.setMapperClass(PersonStatisticsMapper.class);job.setReducerClass(PersonStatisticsReducer.class);job.setMapOutputKeyClass(IntWritable.class);job.setMapOutputValueClass(PersonWritable.class);job.setOutputKeyClass(NullWritable.class);job.setOutputValueClass(PersonWritable.class);FileInputFormat.addInputPath(job, new Path(sourcePath));FileOutputFormat.setOutputPath(job, new Path(distPath));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}
# person.data
1,张三,30,10
1,张三,30,20
2,李四,25,5

上述执行结果如下:
在这里插入图片描述

分片/InputFormat & InputSplit

官方文档速递

org.apache.hadoop.mapreduce.InputFormat
org.apache.hadoop.mapreduce.InputSplit

日志

执行 序列化 测试小程序,关注以下日志

# 总共加载一个文件,分隔成一个
2024-01-06 09:19:42,363 [main] [org.apache.hadoop.mapreduce.lib.input.FileInputFormat] [INFO] - Total input files to process : 1
2024-01-06 09:19:42,487 [main] [org.apache.hadoop.mapreduce.JobSubmitter] [INFO] - number of splits:1

结束

至此,MapReduce 序列化 至此结束,如有疑问,欢迎评论区留言。

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

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

相关文章

Docker实战09|使用AUFS包装busybox

前几篇文章中&#xff0c;重点讲解了如何实现构建容器&#xff0c;需要回顾的小伙伴可以看以下文章&#xff1a; 《Docker实战06&#xff5c;深入剖析Docker Run命令》《Docker实战07&#xff5c;Docker增加容器资源限制》《Docker实战08&#xff5c;Docker管道及环境变量识别…

YOLOv8改进 | 主干篇 | 12月最新成果UniRepLknet特征提取网络(附对比试验效果图)

一、本文介绍 本文给大家带来的改进机制是特征提取网络UniRepLknet,其也是发表于今年12月份的最新特征提取网络,该网络结构的重点在于使用Dilated Reparam Block和大核心指导原则,强调了高效的结构进行通道间通讯和空间聚合,以及使用带扩张的小核心进行重新参数化,该网络…

自动化生产线-采用工业机器人比人工有哪些优势?

工业机器人相对于人工具有一些显著的优势&#xff0c;这些优势使它们在制造和生产领域得到广泛应用。以下是工业机器人相对于人工的一些主要优势&#xff1a; 1、精度和一致性&#xff1a; 机器人可以执行高精度的操作&#xff0c;确保产品的质量和规格一致&#xff0c;而且不容…

CSS渐变透明

文章目录 一、前言1.1、MDN 二、实现2.1、源码2.2、线上源码 三、最后 一、前言 使用场景&#xff1a;在做两个元素的连接处的UI适配时&#xff0c;图片的颜色不能保证一定跟背景颜色或者是主色调保持一致时&#xff0c;会显得比较突兀。 1.1、MDN MDN的文档&#xff0c;点击【…

​如何在iOS手机上查看应用日志

引言 在开发iOS应用过程中&#xff0c;查看应用日志是非常重要的一项工作。通过查看日志&#xff0c;我们可以了解应用程序运行时的状态和错误信息&#xff0c;帮助我们进行调试和排查问题。本文将介绍两种方法来查看iOS手机上的应用日志&#xff0c;并提供相应的操作步骤。 …

基于Github官方教程的快速入门学习

GitHub 是一个用于版本控制和协作的代码托管平台。 它允许您和其他人随时随地协同处理项目。 创建仓库 在任何页面的右上角&#xff0c;使用 下拉菜单选择“新建存储库”。 之后会进入创建仓库的界面&#xff0c;需要我们进行如下操作&#xff1a; 写仓库的名字写对于本仓库…

无失真编码之算术编码的python实现——数字图像处理

原理 无失真编码中的算术编码是一种用于将输入数据进行高效压缩的方法&#xff0c;同时保留了原始数据的完整性。 算术编码的实现过程如下&#xff1a; 数据分段&#xff1a;首先&#xff0c;将要进行编码的数据划分为一个个符号或字符。每个符号可以是文本中的一个字母、一幅…

ubuntu 20.04下 Tesla P100加速卡使用

1.系统环境&#xff1a;系统ubuntu 20.04, python 3.8 2.查看cuDNN/CUDA与tensorflow的版本关系如下&#xff1a; Build from source | TensorFlow 从上图可以看出&#xff0c;python3.8 对应的tensorflow/cuDNN/CUDA版本。 3.安装tensorflow #pip3 install tensorflow 新版…

hadoop自动获取时间

1、自动获取前15分钟 substr(from_unixtime(unix_timestamp(concat(substr(20240107100000,1,4),-,substr(20240107100000,5,2),-,substr(20240107100000,7,2), ,substr(20240107100000,9,2),:,substr(20240107100000,11,2),:,00))-15*60,yyyyMMddHHmmss),1) unix_timestam…

第一次面试总结 - 迈瑞医疗 - 软件测试

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ&#xff1b;) 专栏 —— 本人真实面经&#xff0c;更多真实面试经验&#xff0c;中大厂面试总结等您挖掘 注&#xff1a;此次面经全靠小嘴八八&#xff0c;没…

腾讯云最新优惠活动入口整理汇总

随着云计算技术的快速发展&#xff0c;腾讯云作为国内领先的云服务提供商&#xff0c;一直致力于为用户提供高效、稳定、安全的云服务。为了回馈广大用户的支持&#xff0c;腾讯云经常推出各种优惠活动。本文将对腾讯云最新的优惠活动入口进行整理和汇总&#xff0c;帮助用户更…

【CV】计算两个向量的夹角,并使用 OpenCV 可视化弧线

背景 基于人体/动物&#xff0c;骨骼点数据&#xff0c;计算关节角度 1. 原理 计算两个向量的夹角&#xff0c;我们已三个点为例&#xff0c;BA 向量和BC向量&#xff0c;求 B 的角度。若为四个点&#xff0c;延长交叉即可。 2. 效果 效果图如下 3. 核心代码 def comput…

【服务器数据恢复】FreeNAS+ESXi数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器&#xff0c;虚拟化系统为esxi&#xff0c;上层使用iSCSI的方式实现FC SAN功能&#xff0c;iSCSI通过FreeNAS构建。 FreeNAS采用了UFS2文件系统&#xff0c;esxi虚拟化系统里有3台虚拟机&#xff1a;其中一台虚拟机安装FreeBSD系统&a…

redis的高可用(主从复制、哨兵、群集)

redis的高可用&#xff08;主从复制、哨兵、群集&#xff09; 主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&…

【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】

英杰社区https://bbs.csdn.net/topics/617804998 一、背景 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程 序&#xff0c;用于抓取豆瓣电影Top250的相关信息&#xff0c;并将其保存为Excel文件。 程序包含以下几个部…

[游戏开发] 两向量夹角计算(0-360度)

上图是Unity左手坐标系&#xff0c;红轴是右&#xff0c;蓝轴是前&#xff0c;绿轴是上 测试目标是黑(3.54,0,4)、黄(-3.85,0,4.8)、灰(0.46,0,-2.6)三个向量&#xff0c;且三个向量都再XZ平面上&#xff0c;Y的值为0 以黑色为起始轴&#xff0c;和其他两周做角度计算 计算角…

微信小程序如何自定义导航栏,怎么确定导航栏及状态栏的高度?导航栏被刘海、信号图标给覆盖了怎么办?

声明&#xff1a;本文为了演示效果&#xff0c;颜色采用的比较显眼&#xff0c;可根据实际情况修改颜色 问题描述 当我们在JSON中将navigationStyle设置成custom后&#xff0c;当前页面的顶部导航栏就需要我们制作了&#xff0c;但出现了一下几个问题&#xff1a; 导航栏的高…

【Scala】——流程控制

1 if-else 分支控制 让程序有选择的的执行&#xff0c;分支控制有三种&#xff1a;单分支、双分支、多分支 1.1单分支 if (条件表达式) {执行代码块 }1.2 双分支 if (条件表达式) {执行代码块 1 } else {执行代码块 2 }1.3 多分支 if (条件表达式1) {执行代码块 1 } else …

初学者的基本 Python 面试问题和答案

文章目录 专栏导读1、什么是Python&#xff1f;列出 Python 在技术领域的一些流行应用。2、在目前场景下使用Python语言作为工具有什么好处&#xff1f;3、Python是编译型语言还是解释型语言&#xff1f;4、Python 中的“#”符号有什么作用&#xff1f;5、可变数据类型和不可变…

CMake入门教程【核心篇】设置和使用缓存变量

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 概述设置缓存变量使用缓存变量更改缓存变量完整代码示例实战使用技巧注意事项总结与分析