Flink自定义source

有些维度表是存在于Redis或者MySQL中需要读取这些数据,但是现在官网只有Sink。于是可以通过自定义一个Source来实现。自定义的Source需要实现(SourceFunction、ParallelSourceFunction)或者扩展(RichSourceFunction,RichParallelSourceFunction)其中的任意一个。
下面的代码实现一个读出本地文件的一个Source

    def main(args: Array[String]): Unit = {
      val env = StreamExecutionEnvironment.getExecutionEnvironment
      val text = env.addSource(new ReadText)
      val mapData = text.map( line => {
        println("接收到的数据:"+line)
        line
      })
      mapData.print().setParallelism(1)
      env.execute("StreamingDemoWithMyNoParallelSourceScala")
    }

  class ReadText extends SourceFunction[String]{
    private var isRunning = true
    override def run(ctx: SourceFunction.SourceContext[String]): Unit ={
      val source = scala.io.Source.fromFile("D:\\data\\word.txt")
      val lines = source.getLines()
      for (line <- lines){
        val word=line.split("|",-1)(2)
        ctx.collect(word)
      }
      source.close()
    }
    override def cancel(): Unit = {
      isRunning =false
    }

执行结果:
结果总结:1.网上好多文章都写open和close方法,但是我竟然没有,于是查看了一下SourceFunction、ParallelSourceFunction源码确实没有。于是又查看了一下RichSourceFunction,RichParallelSourceFunction里面竟然有,但是IDE不自动显示只能手动override。下面为RichSourceFunction类继承关系图。
在这里插入图片描述在这里插入图片描述
2.由于涉及到序列化问题需要将 val source = scala.io.Source.fromFile(“D:\data\word.txt”)放到run函数里面。同时要注意里面的需要for或者while要及时的退出
3.SourceFunction接口内部有SourceContext接口里面有collectWithTimestamp,emitWatermark方法。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值