1. Flink 的开发环境
我们这里Flink 选择的是 Apache Flink 1.9.1 版本,是目前最新的稳定版本,并且兼容性比较好。下载地址:
https://flink.apache.org/zh/downloads.html
1) 开发工具
先说明一下开发工具的问题。官方建议使用 IntelliJ IDEA,因为它默认集成了 Scala和 Maven 环境,使用更加方便,当然使用 Eclipse 也是可以的。我们这门课使用 IDEA。开发 Flink 程序时,可以使用 Java、Python 或者 Scala 语言,本课程全部使用 Scala,因为使用 Scala 实现函数式编程会比较简洁。学生可以在课后自己补充 JAVA 代码。
2) 配置依赖
开发 Flink 应用程序需要最低限度的 API 依赖。最低的依赖库包括:flink-scala 和flink-streaming-scala。大多数应用需要依赖特定的连接器或其他类库,例如 Kafka 的连接器、TableAPI、CEP 库等。这些不是 Flink 核心依赖的一部分,因此必须作为依赖项手动添加到应用程序中。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.9.1</version>
</dependency>
<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>
2. 第一个 Flink 流处理(Streaming )案例
创建项目,并且修改源代码目录为 scala
案例需求:采用 Netcat 数据源发送数据,使用 Flink 统计每个单词的数量。
package com.bjsxt.flink
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
//基于流计算的WordCount案例
object StreamWordCount {
def main(args: Array[String]): Unit = {
//初始化Flink的Streaming(流计算)上下文执行环境
val streamEnv: StreamExecutionEnvironment =
StreamExecutionEnvironment.getExecutionEnvironment
//导入隐式转换,建议写在这里,可以防止IDEA代码提示出错的问题
import org.apache.flink.streaming.api.scala._
//读取数据
val stream: DataStream[String] = streamEnv.socketTextStream("hadoop101",8888)
//转换计算
val result: DataStream[(String, Int)] = stream.flatMap(_.split(","))
.map((_, 1))
.keyBy(0)
.sum(1)
//打印结果到控制台
result.print()
//启动流式处理,如果没有该行代码上面的程序不会运行
streamEnv.execute("wordcount")
}
}
在 Linux 系统中使用 nc 命令发送数据测试
nc -lk 8888
3. 第一个 Flink 批处理(Batch )案例
需求:读取本地数据文件,统计文件中每个单词出现的次数。
根据需求,很明显是有界流(批计算),所以采用另外一个上下文环境:ExecutionEnvironment
package com.bjsxt.flink
import java.net.URL
import org.apache.flink.api.scala.ExecutionEnvironment
object BatchWordCount {
def main(args: Array[String]): Unit = {
//初始化flink的环境
val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
//导入隐式转换,建议写在这里,可以防止IDEA代码提示出错的问题
import org.apache.flink.api.scala._
//读取数据
val dataURL = getClass.getResource("/wc.txt")//wc.txt文件在main目录下的resources中
val data: DataSet[String] = env.readTextFile(dataURL.getPath)
//计算
val result: AggregateDataSet[(String, Int)] = data.flatMap(_.split(" "))
.map((_, 1))
.groupBy(0) //其中0代表元组中的下标,“0”下标代表:单词
.sum(1) //其中1代表元组中的下标,“1”下标代表:单词出现的次数
//打印结果
result.print()
}
}