《高级》Flink异步io链接Redis--Java和Scala版

最近发现好多小伙伴不知道如何异步链接redis

我准备了两个版本 java版本和scala版本

直接上代码,大部分同学看了应该会懂

刚开始学习flink的同学中间细节的东西,不明白的可以微信联系我,可以进入我的flink微信交流群。

 

喜欢flink的朋友,支持一下原创,可以关注我的公众号:

 

先看java版本

import com.alibaba.fastjson.JSON;import org.apache.flink.api.common.serialization.SimpleStringSchema;import org.apache.flink.configuration.Configuration;import org.apache.flink.streaming.api.datastream.AsyncDataStream;import org.apache.flink.streaming.api.datastream.DataStream;import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import org.apache.flink.streaming.api.functions.async.ResultFuture;import org.apache.flink.streaming.api.functions.async.RichAsyncFunction;import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer08;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;import java.util.Collections;import java.util.Properties;import java.util.concurrent.CompletableFuture;import java.util.concurrent.TimeUnit;import java.util.function.Supplier;
public class AsynFlinkRedisJava {    public static void main(String args[]) throws Exception{        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();        env.enableCheckpointing(500);        Properties props = new Properties();        props.setProperty("bootstrap.servers", "localhost:9092");        props.setProperty("zookeeper.connect", "localhost:2181");        props.setProperty("group.id", "flink-kafka");        FlinkKafkaConsumer08 consumer = new FlinkKafkaConsumer08("flink1", new SimpleStringSchema(), props);        DataStream<String> stream = env.addSource(consumer);        DataStream<String> resultStream = AsyncDataStream.unorderedWait(stream, new AsyncRedis(),1000, TimeUnit.MICROSECONDS, 100);        resultStream.print();        env.execute("kaishi");    }}class AsyncRedis extends RichAsyncFunction<String, String> {    private transient JedisPool pool;    @Override    public void open(Configuration parameters) throws Exception {        super.open(parameters);        pool= new JedisPool(new JedisPoolConfig(), "localhost", 6379);    }    @Override    public void asyncInvoke(String input, final ResultFuture<String> resultFuture) throws Exception {        CompletableFuture.supplyAsync(new Supplier<String>() {            @Override            public String get() {                try {                    String imei = JSON.parseObject(input).get("imei").toString();                    Jedis jedis = pool.getResource();                    String result = jedis.hget("DC_IMEI_APPID",imei);                    pool.returnResource(jedis);                    return result;                } catch (Exception e) {                    System.out.println(e);                    return null;                }            }        }).thenAccept( (String dbResult) -> {            resultFuture.complete(Collections.singleton(dbResult));        });    }}

再看scala版本:

import java.util.Propertiesimport org.apache.flink.api.common.serialization.SimpleStringSchemaimport org.apache.flink.streaming.api.scala.{AsyncDataStream, DataStream, StreamExecutionEnvironment, _}import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer08import com.alibaba.fastjson.JSONimport redis.clients.jedis.{Jedis, JedisPool, JedisPoolConfig}import java.util.concurrent.TimeUnitimport org.apache.flink.streaming.api.scala.async.{AsyncFunction, ResultFuture}import scala.concurrent.{ExecutionContext, Future}object AsynFlinkRedis {  def main(args: Array[String]): Unit = {    val env = StreamExecutionEnvironment.getExecutionEnvironment    val properties = new Properties()    //kafka位置 老版本的 kafka是配置zookeeper地址    properties.setProperty("bootstrap.servers","localhost:9092")    properties.setProperty("zookeeper.connect","localhost:2181")    val topic = "flink1"    properties.setProperty("group.id", "test-flink")    val kafkStream = new FlinkKafkaConsumer08(topic,new SimpleStringSchema(),properties)    val stream = env.addSource(kafkStream)    stream.print()    val resultStream=AsyncDataStream.unorderedWait(stream,new RedisAsyncFunction(), 1000, TimeUnit.MILLISECONDS, 100)    resultStream.print()    env.execute()  }}class RedisAsyncFunction extends  AsyncFunction[String,String]{   lazy  val pool = new JedisPool(new JedisPoolConfig,"localhost",6379)  override def asyncInvoke(input: String, resultFuture: ResultFuture[String]): Unit = {    Future {      //获取kafka日志的imei号      val imei = JSON.parseObject(input).get("imei").toString      //从redis中获取imei对应的userid      println(pool.getNumActive)      val jedis = pool.getResource      val useridJson =jedis.hget("DC_IMEI_APPID",imei)      print(useridJson)      resultFuture.complete(Seq(useridJson))      pool.returnResource(jedis)    }(ExecutionContext.global)}}

kafka练习日志:

{"accStatus":"NULL","addr":"","alertType":"stayAlert","fenceId":"NULL","gpsTime":"2019-01-29 23:45:01","iccid":"NULL","imei":"868620190220000","imsi":"NULL","lat":"46.795862","lng":"134.011538","offlineTime":"NULL","postTime":"2019-01-30 00:00:00","time":"NULL","type":"DEVICE"}

redis测试数据:

hset DC_IMEI_APPID 868620190220000 "{\"allFullId\":\"1,130396,130395,129659\",\"appId\":\"TRACKER\",\"userId\":\"129659\",\"mcType\":\"GT06N\",\"timeZone\":\"UTCA08:00\"}"
### 回答1: flink-1.14.3-bin-scala_2.12 是Apache Flink的一个本,它是一个基于分布式数据流处理的开源平台。Flink提供了高效的流处理和批处理能力,支持各种数据源和格式,具有高可用性、可伸缩性、易于使用和开发的特点。 其中,1.14.3代表这个本是Apache Flink的第1.14.3个稳定本,其中包含了性能优化、改进和新功能。Scala_2.12表示在这个本中使用了Scala编程语言的2.12本,这意味着这个本支持Scala编程。 在flink-1.14.3-bin-scala_2.12中,最重要的新功能之一是针对Apache Kafka的完整支持。此外,还支持更优秀的可伸缩性,提供了更多的API变更和改进等。它还提供了一些改进,例如在任务重启时恢复状态,提高了批处理的性能和吞吐量。 总之,flink-1.14.3-bin-scala_2.12是一个高效、可伸缩、易于使用和开发的分布式数据流处理平台,支持流处理和批处理,被广泛用于企业级数据处理和实时数据分析。 ### 回答2: Flink-1.14.3-bin-scala_2.12是一个 Apache Flink 的软件发行,主要针对 Scala 2.12 本进行构建。Apache Flink是一个分布式流处理引擎,支持批量和流式数据处理和分析,并提供高可用性、可扩展性和容错性等特性。Flink-1.14.3-bin-scala_2.12是Apache Flink最新的稳定本,其中包含了许多新的特性、改进和修复了一些前本中存在的问题。在Flink-1.14.3-bin-scala_2.12中,采用了新的caching机制来提高性能,支持Kinesis Video Streams、Kudu、Flink SQL等新的特性,同时也优化了Flink Web Dashboard和Flink SQL Client的用户体验。Flink-1.14.3-bin-scala_2.12的使用需要一定的编程经验,可以使用JavaScala或Python进行开发。此本对于需要处理大规模数据的企业或个人提供了有力的支持,可以提高数据处理效率和准确性,同时也降低了使用成本和复杂度。 ### 回答3: Flink是一个大数据处理框架,其最新本是flink-1.14.3。该本支持Scala 2.12编程语言,并附带可执行二进制文件,文件名为“flink-1.14.3-bin-scala_2.12”。 该文件中包含了Flink的代码和相关依赖库,用户可以直接下载该文件并解压缩后即可开始使用Flink框架进行大数据处理。用户只需要将自己的程序代码打包成JAR文件,并提交给Flink集群运行,Flink就会自动管理和调度任务,实现高效的分布式计算。 该本中包含了许多新的功能和改进,例如增强的流式数据处理能力、更简洁的API、更快的数据处理速度等。此外,该本还修复了许多已知的问题和Bug,提高了Flink的稳定性和性能表现。 总之,flink-1.14.3-bin-scala_2.12是Flink框架的最新本,其包含了许多有用的功能和改进,用户可以下载并使用该本来进行高效的大数据处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值