flink数据源(自定义数据源mysql、kafka、hbase、mongo)

先在idea中导入相应的依赖(这里我的scala是2.11 flink是1.9.1版本 可自行修改)

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <flink.version>1.9.1</flink.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-scala_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-scala -->
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-scala_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-clients -->
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-clients_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-connector-kafka_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.20</version>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>
  </dependencies>

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

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

我们先看Source端:

1.从集合读数据 

import org.apache.flink.streaming.api.scala._

object SourceList {

  def main(args: Array[String]): Unit = {
    //1.创建执行的环境
    val env: StreamExecutionEnvironment =         
    StreamExecutionEnvironment.getExecutionEnvironment

    //2.从集合中读取数据
    val ds = env.fromCollection(Seq(
      WaterSensor("ws_001",1577844001,45.0),
      WaterSensor("ws_002",1577853001,42.0),
      WaterSensor("ws_003",1577844444,41.0)
    )
  )
    //3.打印
    ds.print()
    //4.执行
    env.execute("sensor")

  }

  /**
   * 定义样例类:水位传感器:用于接收空高数据
   *
   * @param id 传感器编号
   * @param ts 时间戳
   * @param vc 空高
   */
  case class WaterSensor(id: String, ts: Long, vc: Double)
}

输出结果:

2.从文件中读取数据

//    *******读取文件创建DataStream*******
    val ds = env.readTextFile("d:/aaa.txt")
    ds.print()

 3.读取socket端口创建DataStream

打开虚拟机 输入:nc -lp 9999

val ds = env.socketTextStream("192.168.189.20",9999)
    ds.print()

然后执行程序 我们就可以读到端口输入的内容啦

4.读取kafka数据(要加依赖 上面我们已经加过了!)

先在kafka中创建主题,打开生产端生产数据,然后我们就可以

    //*******读取kafka*******
//  val prop = new Properties()
//    prop.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.189.20:9092")
//    prop.setProperty(ConsumerConfig.GROUP_ID_CONFIG,"cm")
//    prop.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,classOf[StringDeserializer].getName)
//    prop.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,classOf[StringDeserializer].getName)
//
//    val ds = env.addSource(
//      new FlinkKafkaConsumer[String](
//        "mydemo02",
//        new SimpleStringSchema(),
//        prop
//      ).setStartFromEarliest()
//    )
//    ds.print()

5.自定义数据源

读取mysql数据源

//    *********读取mysql数据库(自定义源)*********
    var ds =env.addSource(new RichSourceFunction[WaterSensor] {
      var flag = false
      var conn:Connection = _
      var pstat:PreparedStatement = _

      //在构建对象时候只会执行1次
      override def open(parameters: Configuration): Unit = {
        Class.forName("com.mysql.cj.jdbc.Driver")
        conn = DriverManager.getConnection("jdbc:mysql://192.168.189.20:3306/mydemo","root","ok")
        pstat = conn.prepareStatement("select * from watersensor")
      }
      //每次读取数据库都会执行 每行数据就执行一次
      override def run(sourceContext: SourceFunction.SourceContext[WaterSensor]): Unit = {
        if(!flag){
          val rs = pstat.executeQuery()
          while (rs.next()) {
            val id = rs.getString("id")
            val ts = rs.getLong("ts")
            val vc = rs.getDouble("vc")
            //将数据库中获取的数据转为WaterSensor 然后再输出
            sourceContext.collect(WaterSensor(id, ts, vc))
          }
        }
      }
      //退出时候执行一次
      override def cancel(): Unit = {
        flag = true
        pstat.close()
        conn.close()
      }
    })
    ds.print()
env.execute("first001")

读取redis数据源

    //读取redis
    env.addSource(new RichSourceFunction[WaterSensor] {
      var flag = false
      var jedis:Jedis = _

      override def open(parameters: Configuration): Unit = {
        jedis = new Jedis("192.168.189.20")
      }

      override def run(sourceContext: SourceFunction.SourceContext[WaterSensor]): Unit = {
        import scala.collection.JavaConversions._
        if (!flag) {
          val infos = jedis.lrange("temps", 0, 3)
          infos.foreach(line => {
            val params = line.split(",", -1)
            sourceContext.collect(WaterSensor(params(0), params(1).toLong, params(2).toDouble))
          })
        }
      }

      override def cancel(): Unit = {
        flag = true
        jedis.close()
      }
    }).print()
env.execute("first001")

读取hbase数据源数据

    //读取hbase
    val ds=env.addSource(new RichSourceFunction[WaterSensor] {
      var flag= false
      var conn:Connection= _
      var table:Table= _
      var scan:Scan= _
      var results:ResultScanner= _
      override def open(parameters: Configuration): Unit = {
        val conf =HBaseConfiguration.create()
        conf.set("hbase.zookeeper.quorum","192.168.189.20:2181")
        conn=ConnectionFactory.createConnection(conf)
        table=conn.getTable(TableName.valueOf("mydemo:WaterSensor"))
        scan=new Scan()
      }

      override def run(sourceContext: SourceFunction.SourceContext[WaterSensor]): Unit = {
        results=table.getScanner(scan)
        val iter = results.iterator()
        if (!flag){
          while (iter.hasNext){
            val result = iter.next()
            //获取rowkey
            val rowkey = Bytes.toString(result.getRow)
            //获取列簇下面的修饰符
            val ts = Bytes.toString(result.getValue("base".getBytes(), "ts".getBytes()))
            val vc=Bytes.toString(result.getValue("base".getBytes(),"vc".getBytes()))
            sourceContext.collect(WaterSensor(rowkey,ts.toLong,vc.toDouble))}
        }
      }
      override def cancel(): Unit ={
        flag=true
        table.close()
        conn.close()}
      })
    ds.print()
    env.execute("first")

读取mongodb数据源数据

val ds= env.addSource(new RichSourceFunction[WaterSensor] {
    var flag=false
    var client:MongoClient= _
    var database:MongoDatabase= _
    override def open(parameters: Configuration): Unit = {
      client=new MongoClient("192.168.30.181",27017)
      database=client.getDatabase("mydemo")}
override def run(sourceContext: SourceFunction.SourceContext[WaterSensor]): Unit = {
      val coll = database.getCollection("watersensor")
      val iter = coll.find().iterator()
      if (!flag){
        while (iter.hasNext){
          val infos = iter.next()
          sourceContext.collect(WaterSensor(infos.get("id").toString,
            infos.get("ts").toString.toDouble.toLong,infos.get("vc").toString.toDouble))}}}
override def cancel(): Unit = {
      flag=true
      client.close()}})
  ds.print()
  env.execute("one")}}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flink可以使用Kafka作为流数据源。要使用Kafka作为数据源,可以按照以下步骤: 1. 引入Kafka依赖 在Flink项目的pom.xml文件中,添加Kafka的依赖: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> ``` 2. 创建Kafka数据源Flink程序中,可以通过Flink Kafka Consumer创建Kafka数据源。例如: ```java FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>( "topic-name", new SimpleStringSchema(), properties); ``` 其中,第一个参数是Kafka的topic名称,第二个参数是反序列化器,这里使用SimpleStringSchema,第三个参数是Kafka的配置属性。 3. 将Kafka数据源添加到Flink流处理中 使用Flink的DataStream API将Kafka数据源添加到流处理中。例如: ```java DataStream<String> stream = env.addSource(kafkaConsumer); ``` 其中,env是Flink的执行环境。 4. 处理数据 在流处理中,可以使用各种操作来处理数据,例如map、filter、keyBy等。例如: ```java DataStream<String> result = stream .map(new MyMapFunction()) .filter(new MyFilterFunction()) .keyBy(new MyKeySelector()) .window(TumblingEventTimeWindows.of(Time.seconds(10))) .reduce(new MyReduceFunction()); ``` 其中,MyMapFunction、MyFilterFunction、MyKeySelector、MyReduceFunction都是自定义的操作。 5. 将结果写入Kafka 可以使用Flink Kafka Producer将结果写入Kafka。例如: ```java FlinkKafkaProducer<String> kafkaProducer = new FlinkKafkaProducer<>( "topic-name", new SimpleStringSchema(), properties); result.addSink(kafkaProducer); ``` 其中,第一个参数是Kafka的topic名称,第二个参数是序列化器,这里仍使用SimpleStringSchema,第三个参数是Kafka的配置属性。 6. 执行Flink程序 最后,执行Flink程序即可。例如: ```java env.execute("Flink Kafka Example"); ``` 这样,就完成了使用Kafka作为数据源Flink程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后季暖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值