Flink sink算子,kafka数据写入redis

Flink写入Redis的两种方式 1、使用flink提供的RedisSink (1)添加maven依赖 <dependency> <groupId>org.apache.bahir</groupId> <artifactId>flink-connector-redis_2.11</artifactId> <version>1.1-SNA... 阅读详情

1. 概述

  Redis 提供了string、hash、list、set、sorted set、bitmap等一系列常用的数据结构。
Flink 没有直接提供官方的 Redis 连接器,但 Bahir 项目提供了 Flink-Redis 的连接工具

2. 使用

2.1 引入依赖

   服务器上的flink版本与引入的依赖之间有冲突,使用exclusions排除
在这里插入图片描述

    <dependency>
      <groupId>org.apache.bahir</groupId>
      <artifactId>flink-connector-redis_2.11</artifactId>
      <version>1.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-streaming-java_2.11</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

2.2 RedisSink

  连接器提供了一个 RedisSink,继承抽象类 RichSinkFunction,RedisSink 的构造方法需要传入两个参数:FlinkJedisConfigBase:Jedis 的连接配置;RedisMapper:Redis 映射类接口,说明怎样将数据转换成写入 Redis 的类型

2.3 代码

pojo对象

public class Event {
    public String user;
    public String url;
    public long timestamp;

    public Event() {
    }

    public Event(String user, String url, Long timestamp) {
        this.user = user;
        this.url = url;
        this.timestamp = timestamp;
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    @Override
    public String toString() {
        return "Event{" +
                "user='" + user + '\'' +
                ", url='" + url + '\'' +
                ", timestamp=" + new Timestamp(timestamp) +
                '}';
    }
}

(1) 从kafka读取数据
(2) 转换操作
(3) 写入redis

public class SinkToRedis {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env =
                StreamExecutionEnvironment.getExecutionEnvironment();

        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "192.168.42.102:9092,192.168.42.103:9092,192.168.42.104:9092");
        properties.setProperty("group.id", "consumer-group");
        properties.setProperty("key.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("value.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("auto.offset.reset", "latest");
        DataStreamSource<String> stream = env.addSource(new
                FlinkKafkaConsumer<String>(
                "clicks",
                new SimpleStringSchema(),
                properties
        ));

        SingleOutputStreamOperator<Event> flatMap = stream.flatMap(new FlatMapFunction<String, Event>() {
            @Override
            public void flatMap(String s, Collector<Event> collector) throws Exception {
                String[] split = s.split(",");
                collector.collect(new Event(split[0], split[1], Long.parseLong(split[2])));
            }
        });

        FlinkJedisPoolConfig config = new FlinkJedisPoolConfig.Builder().setHost("192.168.0.23").setPassword("123456").setDatabase(15).build();

        flatMap.addSink(new RedisSink<>(config, new RedisMapper<Event>() {
            @Override
            public RedisCommandDescription getCommandDescription() {
                return new RedisCommandDescription(RedisCommand.HSET, "events");
            }

            @Override
            public String getKeyFromData(Event data) {
                return data.user;
            }

            @Override
            public String getValueFromData(Event data) {
                return data.url;
            }
        }));
        
        env.execute();
    }
}

结果:

./kafka-console-producer.sh  --broker-list 192.168.42.102:9092,192.168.42.103:9092,192.168.42.104:9092 --topic clicks

在这里插入图片描述

在这里插入图片描述


Flink-输出算子(Sink)使用 flink输出到kafka,elasticsearch,redis 阅读详情

相关推荐

一文搞懂Flink框架中的输出算子Sink

如果Flink没有为我们提供了一些数据源的Sink,那么我们可以通过自定义的方法来完成。Flink为我们提供了SinkFunction接口和对应的RichSinkFunction抽象类,只要实现它们,就可以实现任何我们想要数据源Sink了。在实现SinkFunction 的时候,需要重写的一个关键方法invoke(),该方法的内容就是将流里的数据发送出去的逻辑。自定义influxdb输出sink。

huanfeng_AI的博客 636

Flink读取Kafka数据保存到Redis的解决方案教程

大数据发展史:Flink和storm sparkstreaming对比实时框架如何选择1:需要关注流数据是否需要进行状态管理 2:At-least-once或者Exectly-once消息投递模式是否有特殊要求 3:对于小型独立的项目,并且需要低延迟的场景,建议使用storm 4:如果你的项目已经使用了spark,并且秒级别的实时处理可以满足需求的话,建议使用sparkStreaming5:要求消息投递语义为 Exactly Once 的场景;数据量较大,要求高吞吐低延迟的场景;需要进行状态管理或窗口统计的场景,建议使用flink针对以上知识我们通过flink读取kafka保存到redis方式快速让大家学习flink如何使用,以及我们如果搭建高性能的flink应用,这个课程属于快速实战篇。Flink + kafka + redis 实时计算

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

Flink(63):Flink中通用RedisUtil工具类

在使用SpringBoot后端开发中,我们如果需要对Redis进行增删查改,可以很方便的使用RedisTemplate或者StringRedisTemplate等对象进行操作。但是在大数据中,如果想要对Redis进行操作,就没有那么方便,特别当flink新一代流式计算框架兴起后,没有直接读取和写入Redis的连接源,不管是开始的时候从Redis中获取数据,还是在中间需要读取维度数据,或者最后将数据写入到Redis,都不方便。此时一个较为方便的工具类就能很方便的使用,能达到节省开发时间、减小开发难度等目的。

yang_shibiao的博客 2681

Python+OpenCV实战:雨天车牌识别准确率提升300%的5个关键技巧

本文针对雨天车牌识别准确率骤降的难题,分享了五个基于Python和OpenCV的实战技巧。通过暗通道先验去雾、雨纹抑制、光照不变量颜色空间转换、多尺度自适应阈值分割以及融合传统特征与轻量级深度学习的混合识别策略,系统性地提升了算法在恶劣天气下的鲁棒性。这些方法能有效解决图像模糊、对比度低、字符断裂粘连等问题,为智能交通等实际应用提供可靠解决方案。

k8l9m0n的博客 717

自动驾驶入门到进阶完整指南:感知、预测、规划、端到端、仿真测评与场景挖掘全解析

对小白来说,不建议一开始直接冲端到端大模型。先学数据和坐标系:否则所有结果都看不懂。再学 LiDAR 3D 检测:最容易建立空间感。再学 BEV/多相机感知:这是当前主流。再学轨迹预测:理解交互和多模态。再学规划控制:理解车为什么这样开。再学仿真和闭环评测:理解 open-loop 和 closed-loop 差异。最后学端到端/VLM/VLA:这时候你才知道它到底替代了哪些模块。贯穿始终学习场景挖掘和安全测评:这是工业界最核心的能力之一。

u013250861的博客 395

【Flink】事务型Sink连接器、kafka连接器、写入到redis、mysql

事务写入 sink 连接器需要和 Flink 的检查点机制集成,因为只有在检查点成功完成以后,事务写入 sink 连接器才会向外部系统 commit 数据。为了简化事务性 sink 的实现,Flink 提供了两个模版用来实现自定义 sink 运算符。这两个模版都实现了 CheckpointListener 接口。CheckpointListener 接口将会从作业管理器接收到检查点完成的通知。GenericWriteAheadSink 模版会收集检查点之前的所有的数据,并将数据存储到 sink任务的运算符状

weixin_43923463的博客 1820

Gradient Accumulation 梯度累加/梯度累积 (Pytorch)

我们在训练神经网络的时候,batch_size的大小会对最终的模型效果产生很大的影响。一定条件下,batch_size设置的越大,模型就会越稳定。batch_size的值通常设置在 8-32 之间,但是当我们做一些计算量需求大的任务(例如语义分割、GAN等)或者输入图片尺寸太大的时候,我们的batch size往往只能设置为2或者4,否则就会出现 “CUDA OUT OF MEMORY” 的不可抗力报错。 那么如何在有限的计算资源的条件下,训练时采用更大的batch size...

hxxjxw的博客 5827

flink入门3-Flink连接Kafka、Redis,实现Kafka Source/Redis Sink

本篇文章将会一步步实现如何使用Flink对接Kafka和Redis,并将Kafka中的数据存储到Redis中,这种场景也是真实项目会遇到的。下载链接:http://archive.apache.org/dist/kafka/此处我下载的版本是kafka_2.12-3.2.0,这个版本需要将参数替代原先的参数,否则执行命令会报错: 1.2 启动内置Zookeeper 1.3 启动Kafka 1.4 常用Kafka指令 创建topic 删除topic 查看所有的topic 向topic中

summon的博客 2845

C# 进程间 双内存共享 高帧率图像传输

演示了两个进程之间通过 双内存共享 的方式, 来实时处理图像,并以高帧率(40~60FPS)传输的基本示例。 进程间内存共享的优点:高性能、低延迟、资源效率高、简单可靠。 适用场景:实时图像处理、大数据传输、多进程协作、实时监控系统,等等。

qianqiansd 1997

[3D检测系列-PV-RCNN] PV-RCNN实战指南:从论文解析到代码调试全流程

本文提供了PV-RCNN在3D目标检测领域的实战全流程指南。文章深入解析了其Point-Voxel融合的核心思想,并详细演示了从环境搭建、数据准备、代码复现到模型训练与调试的具体步骤,特别针对常见的报错问题给出了解决方案,帮助开发者高效掌握这一经典算法。

weixin_29189381的博客 480

Flink - sink算子

Flink中常见的sink算子,对接Kafka、Redis、ES、自定义sink、jdbc sink。案例代码使用。

阿年的博客 1423

MicroPython学习:在STM32上进行移植

本文将介绍如何在STM32上移植MicroPython,并提供相应的源代码。通过以上步骤,你已经成功地将MicroPython移植到STM32上,并可以使用MicroPython语言编写和运行代码。你可以进一步探索MicroPython的功能和API,以利用STM32的各种外设和功能。使用STM32CubeProgrammer或其他适当的烧录工具,将编译生成的MicroPython固件烧录到STM32微控制器中。打开该文件,并根据你的STM32微控制器类型进行必要的配置更改。模块来控制STM32的LED。

JeeVue的博客 1237

Flink pipeline 写入redis

flink redis pipline

Amarone'blog 1815

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【深入浅出flink】第6篇:详解flink中Text Sink、Csv Sink、Socket Sink、Kafka Sink、Redis Sink、ES Sink,以及万能的UDF Sink

Sink 用来消费 DataStream数据的。Flink提供了很多预置的Sink方法,比如Text Sink、Csv Sink、Socket Sink、Kafka Sink、Redis Sink、ES Sink。当现有的Sink不能满足需求时,用户也可以实现自定义sink,用来解决复杂需求。

雷恩Layne 3545

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Flink之输出算子 (Sink)

Flink 作为数据处理框架,最终还是要把计算处理的结果写入外部存储,为外部应用提供支持。我们已经了解了 Flink 程序如何对数据进行读取、转换等操作,最后一步当然就应该将结果数据保存或输出到外部系统了。

四维大脑的博客 5630

Flink 系列之十二 - Data Stream API的输出算子

输出算子:顾名思义就是将数据流输出到外部的存储。跟输入算子一样,输出算子同样包括文件、kafka、数据库等等,包括之前一直在使用的print算子,其实它也是一个输出算子。这一部分Flink也是将其独立到Connector模块提供很好的规范和扩展性,其中Flink内置很多源算子,也支持扩展自定义的源算子。这里通过《Flink官方网站文档》可以实时看到已经支持哪些输出算子。下图为官方截图,到目前为止支持的输出算子,其中有sink字样的就是支持该外部系统输出:除了上面的Flink本身支持的算子之外,还可以在。

代码让AI扣 1153

Flink输出算子Sink

滚动”的概念在日志文件的写入中经常遇到:因为文件会有内容持续不断地写入,所以我们应该给一个标准,到什么时候就开启新的文件,将之前的内容归档保存。StreamingFileSink 支持行编码(Row-encoded)和批量编码(Bulk-encoded,比如Parquet)格式。(basePath)和数据的编码逻辑(rowEncoder 或 bulkWriterFactory)。在创建行或批量编码Sink 时,我们需要传入两个参数,用来指定存储桶的基本路径。文件大小已达到1 GB。

Hardhen的博客 1689

第二天:Flink数据源、Sink、转换算子、函数类 讲解

4. Flink 常用API详解 1. 函数阶层 Flink 根据抽象程度分层,提供了三种不同的 API 和库。每一种 API 在简洁性和表达 力上有着不同的侧重,并且针对不同的应用场景。 1 . ProcessFunction ProcessFunction 是 Flink 所提供最底层接口。ProcessFunction 可以处理一或两条 输入数据流中的单个事件或者归入一个特定窗口内的多个事件。它提供了对于时间和状态的细粒度控制。开发者可以在其中任意地修改状态,也能够注册定时器用以在未来的 某一时刻触发

sowhat 1万+

Flink之Sink

Flink 的 DataStream API 专门提供了向外部写入数据的方法:addSink。与 addSource 类似,addSink 方法对应着一个“Sink”算子,主要就是用来实现与外部系统连接、并将数据提交写入的;Flink 程序中所有对外的输出操作,一般都是利用 Sink 算子完成的。

SuperBoy_Liang的博客 2131

Flink系列文档-(YY06)-Flink编程API-Sink

Flink系列文档-(YY06)-Flink编程API-Sink

HANG.NIAN 1479

Flink输入输出&算子&FlinkCDC

Flink 版本问题,flink使用Scala时,flink1.12兼容scala2.11,flink1.12不兼容scala2.12 一、简介 flink是对有界流和无界数据流进行有状态的计算(所谓状态,指的是之前的数据sparkStreaming中只有updatestateByKey有状态,但是flink中任何的算子都可以有状态,可以自己定义) 1.1sparkStreaming与flink的区别 (1)事件驱动型 sparkStreaming是时间驱动,一个批次中假如没有数据依然会从kafka拉取

weixin_46386869的博客 2297

Flink的Source端和Sink端大全

Flink和各种组件enviromentSourceflink + kafka (flink 消费 kafka 中的数据)SinkFlink + kafka enviroment getExecutionEnvironment       创建一个执行环境,表示当前执行程序的上下文。如果程序是独立调的,则此方法返回本地执行文件;如...

youAreRidiculous的博客 4161

看完就会的Flink基础API

执行环境、数据源(source)、转换操作(transformation)、输出(sink)四大部分getExecutionEnvironment( )最简单的方式,就是直接调用 getExecutionEnvironment 方法。它会根据当前运行的上下文直接得到正确的结果:如果程序是独立运行的,就返回一个本地执行环境;如果是创建了 jar包,然后从命令行调用它并提交到集群执行,那么就返回集群的执行环境。也就是说,这个方法会根据当前运行的方式,自行决定该返回什么样的运行环境。 这种“智能”的方式不需要我们

lydms的博客 1万+

【Flink】(三)详解 Flink DataStream API(Environment、Source、Transform、Sink)

文章目录一、Environment1.1 getExecutionEnvironment1.2 createLocalEnvironment1.3 createRemoteEnvironment二、Source2.1 从集合读取数据2.2 从文件读取数据2.3 以 kafka 消息队列的数据作为来源2.4 自定义 Source三、转换算子(Transform)3.1 map3.2 flatMap3...

云祁QI 1757
上一篇: flink StreamingFileSink 读取kafka中的数据,流式地写入本地文件系统
下一篇: flink kafka写入jdbc数据库mysql,JdbcSink源码
但行益事莫问前程
但行益事莫问前程 新星创作者: 数据库技术领域 新星创作者: 数据库技术领域
博客等级 码龄7年 8490粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值