FLink自定义Sink,生产的数据导出到Redis
一、pom文件
https://www.cnblogs.com/robots2/p/16048648.html
二、自定义sink
2.1 自定义sink
package net.xdclass.class6.sink;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisCommand;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisCommandDescription;
import org.apache.flink.streaming.connectors.redis.common.mapper.RedisMapper;
/**
 * @menu
 */
public class MyRedisSink implements RedisMapper<Tuple2<String,Integer>> {
    //使用什么存储结构,和key名称
    @Override
    public RedisCommandDescription getCommandDescription() {
        return new RedisCommandDescription(RedisCommand.HSET,"VIDEO_ORDER_COUNTER");
    }
    //获取对应的key或file值
    @Override
    public String getKeyFromData(Tuple2<String, Integer> data) {
        System.out.println("自定义获取的key"+data.f0);
        return data.f0;
    }
    //获取对应的值
    @Override
    public String getValueFromData(Tuple2<String, Integer> data) {
        System.out.println("自定义获取的value"+data.f1.toString());
        return data.f1.toString();
    }
}2.2 自定义sink代码
package net.xdclass.class6.app;
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.redis.RedisSink;
import org.apache.flink.streaming.connectors.redis.common.config.FlinkJedisPoolConfig;
import net.xdclass.class6.sink.MyRedisSink;
import net.xdclass.class6.sink.MysqlSink;
import net.xdclass.class6.source.VideoOrderSource;
import net.xdclass.model.VideoOrder;
/**
 * @menu
 */
public class FLink07RedisCustomSinkApp {
    public static void main(String[] args) throws Exception {
        //WebUi方式运行
        final StreamExecutionEnvironment env =
                StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
//        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //设置运行模式为流批一体
        env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
        //并行度
        env.setParallelism(1);
        //设置为自定义source
        DataStream<VideoOrder> ds = env.addSource(new VideoOrderSource());
        //转换transformation,标题转成1
        DataStream<Tuple2<String,Integer>> mapDS = ds.map(new MapFunction<VideoOrder, Tuple2<String,Integer>>() {
            @Override
            public Tuple2<String, Integer> map(VideoOrder videoOrder) throws Exception {
                return new Tuple2<>(videoOrder.getTitle(),1);
            }
        });
        //适用于一行转多行情况用FlatMap,一个字段做切割转成多行
        //        DataStream<Tuple2<String,Integer>> mapDS = ds.flatMap(new FlatMapFunction<VideoOrder, Tuple2<String,Integer>>() {
        //            @Override
        //            public void flatMap(VideoOrder value, Collector<Tuple2<String, Integer>> out) throws Exception {
        //                out.collect(new Tuple2<>(value.getTitle(),1));
        //            }
        //        });
        //分组
        KeyedStream<Tuple2<String, Integer>, String> keyByDs =
                mapDS.keyBy(new KeySelector<Tuple2<String, Integer>, String>() {
            @Override
            public String getKey(Tuple2<String, Integer> value) throws Exception {
                return value.f0;
            }
        });
        //统计每组多少个,统计第二个字段
        DataStream<Tuple2<String, Integer>> sumDs = keyByDs.sum(1);
        //控制台打印
        sumDs.print();
        //设置单机redis地址
        FlinkJedisPoolConfig conf = new FlinkJedisPoolConfig.Builder().setHost("ip地址")
                .setPort(6379)
                .setPassword("密码")
                .build();
        //设置为自定义sink
        sumDs.addSink(new RedisSink<>(conf,new MyRedisSink()));
        //设置名字
        env.execute("CustomRedisSinkApp");
    }
}FLink自定义Sink,生产的数据导出到Redis的更多相关文章
- Flink自定义Sink
		Flink自定义Sink Flink 自定义Sink,把socket数据流数据转换成对象写入到mysql存储. #创建Student类 public class Student { private i ... 
- Flink的sink实战之四:自定义
		欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ... 
- 2.自定义@Excel注解实现数据Excel形式导入导出
		前言 这几天在学习如何使用自定义注解实现Excel格式数据导入导出,参考的还是若依框架里面的代码,由于是初学,所以照猫画虎呗,但是难受的是需要复制并根据自己项目修改作者自定义的工具类以及导入这些工具类 ... 
- Flink的sink实战之二:kafka
		欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ... 
- Flink的sink实战之三:cassandra3
		欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ... 
- ExceptionInChainedOperatorException:flink写hbase对于null数据导致数据导致出现异常
		使用的flink版本:1.9.1 异常描述 需求: 从kafka读取一条数据流 经过filter初次筛选符合要求的数据 然后通过map进行一次条件判断再解析.这个这个过程中可能返回null或目标输出o ... 
- Flink的sink实战之一:初探
		欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ... 
- .net解决数据导出excel时的格式问题
		在项目中一般都需要将报表数据导出到EXCEL中,但经常出现导出长串数据(如身份证)到EXCEL中后显示为科学计数法的格式,或者报表中显示为001的数据导出到Excel后成了1的格式. 下面简单介绍一下 ... 
- [moka同学摘录]Yii2 csv数据导出扩展
		yii2-thecsv(Yii2框架csv数据导出扩展) github: https://github.com/13552277443/yii2-thecsv 1.安装 运行 php composer ... 
- 使用POI实现数据导出Excel表格
		package cn.sh.bzt.kwj.action; import java.io.IOException; import java.io.OutputStream; import java.t ... 
随机推荐
- 聊一下怎么10分钟速水中危CVE
			题目是真的.今天晚上刚接触关于CVE的审计和提交.只能说:牛逼的是真牛逼,水的是真水. 我接下来教你,怎么在10分钟里找到一个CVE的中危漏洞并且提交.然后你就可以去咸鱼接单了,一个一铂快 打开htt ... 
- 自底向上的语法分析,闭包、GOTO函数
			自底向上的语法分析 一.一个串ω归约(reduction)为文法开始符号的过程 关键问题: 1.何时进行规约,2.用哪个产生式规约 句柄右边的串ω一定只包含终结符号. 如果文法是无二义性的,那么文法的 ... 
- SQLServer单表无缝转换到MySQL
			场景:SQLServer 单表结构,无缝转换到MySQL 方法: 1. Navicat-右键需要导出的数据表-逆向表到模型 2. 弹出来的模型窗口里,选择 转换模型为 默认MySQL8.0 确认 3 ... 
- K8S学习笔记之卸载K8S集群
			阅读目录 0x00 概述 0x01 操作 0x00 概述 有时候需要卸载已安装在本机的K8S服务和服务,本文卸载的K8S面向使用kubeadm或者二进制方法安装的,不涉及使用rpm包安装的集群: 主 ... 
- Specifications动态查询
			[前言说明] 针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件 为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 Spe ... 
- Could not retrieve transation read-only status server 的解决办法
			问题描述: 在项目开发的过程中,使用Hibernate的ORM进行建表时,出现 " Could not retrieve transation read-only status server ... 
- 龙哥量化:代写技术指标,通达信ZIG函数优化改进之字转向,高点用最高价,低点用最低价
			如果您需要代写技术指标公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 N:=50; A1:ZIG(3,N/10); 代码只有两行,参数是50,表示涨幅5%,在调参数时 ... 
- Qt开发经验小技巧221-225
			在对表格数据模型操作的时候,经常遇到一种场景就是,删除某条记录后,希望重新选中某一行.QTableView.QTableWidget本身就支持多选全选等操作,比如批量删除可以多选. //拿到表格数据模 ... 
- Qt数据库应用8-数据导出组件示例说明
			一.前言 为了方便用户学习使用本组件,特意针对每个功能模块,每种可能的应用场景,都编写了对应的示例demo,从初级示例到中级示例再到高级示例以及多线程示例等,层层加码,针对结构体数据都做了相当详细细致 ... 
- 创建用于预测序列的人工智能模型,用Keras Tuner探索模型的超参数。
			上一篇:<创建用于预测序列的人工智能模型(五),调整模型的超参数> 序言:在完成初步的模型研发后,接下来的重点是探索和优化超参数.通过合理调整超参数(如学习率.动量参数.神经元数量等),可 ... 
