详解Flink流处理API

本文详细介绍了Flink流处理的API使用,包括环境设置、数据源、转换操作和接收器。重点讲解了如何创建执行环境,从文件、Kafka等源读取数据,以及map、flatMap、filter等转换算子的使用,并提到了Kafka、Redis和JDBC作为Sink的数据输出。还讨论了UDF函数、富函数的实现方式和生命周期。强调了实践中配置和理解环境的重要性。
摘要由CSDN通过智能技术生成

      Flink流处理流程:首先创建环境(类似于spark里的上下文SparkContext);其次,添加数据来源Source;再次,对数据进行Transform处理;最后,添加输出Sink。
在这里插入图片描述
      准备两个文件hello.txt和sensor.txt
      ①hello.txt的内容:

how are you
fine thank you
and you
i am fine too thank you

      ②sensor.txt的内容:

sensor_1, 1547718199, 35.80018327300259
sensor_6, 1547718201, 15.402984393403084
sensor_7, 1547718202, 6.720945201171228
sensor_10, 1547718205, 38.101067604893444
sensor_6, 1547718206, 35.15018227300459
sensor_1, 1547718207, 35.621945601171228

1 Enviroment

      (1)getExecutionEnvironment
      创建一个执行环境,表示当前执行程序的上下文。 如果程序是独立调用的,则此方法返回本地执行环境;如果从命令行客户端调用程序以提交到集群,则此方法返回此集群的执行环境,也就是说,getExecutionEnvironment会根据查询运行的方式决定返回什么样的运行环境,是最常用的一种创建执行环境的方式。

val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment

      如果没有设置并行度,会以flink-conf.yaml中的配置为准,默认是1。
      (2)createLocalEnvironment
      返回本地执行环境,需要在调用时指定默认的并行度。

val env = StreamExecutionEnvironment.createLocalEnvironment(1)

      (3)createRemoteEnvironment
      返回集群执行环境,将Jar提交到远程服务器。需要在调用时指定JobManager的IP和端口号,并指定要在集群中运行的Jar包。

val env = ExecutionEnvironment.createRemoteEnvironment("jobmanager-hostname", 6123,"C://jar//flink//wordcount.jar")

      这里的端口号6123是JobManager的端口号。

2 Source

      (1)从集合中读取数据

//定义传感器数据样例类
case class SensorReading(id:String, timeStamp:Long, temperature:Double)
val stream1 = env.fromCollection(List(
          SensorReading("sensor_1", 1547718199, 35.80018327300259),
          SensorReading("sensor_6", 1547718201, 15.402984393403084),
          SensorReading("sensor_7", 1547718202, 6.720945201171228),
          SensorReading("sensor_10", 1547718205, 38.101067604893444)
        ))
stream1.print("stream1")

      (2)直接读取
val stream2 = env.fromElements(“flink”,1,2,0.1)
stream2.print(“stream2”)
(3)从文件中读取

val stream3 = env.readTextFile("d:/ sensor.txt")
stream3.print("stream3")

      (4)从Kafka中获取
      ①pom文件:

<dependency>
     <groupId>org.apache.flink</groupId>
     <artifactId>flink-connector-kafka-0.11_2.12</artifactId>
     <version>1.7.0</version>
 </dependency>

      ②主函数代码

val properties = new Properties()
properties.setProperty("bootstrap.servers", "ip地址: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")
val stream4 = env.addSource(new FlinkKafkaConsumer011[String]("sensor",
new SimpleStringSchema(),properties))
stream4.print("stream4")

      :① 踩坑:程序运行成功,但获取不到数据。原因:从zookeeper获取broker的meta信息时,返回的不是ip而是hostname。解决方法:将kafka的server.properties配置文件中的host.name写成主机ip。
      ② SimpleStringSchema 将 kafka 获取的字节流转换为字符串
      (4)从自定义的Source中 读取
      ①创建自定义的SensorSource

class SensorSource() extends SourceFunction[SensorReading]{
   
  // 定义一个flag:表示数据源是否还在正常运行
  var running: Boolean = true
  override def cancel(): Unit =
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值