当前位置: 首页 > news >正文

kafka之视频和图片文件

在 Kafka 中存储视频或图片的格式通常取决于应用场景和传输的需求。Kafka 是一种分布式的流处理平台,设计用来处理事件流或消息流,因此在存储和传输视频或图片时,必须将这些二进制数据序列化为合适的格式。以下是视频和图片在 Kafka 中常见的存储格式及其优缺点:

1. 原始二进制格式(Raw Binary Format)

方式:

视频和图片可以作为原始的二进制数据(byte[])存储在 Kafka 中,Kafka 不对消息的内容做任何处理,消息会直接作为字节流进行传输和存储。

示例:
  • 视频文件(如 .mp4, .avi)或图片文件(如 .jpg, .png)直接读取为二进制流,并通过 Kafka Producer 发送。
    import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}
    import java.io.File
    import java.nio.file.Files
    import java.util.Properties// Kafka Producer 配置
    val props = new Properties()
    props.put("bootstrap.servers", "localhost:9092")
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    props.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer")val producer = new KafkaProducer[String, Array[Byte]](props)// 读取文件为二进制
    val videoFile = new File("/path/to/video.mp4")
    val videoBytes = Files.readAllBytes(videoFile.toPath)// 发送二进制文件到 Kafka
    val record = new ProducerRecord[String, Array[Byte]]("video_topic", "video_key", videoBytes)
    producer.send(record)producer.close()
    
    优点:
  • 简单直接:不需要额外的格式转换,直接传输文件数据。
  • 高效:适用于大文件,因为数据不被编码或压缩,可以快速传输
缺点:
  • 缺乏可读性:数据是原始的二进制流,对于后续处理系统或调试不太友好。
  • 无法处理元数据:视频的分辨率、编码格式等信息不会单独存储。
  • 无压缩:大文件可能占用大量的 Kafka Topic 存储空间

2. Base64 编码

方式:

将二进制数据(如视频或图片)通过 Base64 编码后,再存入 Kafka。这种方式将二进制数据转换成文本形式,便于传输和处理。

示例:

将图片文件编码为 Base64 并发送到 Kafka:

import base64
from kafka import KafkaProducerproducer = KafkaProducer(bootstrap_servers='localhost:9092')# 读取图片文件并编码为Base64
with open('/path/to/image.jpg', 'rb') as image_file:image_bytes = image_file.read()image_base64 = base64.b64encode(image_bytes).decode('utf-8')# 发送编码后的数据到 Kafka
producer.send('image_topic', key=b'image_key', value=image_base64.encode('utf-8'))
producer.flush()
优点:
  • 传输方便:Base64 编码使得二进制数据可以作为字符串处理,便于通过文本系统(如 REST API)进行传输。
  • 兼容性强:适用于不同的文本协议和系统集成。
缺点:
  • 体积增大:Base64 编码会将原始数据体积增加大约 33%,占用更多的存储空间和带宽。
  • 处理性能较低:解码和编码需要额外的计算时间,特别是在高吞吐量的环境下

3. Avro(Apache Avro)

方式:

Avro 是一种紧凑的二进制序列化格式,广泛用于 Kafka 中的消息传输。Avro 提供了强大的模式演进功能,适合包含元数据的视频和图片存储。

  • 可以定义 Avro Schema 来存储视频或图片的元数据信息(如文件大小、格式等),并将实际的二进制内容作为数据字段。
  • Avro 支持紧凑的二进制序列化,能够有效地传输大文件。
示例:

定义一个 Avro Schema 来存储图片的元数据和二进制数据:

{"type": "record","name": "ImageRecord","fields": [{"name": "filename", "type": "string"},{"name": "format", "type": "string"},{"name": "imageData", "type": "bytes"}]
}

Scala 示例:使用 Avro 将图片数据存储到 Kafka:

import java.io.File
import java.nio.file.Files
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}
import io.confluent.kafka.serializers.KafkaAvroSerializer
import org.apache.avro.generic.{GenericData, GenericRecord}
import org.apache.avro.Schemaval schemaStr = """
{"type": "record","name": "ImageRecord","fields": [{"name": "filename", "type": "string"},{"name": "format", "type": "string"},{"name": "imageData", "type": "bytes"}]
}
"""
val schema = new Schema.Parser().parse(schemaStr)// Kafka Producer 配置
val props = new Properties()
props.put("bootstrap.servers", "localhost:9092")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer")
props.put("schema.registry.url", "http://localhost:8081")val producer = new KafkaProducer[String, GenericRecord](props)// 构建 Avro 消息
val imageFile = new File("/path/to/image.jpg")
val imageBytes = Files.readAllBytes(imageFile.toPath)val record = new GenericData.Record(schema)
record.put("filename", "image.jpg")
record.put("format", "jpg")
record.put("imageData", imageBytes)// 发送 Avro 消息到 Kafka
val producerRecord = new ProducerRecord[String, GenericRecord]("image_topic", "image_key", record)
producer.send(producerRecord)producer.close()
优点:
  • 模式灵活:支持元数据和二进制数据的同时存储,适合包含结构化信息的场景。
  • 高效的二进制序列化:Avro 提供了紧凑的二进制格式,减少网络传输的负担。
  • 模式演进:支持 Schema 演进,适合长期维护和升级的数据模式。
缺点:
  • 需要 Schema Registry:Kafka 中使用 Avro 通常需要 Kafka Schema Registry 管理模式,增加系统复杂性。
  • 学习曲线:使用 Avro 和 Schema Registry 需要额外的学习和配置

4. Protobuf(Protocol Buffers)

方式:

Protobuf 是 Google 开发的高效二进制序列化格式,类似于 Avro,Protobuf 也支持紧凑的序列化,适合存储带有元数据的二进制文件(如视频和图片)。

  • Protobuf 定义数据模式(schema),可以序列化二进制数据和元数据。
  • 与 Avro 类似,Protobuf 也适合数据量大且需要紧凑传输的场景。
示例:

定义 Protobuf 模式:

syntax = "proto3";message ImageRecord {string filename = 1;string format = 2;bytes imageData = 3;
}

Scala 示例:使用 Protobuf 发送二进制图片数据到 Kafka:

import com.google.protobuf.ByteString
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}
import java.nio.file.Files
import java.io.File// Kafka Producer 配置
val props = new Properties()
props.put("bootstrap.servers", "localhost:9092")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer")val producer = new KafkaProducer[String, Array[Byte]](props)// 读取文件
val imageFile = new File("/path/to/image.jpg")
val imageBytes = Files.readAllBytes(imageFile.toPath)// 构建 Protobuf 消息
val imageRecord = ImageRecord.newBuilder().setFilename("image.jpg").setFormat("jpg").setImageData(ByteString.copyFrom(imageBytes)).build()// 发送 Protobuf 消息到 Kafka
val record = new ProducerRecord[String, Array[Byte]]("image_topic", "image_key", imageRecord.toByteArray)
producer.send(record)producer.close()
优点:
  • 高效序列化:Protobuf 序列化的二进制格式紧凑,适合传输大文件。
  • 跨语言支持:Protobuf 支持多种编程语言,便于系统集成。
  • 可扩展性:Protobuf 允许数据结构的向前和向后兼容。
缺点:
  • 需要定义 schema

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 闯入清洁家电“诸神之战”的萤石,凭什么立足?
  • Python 工厂模式:构建灵活软件架构的秘密武器
  • 大数据Flink(一百一十六):Flink SQL的时间属性
  • 一文讲懂Mac中的环境变量
  • 如何在Linux虚拟机上安装和配置JDK
  • C++ Primer Plus(速记版)-基本语言
  • 文件的常用操作
  • 5 个最佳开源无代码项目管理工具
  • 【运维监控】Prometheus+grafana监控zookeeper运行情况
  • 虚拟背景扣像SDK解决方案,电影级抠像技术
  • 交叉编译工具链的安装及带wiringPi库的交叉编译实现
  • xshell密钥方式连接阿里云Linux
  • 【数据结构】2——二叉树遍历
  • ThinkCMF框架任意内容包含漏洞的讲解
  • ⭐Unity 安卓环境中正确地读取和处理 XML 文件
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 2017届校招提前批面试回顾
  • Android 架构优化~MVP 架构改造
  • CentOS 7 修改主机名
  • ECMAScript入门(七)--Module语法
  • go append函数以及写入
  • interface和setter,getter
  • JavaScript 奇技淫巧
  • PHP那些事儿
  • SQL 难点解决:记录的引用
  • 京东美团研发面经
  • 跨域
  • 力扣(LeetCode)357
  • 聊一聊前端的监控
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 转载:[译] 内容加速黑科技趣谈
  • Hibernate主键生成策略及选择
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • (1)STL算法之遍历容器
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (C#)获取字符编码的类
  • (C++17) optional的使用
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (动态规划)5. 最长回文子串 java解决
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (推荐)叮当——中文语音对话机器人
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Remoting学习笔记(三)信道
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET6实现破解Modbus poll点表配置文件
  • .net分布式压力测试工具(Beetle.DT)
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET连接数据库方式
  • .net下的富文本编辑器FCKeditor的配置方法
  • @Async 异步注解使用
  • [ACM] hdu 1201 18岁生日
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C/C++]数据结构----顺序表的实现(增删查改)