在hadoop中实现序列化与反序列化
在 Hadoop 分布式计算环境中,序列化与反序列化是数据处理的核心机制之一。由于 Hadoop 需要在集群节点间高效传输数据并进行分布式计算,其序列化框架不仅要支持对象的序列化与反序列化,还要满足高效、紧凑、可扩展等特殊需求。本文将深入探讨 Hadoop 中的序列化机制及其实现方法。
一、Hadoop 序列化概述
(一)什么是 Writable 接口
Hadoop 定义了自己的序列化框架,核心是Writable
接口。与 Java 原生的Serializable
相比,Writable
接口设计更注重性能,其序列化过程更紧凑、速度更快,适合大数据环境下的高效数据传输。
Writable
接口定义了两个方法:
write(DataOutput out)
:将对象状态写入输出流readFields(DataInput in)
:从输入流中读取数据并恢复对象状态
(二)为什么不用 Java Serializable
Java 的Serializable
虽然方便,但存在以下问题:
- 性能开销大:序列化过程包含大量元数据,导致序列化后数据体积大
- 速度慢:序列化和反序列化过程效率较低
- 扩展性差:不支持字段的选择性序列化
Hadoop 的Writable
接口通过更轻量级的设计解决了这些问题,成为 Hadoop 生态系统的标准序列化方式。
二、实现自定义 Writable 类
(一)基本实现示例
下面通过一个自定义的Person
类来演示如何实现Writable
接口:
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.Writable;public class Person implements Writable {private String name;private int age;// 必须提供无参构造函数public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}// Getter和Setter方法public String getName() { return name; }public int getAge() { return age; }public void setName(String name) { this.name = name; }public void setAge(int age) { this.age = age; }// 实现Writable接口的write方法@Overridepublic void write(DataOutput out) throws IOException {out.writeUTF(name);out.writeInt(age);}// 实现Writable接口的readFields方法@Overridepublic void readFields(DataInput in) throws IOException {this.name = in.readUTF();this.age = in.readInt();}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}
(二)关键注意事项
- 无参构造函数:必须提供一个无参构造函数,因为 Hadoop 在反序列化时需要通过反射创建对象
- 字段顺序:
readFields
方法中读取字段的顺序必须与write
方法中写入的顺序一致 - 类型处理:使用 Hadoop 提供的
DataOutput
和DataInput
接口中的方法处理各种数据类型
三、在 MapReduce 中使用 Writable
(一)作为键类型的 WritableComparable
如果需要将自定义 Writable 类用作 MapReduce 的键类型,还需要实现WritableComparable
接口,该接口继承自Writable
和java.lang.Comparable
:
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;public class Person implements WritableComparable<Person> {// 字段、构造函数和Writable实现保持不变// 实现compareTo方法用于键比较@Overridepublic int compareTo(Person other) {int nameCompare = this.name.compareTo(other.name);if (nameCompare != 0) {return nameCompare;}return Integer.compare(this.age, other.age);}
}
(二)在 MapReduce 中使用示例
以下是一个简单的 MapReduce 作业示例,使用自定义的Person
类作为键:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;public class PersonCount {public static class PersonMapper extends Mapper<Object, Text, Person, IntWritable> {private final IntWritable one = new IntWritable(1);private Person person = new Person();@Overridepublic void map(Object key, Text value, Context context) throws IOException, InterruptedException {String[] parts = value.toString().split(",");if (parts.length >= 2) {person.setName(parts[0]);person.setAge(Integer.parseInt(parts[1]));context.write(person, one);}}}public static class PersonReducer extends Reducer<Person, IntWritable, Person, IntWritable> {private IntWritable result = new IntWritable();@Overridepublic void reduce(Person key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "Person Count");job.setJarByClass(PersonCount.class);job.setMapperClass(PersonMapper.class);job.setCombinerClass(PersonReducer.class);job.setReducerClass(PersonReducer.class);job.setOutputKeyClass(Person.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}
四、高级序列化框架
(一)Avro
Avro 是 Hadoop 生态系统中常用的序列化框架,具有以下特点:
- 支持丰富的数据类型
- 提供 JSON 格式的模式定义
- 支持数据模式的演进
- 生成的序列化数据紧凑高效
(二)Protocol Buffers
Protocol Buffers 是 Google 开发的高效序列化框架,Hadoop 也提供了对其的支持:
- 基于 IDL(接口描述语言)定义数据结构
- 生成高效的序列化代码
- 广泛应用于分布式系统中
(三)Thrift
Thrift 是 Facebook 开发的跨语言序列化框架,同样可以与 Hadoop 集成:
- 支持多种编程语言
- 提供高效的二进制序列化格式
- 支持服务定义和 RPC 通信
五、性能优化与最佳实践
(一)减少序列化开销
- 优先使用 Hadoop 内置的 Writable 类型(如 IntWritable、Text 等)
- 避免在序列化对象中包含大量数据
- 使用原始数据类型而非包装类
(二)处理复杂对象
对于包含嵌套结构的复杂对象,可以:
- 实现嵌套的 Writable 类
- 使用 Avro 或 Protocol Buffers 等高级序列化框架
- 考虑使用自定义序列化器
(三)序列化调试技巧
- 重写
toString()
方法方便调试 - 使用单元测试验证序列化和反序列化过程
- 监控序列化和反序列化的性能开销
六、总结
Hadoop 的序列化机制是其高效分布式计算的基础,通过实现Writable
接口,我们可以创建高效、紧凑的序列化对象,满足大数据处理的性能需求。对于更复杂的场景,还可以选择 Avro、Protocol Buffers 等高级序列化框架。掌握 Hadoop 序列化技术,对于开发高性能的分布式数据处理应用至关重要。
分享
相关文章:
在hadoop中实现序列化与反序列化
在 Hadoop 分布式计算环境中,序列化与反序列化是数据处理的核心机制之一。由于 Hadoop 需要在集群节点间高效传输数据并进行分布式计算,其序列化框架不仅要支持对象的序列化与反序列化,还要满足高效、紧凑、可扩展等特殊需求。本文将深入探讨…...
数据结构*排序
排序的一些相关概念 稳定性 假设在待排序序列中,存在两个元素A和B,A和B的值相同。在排序后,A和B的相对位置没有变化,就说这排序是稳定的。反之不稳定。 内部排序与外部排序 内部排序:数据完全存储在内存中…...
新浪《经济新闻》丨珈和科技联合蒲江政府打造“数字茶园+智能工厂+文旅综合体“创新模式
5月14日,新浪网《经济新闻》频道专题报道珈和科技在第十四届四川国际茶业博览会上的精彩亮相,并深度聚焦我司以数字技术赋能川茶产业高质量发展创新技术路径,及在成都市“茶业建圈强链”主题推介会上,珈和科技与蒲江县人民政府就智…...
【Linux】第二十三章 控制启动过程
1. 请简要说明 RHEL9的启动过程。 (1)计算机通电。系统固件 (UEFI 或 BIOS) 开机自检 (POST),并初始化部分硬件,然后,固件会寻找启动设备(如硬盘、USB、网络等),并将控制权交给引导…...
深信服golang面经
for range 中赋值的变量,这个变量指向的是真实的地址吗,还是临时变量 不是真实地址,是临时变量 package mainimport "fmt"func main() {slice : []int{4, 2, 3}for _, v : range slice {fmt.Println(v, &v) // 这里的 v 是临…...
基于 Netty + SpringBoot + Vue 的高并发实时聊天系统设计与实现
一、系统架构设计 1.1 整体架构图 ------------------ WebSocket (wss) ------------------ Netty TCP ------------------ | Vue前端 | <-------------------------> | SpringBoot网关 | <------------------> | Netty服务集…...
根据当前日期计算并选取上一个月和上一个季度的日期范围,用于日期控件的快捷选取功能
代码如下: <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"开始月份" end-placeholder"结束月份" :picker-options"pic…...
Spring Boot 使用 jasypt配置明文密码加密
引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version> </dependency>添加配置 jasypt:encryptor:password: pssw0rd&Hubt2ec…...
ubuntu下docker安装mongodb-支持单副本集
1.mogodb支持事务的前提 1) MongoDB 版本:确保 MongoDB 版本大于或等于 4.0,因为事务支持是在 4.0 版本中引入的。 2) 副本集配置:MongoDB 必须以副本集(Replica Set)模式运行,即使是单节点副本集&#x…...
科技赋能,开启现代健康养生新潮流
在科技与生活深度融合的当下,健康养生也迎来了全新的打开方式。无需传统医学的介入,借助现代科学与智能设备,我们能以更高效、精准的方式守护健康。 饮食管理步入精准化时代。利用手机上的营养计算 APP,录入每日饮食࿰…...
《安徽日报》聚焦珈和科技AI创新:智慧虫情测报护航夏粮提质丰产
5月7日,《安徽日报》焦点新闻版块以《高科技助力田管,确保夏粮丰收——为4300多万亩小麦守好防线》为题,深度报道了农业科技在夏粮生产中的关键作用。其中,珈和科技自主研发的AI虫情测报一体机作为绿色防控、农业智慧化的标杆被重…...
企业级 Go 多版本环境部署指南-Ubuntu CentOS Rocky全兼容实践20250520
🛠️ 企业级 Go 多版本环境部署指南-Ubuntu / CentOS / Rocky 全兼容实践 兼顾 多版本管理、安全合规、最小权限原则与 CI/CD 可复现性,本指南以 Go 官方 toolchain 为主,结合 asdf 实现跨语言统一管理,并剔除已过时的 GVM。支持 …...
MCP 协议传输机制大变身:抛弃 SSE,投入 Streamable HTTP 的怀抱
在技术的江湖里,变革的浪潮总是一波接着一波。最近,模型上下文协议(MCP)的传输机制就搞出了大动静,决定和传统的服务器发送事件(SSE)说拜拜,转身拥抱 Streamable HTTP,这…...
Windows 上配置 Docker,Docker 的基本原理和用途,以及如何在 Docker 中运行程序
Windows 系统上的 Docker 安装与使用指南 1. Windows 上配置 Docker 检查系统要求:使用 64 位 Windows 10/11,BIOS 已启用硬件虚拟化(VT-x/AMD-V)。Windows 版本最好更新到 2004 及以上(内部版本19041)&am…...
CBCharacteristic:是「特征」还是「数据通道」?
目录 名词困惑:两种中文译法的由来官方定义 & 开发者视角乐高类比:文件夹与文件智能手表实例:Characteristic 长什么样?iOS 代码实战:读 / 写 / 订阅小结 & Best Practice 1. 名词困惑:为什么有两…...
【JavaEE】多线程
线程 在Java中,鼓励多线程编程。进程可以满足并发编程,但是效率不高(创建、销毁、调度时间都比较长,这些都消耗在申请资源上了),而线程就不一样。 线程也叫“轻量级进程”,创建、销毁、调度都更…...
docker- Harbor 配置 HTTPS 协议的私有镜像仓库
Harbor通过配置 HTTPS 协议,可以确保镜像传输的安全性,防止数据被窃取或篡改。本文将详细介绍如何基于 Harbor 配置 HTTPS 协议的私有镜像仓库。 1.生成自建ca证书 [rootdocker01 ~]# mkdir -p /liux/softwares/harbor/certs/custom/{ca,server,client…...
[SpringBoot]Spring MVC(5.0)----留言板
Spring留言板实现 预期结果 可以发布并显示点击提交后,显示并清除输入框并且再次刷新后,不会清除下面的缓存 约定前后端交互接口 Ⅰ 发布留言 url : /message/publish . param(参数) : from,to,say . return : true / false . Ⅱ 查询留言 url : /messag…...
Jules 从私有预览阶段推向全球公测
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
vLLM框架高效原因分析
vLLM框架在模型推理中以高效出名,主要基于以下核心原理和技术优化,这些设计使其在处理大语言模型时显著提升性能: 一、PagedAttention:动态显存管理技术 vLLM的核心创新在于PagedAttention,灵感源自操作系统的虚拟内存…...
【Git】常用命令大全
以下是 Git 的常用命令大全,分为几个常见类别,便于理解和使用: 1. 初始化与克隆 初始化本地仓库:git init克隆远程仓库到本地:git clone <repository_url> 2. 添加与提交 添加指定文件到暂存区:git…...
pycharm无需科学上网工具下载插件的解决方案
以下是两种无需科学上网即可下载 PyCharm 插件的解决思路: 方法 1:设置 PyCharm 代理 打开 PyCharm选择菜单:File → Settings → Appearance & Behavior → System Settings → HTTP Proxy在代理设置中进行如下配置: 代理地…...
学习threejs,使用Physijs物理引擎,使用DOFConstraint自由度约束,模拟小车移动
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...
仓颉开发语言入门教程:常见UI组件介绍和一些问题踩坑
幽蓝君发现一个问题,仓颉开发语言距离发布马上一年了,一些知名App已经使用仓颉开发了许多功能,但是网络上关于仓颉开发语言的教程少之又少,系统性的教程更是没有,仓颉官网的文档也远远不如ArkTS详尽。 现阶段对于想学…...
[Git] 初识 Git 与安装入门
告别文件噩梦:初识 Git 与安装入门 嘿,朋友!不知道你是不是也遇到过这样的情况:你在写一份重要的文档、报告,或者更常见的,一段代码时,为了安全起见,怕改错了回不去,或者…...
海康威视摄像头C#开发指南:从SDK对接到安全增强与高并发优化
一、海康威视SDK核心对接流程 1. 开发环境准备 官方SDK获取:从海康开放平台下载最新版SDK(如HCNetSDK.dll、PlayCtrl.dll)。依赖项安装:确保C运行库(如vcredist_x86.exe)与S…...
大语言模型 14 - Manus 超强智能体 开源版本 OpenManus 上手指南
写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体(AI Agent),旨在实现“知行合一”,即不仅具备强大的语言理解和推理能力,还能自主执行复杂任务,直接交付完整成…...
使用 LibreOffice 实现各种文档格式转换(支持任何开发语言调用 和 Linux + Windows 环境)[全网首发,保姆级教程,建议收藏]
以下能帮助你可以使用任何开发语言,在任何平台都能使用 LibreOffice 实现 Word、Excel、PPT 等文档的自动转换,目前展示在 ASP.NET Core 中为 PDF的实战案例,其他的文档格式转换逻辑同理。 📦 1. 安装 LibreOffice 🐧…...
CentOS Stream 9 中部署 MySQL 8.0 MGR(MySQL Group Replication)一主两从高可用集群
🐇明明跟你说过:个人主页 🏅个人专栏:《MySQL技术精粹》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、MySQL 8.0 中的高可用方案 2、适用场景 二、环境准备 1、系统环境说明…...
软考中级软件设计师——计算机网络篇
一、计算机网络体系结构 1.OSI七层模型 1. 物理层(Physical Layer) 功能:传输原始比特流(0和1),定义物理介质(如电缆、光纤)的电气、机械特性。 关键设备:中继器&#…...
RK3568 OH5.1 源码编译及问题
安装编译器和二进制工具 在源码根目录下执行prebuilts脚本,安装编译器及二进制工具。 bash build/prebuilts_download.sh在源码根目录执行如下指令安装hb编译工具: python3 -m pip install --user build/hb使用build.sh脚本编译源码 进入源码根目录&…...
【razor】回环结构导致的控制信令错位:例如发送端收到 SR的问题
一、razor的echo程序 根据对 yuanrongxi/razor 仓库的代码和 echo 测试程序相关实现的分析,下面详细解读 echo 程序中 RTCP sender report(SR)、receiver report(RR)回显的问题及项目的解决方式。 1. 问题背景 在 RTP/RTCP 体系下,SR(Sender Report)由发送端周期性发…...
leetcode hot100:三、解题思路大全:哈希(两数之和、字母异位词分组、最长连续序列)、双指针(移动零、盛最多水的容器、三数之和、接雨水)
哈希 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
MySQL 8.0 OCP 1Z0-908 161-170题
Q161.Examine this command, which executes successfully: cluster.addInstance ( ‘:’,{recoveryMethod: ‘clone’ 1}) Which three statements are true? (Choose three.) A)The account used to perform this recovery needs the BACKUP_ ADMIN privilege. B)A target i…...
onlyoffice 源码 调试说明 -ARM和x86双模式安装支持
很多用户在调试onlyoffice源码最大的问题是如何搭建环境,这个难度很高,下面提供一键安装的方式,让普通用户也能快速调试源码。 OnlyOffice Document Server 基于源码运行的容器调试模式,凭借 Docker 容器化技术的核心优势,为开发者提供了跨平台、高兼容性…...
workflow:高效的流式工作架构
引言 workflow是sougou的一款开源框架 主要是以请求回应的模式解决各自网络/IO任务而发明的 一.workflow的任务流 1.workflow都封装了哪些任务流 以请求回应的模式来解释 ① 网络层 服务端 在服务端的request 相当于发送了一个获取客户端请求的请求,response相当…...
音视频之H.265/HEVC速率控制
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
jsmpeg+java+ffmpeg 调用摄像头RTSP流播放
原理就是这样,明白吧。本次用springboot netty起这个2个服务,执行拉代码执行即可 <!-- netty --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.68.Final</ver…...
深度剖析ZooKeeper
1. ZooKeeper架构总览 ZooKeeper 是一个分布式协调服务,广泛用于分布式系统中的配置管理、命名服务、分布式锁和领导选举等场景。以下是对 ZooKeeper 架构、通信机制、容错处理、数据一致性与可靠性等方面的详细剖析。 一、ZooKeeper 主从集群 ZooKeeper 采用 主从…...
Zookeeper 集群安装与脚本化管理详解
安装之前:先关闭所有服务器的防火墙!!!!!!!!!!!! systemctl stop firewalld 关闭防火墙 systemctl disable firewalld 开机不启动防火…...
第10天-Python操作MySQL数据库全攻略:从基础连接到高级应用
一、环境准备 1. 安装MySQL驱动 bash 复制 下载 # 官方推荐驱动 pip install mysql-connector-python# 或使用PyMySQL(兼容性更好) pip install pymysql 2. 创建测试数据库 sql 复制 下载 CREATE DATABASE python_db; USE python_db;CREATE TABLE users (id INT AU…...
Spring Cloud Gateway深度解析:原理、架构与生产实践
文章目录 前言一、概述二、核心架构设计及设计原理2.1 分层架构模型网络层(I/O模型)核心处理层 2.2 核心组件协作流程路由定位阶段过滤器执行阶段 2.3 响应式编程模型实现Reactor上下文传递背压处理机制 2.4 动态路由设计原理2.5 异常处理体系2.6 关键路…...
Trae 04.22版本深度解析:Agent能力升级与MCP市场对复杂任务执行的革新
我正在参加Trae「超级体验官」创意实践征文,本文所使用的 Trae 免费下载链接:Trae - AI 原生 IDE 目录 引言 一、Trae 04.22版本概览 二、统一对话体验的深度整合 2.1 Chat与Builder面板合并 2.2 统一对话的优势 三、上下文能力的显著增强 3.1 W…...
股指期货模型,简单易懂的套利策略
在股指期货投资领域,有不少实用的模型和策略,今天咱们就用大白话来唠唠其中几个重要的概念。 一、跨期套利:合约间的“差价游戏” 跨期套利简单来说,就是投资者以赚取期货合约之间的价差为目的,在同一个期货品种的不…...
MySQL 故障排查与生产环境优化
目录 1. MySQL单实例故障排查 2. MySQL 主从故障排查 3. MySQL 优化 3.1 硬件方面 3.2 MySQL 配置文件 3.3 SQL 方面 1. MySQL单实例故障排查 (1) 故障现象1 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql…...
Java泛型 的详细知识总结
一、泛型的核心作用 类型安全:在编译期检查类型匹配,避免运行时的ClassCastException。代码复用:通过泛型逻辑统一处理多种数据类型。消除强制转换:减少显式的类型转换代码。 二、泛型基础语法 1. 泛型类/接口 定义:…...
k8s 配置 Kafka SASL_SSL双重认证
说明 kafka提供了多种安全认证机制,主要分为SASL和SSL两大类。 SASL: 是一种身份验证机制,用于在客户端和服务器之间进行身份验证的过程,其中SASL/PLAIN是基于账号密码的认证方式。 SSL: 是一种加密协议,…...
电商虚拟户:重构资金管理逻辑,解锁高效归集与智能分账新范式
一、电商虚拟户的底层架构与核心价值 在数字经济浪潮下,电商交易的复杂性与日俱增,传统账户体系已难以满足平台企业对资金管理的精细化需求。电商虚拟户作为基于银行或持牌支付机构账户体系的创新解决方案,通过构建“主账户子账户”的虚拟账户…...
从混乱到高效:我们是如何重构 iOS 上架流程的(含 Appuploader实践)
从混乱到高效:我们是如何重构 iOS 上架流程的 在开发团队中,有一类看不见却至关重要的问题:环境依赖。 特别是 iOS App 的发布流程,往往牢牢绑死在一台特定的 Mac 上。每次需要发版本,都要找到“那台 Mac”ÿ…...
01 基本介绍及Pod基础
01 查看各种资源 01-1 查看K8s集群的内置资源 [rootmaster01 ~]# kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 …...