Source

从自定义的集合中读取数据

/**
* 从集合中读取数据
*/
def readDataFromCollection(): Unit = { val env = StreamExecutionEnvironment.getExecutionEnvironment // 1.从自定义的集合中读取数据
val list = List(
SensorReading("sensor1", 153242, 35.8),
SensorReading("sensor2", 153222, 15.4),
SensorReading("sensor3", 153142, 6.7),
SensorReading("sensor4", 151242, 38.7)) val stream1 = env.fromCollection(list) stream1.print("stream1").setParallelism(1) env.execute("source test")
}

从Kafka中读取数据

引入依赖

    <dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.10_2.11</artifactId>
<version>1.7.2</version>
</dependency>

代码

  /**
* 从kafka中读取数据
*/
def readDataFromKafka(): Unit = { val env = StreamExecutionEnvironment.getExecutionEnvironment val props = new Properties()
props.setProperty("bootstrap.servers", "localhost:9092")
props.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.setProperty("group.id", "flink-demo")
props.setProperty("auto.offset.reset", "latest") val stream1 = env.addSource(new FlinkKafkaConsumer010[String]("flinkdemo",new SimpleStringSchema(),props)) stream1.print("stream1").setParallelism(1) env.execute("source test")
}

从自定义的Source中读取数据


class SensorSource() extends SourceFunction[SensorReading] { var running: Boolean = true // 取消数据源的生成
override def cancel(): Unit = {
running = false
} // 生成数据
override def run(sourceContext: SourceContext[SensorReading]): Unit = {
// 初始化一个随机数发生器
val rand = new Random() var curTemp = 1.to(10).map(
i => ("sensor_" + i, 60 + rand.nextGaussian() * 20)
) while (running) { curTemp = curTemp.map(
t => (t._1, t._2 + rand.nextGaussian())
) val curTime = System.currentTimeMillis() curTemp.foreach(
t => sourceContext.collect(SensorReading(t._1, curTime, t._2))
) Thread.sleep(500) }
}
}

Transform

样例数据

senor_1,1,10
senor_2,2,20
senor_3,3,40
senor_4,4,30
senor_5,5,30
senor_6,6,60
senor_1,7,70

map、reduce、keyBy

map

  • DataStream -> DataStream
  • 通过应用给定的函数,对原先DataStream中的每个元素进行处理,获得一个新的DataStream

keyBy

  • DataStream -> KeyedStream[T,JavaTuple]
  • 对DataStream中的元素按照给定的表达式进行分组

reduce

  • KeyedStream -> DataStream
  • 通过规约原有DataStream中的元素,返回一个新的DataStream

/**
* 使用map、reduce
*/
def testMap(): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) val streamFromFile = env.readTextFile("senor.txt")
val dataStream: DataStream[SensorReading] = streamFromFile.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0).trim, dataArray(1).toLong, dataArray(2).trim.toDouble)
})
.keyBy("id")
.reduce((x, y) => {
SensorReading(x.id, x.timestamp + 1, y.temperature + x.temperature)
}) dataStream.print() env.execute()
}

split、select

split

  • DataStream → SplitStream
  • 按照指定标准将指定的DataStream拆分成多个流用SplitStream来表示

select

  • SplitStream → DataStream
  • 跟split搭配使用,从SplitStream中选择一个或多个流
def testSplit(): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) val streamFromFile = env.readTextFile("senor.txt")
val dataStream: DataStream[SensorReading] = streamFromFile.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0).trim, dataArray(1).toLong, dataArray(2).trim.toDouble)
}) // 多流转换算子
val splitStream = dataStream.split(data => {
if (data.temperature > 20) Seq("high") else Seq("low")
}) val high = splitStream.select("high")
val low = splitStream.select("low")
val all = splitStream.select("high", "low") high.print("high")
low.print("low")
all.print("all") env.execute()
}

connect、coMap、coFlatMap

connect

  • DataStream,DataStream -> ConnectedStreams

coMap

  • ConnectedStreams -> DataStream

def testConnect(): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) val streamFromFile = env.readTextFile("senor.txt")
val dataStream: DataStream[SensorReading] = streamFromFile.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0).trim, dataArray(1).toLong, dataArray(2).trim.toDouble)
}) // 多流转换算子
val splitStream = dataStream.split(data => {
if (data.temperature > 20) Seq("high") else Seq("low")
}) val high = splitStream.select("high")
val low = splitStream.select("low") // 创建一个新的数据流,数据类型与high、low不同
val warning = high.map(data => (data.id, data.temperature))
// 得到ConnectedStreams[T, T2]
val connectedStreams = warning.connect(low)
val coMapDataStreams = connectedStreams.map(data1 => (data1._1, data1._2, "warning"), data2 => (data2.temperature, "health")) coMapDataStreams.print() env.execute()
}

UDF函数

Filter


def testFilter(): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) val streamFromFile = env.readTextFile("senor.txt")
val dataStream: DataStream[SensorReading] = streamFromFile.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0).trim, dataArray(1).toLong, dataArray(2).trim.toDouble)
}) dataStream.filter(new MyFilter()).print() env.execute()
} class MyFilter() extends FilterFunction[SensorReading] {
override def filter(value: SensorReading): Boolean = {
return value.id.startsWith("senor_1")
}
}

Sink


def testFlinkSink2Kafka(): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1) val streamFromFile = env.readTextFile("senor.txt") // Transform操作
val dataStream = streamFromFile.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0).trim, dataArray(1).toLong, dataArray(2).trim.toDouble).toString
}) // sink
dataStream.addSink(new FlinkKafkaProducer010[String]("localhost:9092", "sinkTest", new SimpleStringSchema())) env.execute()
}

参考文档

Basic API Concepts

Flink算子使用方法及实例演示:union和connect

Flink(五) —— DataStream API的更多相关文章

  1. Apache Flink -Streaming(DataStream API)

    综述: 在Flink中DataStream程序是在数据流上实现了转换的常规程序. 1.示范程序 import org.apache.flink.api.common.functions.FlatMap ...

  2. Flink Program Guide (3) -- Event Time (DataStream API编程指导 -- For Java)

    Event Time 本文翻译自DataStream API Docs v1.2的Event Time ------------------------------------------------ ...

  3. Flink-v1.12官方网站翻译-P002-Fraud Detection with the DataStream API

    使用DataStream API进行欺诈检测 Apache Flink提供了一个DataStream API,用于构建强大的.有状态的流式应用.它提供了对状态和时间的精细控制,这使得高级事件驱动系统的 ...

  4. Flink Program Guide (10) -- Savepoints (DataStream API编程指导 -- For Java)

    Savepoint 本文翻译自文档Streaming Guide / Savepoints ------------------------------------------------------ ...

  5. Flink Program Guide (2) -- 综述 (DataStream API编程指导 -- For Java)

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  6. Flink DataStream API Programming Guide

    Example Program The following program is a complete, working example of streaming window word count ...

  7. Flink Program Guide (8) -- Working with State :Fault Tolerance(DataStream API编程指导 -- For Java)

    Working with State 本文翻译自Streaming Guide/ Fault Tolerance / Working with State ---------------------- ...

  8. flink DataStream API使用及原理

    传统的大数据处理方式一般是批处理式的,也就是说,今天所收集的数据,我们明天再把今天收集到的数据算出来,以供大家使用,但是在很多情况下,数据的时效性对于业务的成败是非常关键的. Spark 和 Flin ...

  9. Flink DataStream API 中的多面手——Process Function详解

    之前熟悉的流处理API中的转换算子是无法访问事件的时间戳信息和水位线信息的.例如:MapFunction 这样的map转换算子就无法访问时间戳或者当前事件的时间. 然而,在一些场景下,又需要访问这些信 ...

  10. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

随机推荐

  1. ETL工具对比

    ETL工具对比 Informatica Kettle 起源 1993年创立于 (美国加利福尼亚州)并于1999年4月在纳斯达克上市 2006年加入了开源BI组织  自2017年9月起,已被(日立集团下 ...

  2. SAP_ABAP常用事务代码

    ST05: 性能跟踪(Performance Trace) SE30/SAT: ABAP对象性能分析 ST12: 单个对象性能分析(Single transaction analysis)

  3. React16 新特性

    一.使用Error Boundary处理错误组件         React16之前:组件在运行期出错,会阻塞整个应用的渲染.   React16之后:引入新的错误处理机制——Error Bounda ...

  4. 读书笔记 - js高级程序设计 - 第五章 引用类型

      引用类型 和 类 不是一个概念 用typeof来检测属性是否存在 typeof args.name == "string"  需要实验 访问属性的方法 .号和[] 一般情况下要 ...

  5. 线上环境 分析java问题 常见命令

    在生产上进程需要分析jvm运行情况,今天分享几个自己常用的命令,持续更新,欢迎补充 1.jps jstack -l {pid} > jstack.log #查看线程快照信息 2.jps jmap ...

  6. Java IO流操作 (I)

    1.FileWriter 写数据---输出流---由控制台向文件中写数据 import java.io.FileWriter; import java.io.IOException; /* * 写数据 ...

  7. JAVA课程设计——俄罗斯方块(团队)

    1.团队介绍 1.1 团名:终于可以回家了嗷嗷嗷 1.2 团员介绍 2.参考来源 https://www.jb51.net/article/142716.htm 3.项目git地址 https://g ...

  8. 从编程实现角度学习Faster R-CNN(附极简实现)

    https://www.jianshu.com/p/9da1f0756813 从编程实现角度学习Faster R-CNN(附极简实现) GoDeep 关注 2018.03.11 15:51* 字数 5 ...

  9. Ubuntu的软件安装管理---dpkg与apt-*详解

    摘要:软件厂商先在他们的系统上面编译好了我们用户所需要的软件,然后将这个编译好并可执行的软件直接发布给用户安装.不同的 Linux 发行版使用不同的打包系统,一般而言,大多数发行版分别属于两大包管理技 ...

  10. 正确返回Unicode码点大于0xFFFF的字符串长度

    如下: function codePointLength(text){ var result = text.match(/[\s\S]/gu); return result? result.lengt ...