【Flink】(二)Flink入门(详细教程)

本文是Flink的详细入门教程,涵盖了Environment的介绍,数据源(如集合、文件、socket、kafka)的读取,以及自定义数据源的创建。在转换操作中,讲解了map、flatMap、filter、keyBy、shuffle、split、select、connect、union和各种Operator的使用。最后探讨了Sink的概念,并给出了从Kafka读取数据并存储到Kafka的案例。
摘要由CSDN通过智能技术生成

Flink入门(详细教程)

和其他所有的计算框架一样,flink也有一些基础的开发步骤以及基础,核心的API,从开发步骤的角度来讲,主要分为四大部分
在这里插入图片描述
导入flink相关依赖

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-scala_2.11</artifactId>
  <version>1.7.2</version>
</dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-streaming-scala_2.11</artifactId>
  <version>1.7.2</version>
</dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-connector-kafka_2.11</artifactId>
  <version>1.7.2</version>
</dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-streaming-java_2.11</artifactId>
  <version>1.7.2</version>
</dependency>

1、Environment

Flink Job在提交执行计算时,需要首先建立和Flink框架之间的联系,也就指的是当前的flink运行环境,只有获取了环境信息,才能将task调度到不同的taskManager执行。而这个环境对象的获取方式相对比较简单

// 批处理环境
val env = ExecutionEnvironment.getExecutionEnvironment
// 流式数据处理环境
val env = StreamExecutionEnvironment.getExecutionEnvironment

2、Source

Flink框架可以从不同的来源获取数据,将数据提交给框架进行处理, 我们将获取数据的来源称之为数据源.

2.1、从集合读取数据

一般情况下,可以将数据临时存储到内存中,形成特殊的数据结构后,作为数据源使用。这里的数据结构采用集合类型是比较普遍的

package cn.kgc.kb09
import org.apache.flink.streaming.api.scala._

/**
  * 从集合读取数据
*/
object SourceTest {
   
  def main(args: Array[String]): Unit = {
   
    // 创建执行的环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment

    // 设置所有执行环境的默认并行度
//    env.setParallelism(1)

    // 创建流
    // 从集合中读取数据
    val stream1 = env.fromCollection(
      List(
        "hello java",
        "hello flink"
      )
    )
    // 打印
    stream1.print()

    // 启动流
    env.execute("demo")
  }
}

在这里插入图片描述

2.2、从文件中读取数据

通常情况下,我们会从存储介质中获取数据,比较常见的就是将日志文件作为数据源

package cn.kgc.kb09
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment

/**
  * 从文件获取数据
  */
object SourceFile {
   
  def main(args: Array[String]): Unit = {
   
    // 创建执行的环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment

    // 从指定路径获取数据
    val fileDS = env.readTextFile("in/data.log")

    // 打印
    fileDS.print()

    // 执行
    env.execute("sensor")
  }
}

在这里插入图片描述
在这里插入图片描述

2.3、从socket端口接收数据

需求:
从socket端口接收字符串格式为"sensor_1,1549044122,10"数据
接收到字符串后将字符串流转换成WaterSensor流 DataStream[WaterSensor]

package cn.kgc.kb09.Window
import cn.kgc.kb09.Tramsfrom.WaterSensor
import org.apache.flink.streaming.api.scala._

/**
  * 从socket端口接收字符串格式为"sensor_1,1549044122,10"数据
  * 接收到字符串后将字符串流转换成WaterSensor流  DataStream[WaterSensor]
  */
object TumblingWindowDemo {
   
  def main(args: Array[String]): Unit = {
   
    // 创建执行的环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1) // 设置并行度

    // 从socket端口接收数据
    val stream = env.socketTextStream("192.168.247.201",7777)

    // 转换成样例类
    val dataStream = stream.map(x => {
   
      // 根据逗号切割 获取每个元素
      val strings = x.split(",")
      WaterSensor(strings(0).trim, strings(1).trim.toLong, strings(2).trim.toDouble)
    })

    // 打印
    dataStream.print()
    // 执行
    env.execute("sensor")
  }
}

运行代码,在虚拟机上输入nc -lk 7777 代表向7777号端口输入数据,来进行测试

2.4、kafka读取数据

Kafka作为消息传输队列,是一个分布式的,高吞吐量,易于扩展地基于主题发布/订阅的消息系统。在现今企业级开发中,Kafka 和 Flink成为构建一个实时的数据处理系统的首选

2.4.1 引入kafka连接器的依赖

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-connector-kafka_2.11</artifactId>
  <version>1.7.2</version>
</dependency>

2.4.2 代码实现参考

package cn.kgc.kb09

import java.util.Properties
import org.apache.flink.streaming.api.scala._
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer
import org.apache.kafka.clients.consumer.ConsumerConfig

/**
  * 从kafka读取数据
  */
object SourceKafka {
   
  def main(args: Array[String]): Unit = {
   

    val env = StreamExecutionEnvironment.getExecutionEnvironment

    val prop = new Properties()
    prop.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.247.201:9092")
    prop.setProperty(ConsumerConfig.GROUP_ID_CONFIG,"flink-kafka-demo")
    prop.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringDeserializer")
    prop.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringDeserializer")
    prop.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,"latest")

    // 另外一种表示方法
//    prop.setProperty("bootstrap.servers","192.168.247.201:9092")
//    prop.setProperty("group.id", "flink-kafka-demo")
//    prop.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
//    prop.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
//    prop.setProperty("auto.offset.reset", "latest")

    val kafkaDS = env.addSource(
      new FlinkKafkaConsumer[String](
        "sensor",
        new SimpleStringSchema(),
        prop
      )
    )
    // 打印
    kafkaDS.print()

    // 执行
    env.execute("kafkademo")
  }
}

2.4.3 Kafka Shell 命令
创建Topic

kafka-topics.sh --create --zookeeper 192.168.247.201:2181 --topic sensor --partitions 1 --replication-factor 1

在这里插入图片描述

生产消息

kafka-console-producer.sh --topic sensor --broker-list 192.168.247.201:9092

在这里插入图片描述

启动Java代码,同时执行生产消息命令
在这里插入图片描述

2.5、自定义数据源

大多数情况下&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值