1、flink-简介(一)
1.定义:flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算
2.特点:低延迟、高吞吐、结果的准确性和容错性
3.flink主要优势:
- 事件驱动:每一条消息或记录就是一个事件
- 基于流的世界观:一切都是流组成的,离线数据是有界的流,实时数据是没有界限的流,即有界和无界的流
- 分层的API:越顶层越抽象,表达含义越简明,使用越方便。越底层越具体,表达能力越丰富,使用越灵活
4.其他特点:
- 支持事件时间(event-time)和处理时间(process-time)语义
- 精确一次(exactly-once)的状态一致性保证
- 低延迟,每秒处理数百万个事件,毫秒级延迟
- 与众多常用的存储系统的链接
- 高可用,动态扩展,实现7*24小时全天候运行
5.fink与spark的比较
- 数据模型
- spark采用RDD模型,streaming的DStream实际上也是一组小批数据RDD的集合
- flink基本数据模型是数据流以及事件序列
- 运行时架构
- spark是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个
- flink是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个几点进行处理
6.基础API
-
pom
<dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-scala_2.11</artifactId> <version>1.7.2</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>1.7.2</version> </dependency> </dependencies> <build> <plugins> <!-- 该插件用于将 Scala 代码编译成 class 文件 --> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.4.6</version> <executions> <execution> <!-- 声明绑定到 maven 的 compile 阶段 --> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>批处理 wordcount
def main(args: Array[String]): Unit = { // 创建执行环境 val env = ExecutionEnvironment.getExecutionEnvironment // 从文件中读取数据 val inputPath = "D:\\Projects\\BigData\\TestWC1\\src\\main\\resources\\hello.txt" val inputDS: DataSet[String] = env.readTextFile(inputPath) val wordCountDS: AggregateDataSet[(String, Int)] = inputDS.flatMap(_.split(" ")).map((_, 1)).groupBy(0).sum(1) // 打印输出 wordCountDS.print() } }流处理
// 从外部命令中获取参数 val params: ParameterTool = ParameterTool.fromArgs(args) val host: String = params.get("host") val port: Int = params.getInt("port") // 创建流处理环境 val env = StreamExecutionEnvironment.getExecutionEnvironment // 接收 socket 文本流 val textDstream: DataStream[String] = env.socketTextStream(host, port) // flatMap 和 Map 需要引用的隐式转换 import org.apache.flink.api.scala._ val dataStream: DataStream[(String, Int)] = textDstream.flatMap(_.split("\\s")).filter(_.nonEmpty).map((_, 1)).keyBy(0).sum(1) dataStream.print().setParallelism(1) // 启动 executor ,执行任务 env.execute("Socket stream word count") } }
1278

被折叠的 条评论
为什么被折叠?



