From dd197ef7bb625c10551f49de576652dd5fdcba6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Thu, 24 Oct 2019 11:13:24 +0800 Subject: [PATCH] =?UTF-8?q?Flink=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E6=90=AD=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/Flink/flink-basis/pom.xml | 3 + notes/Flink开发环境搭建.md | 227 +++++++++++++++++++++++++++---- pictures/flink-download.png | Bin 0 -> 8176 bytes pictures/flink-lib.png | Bin 0 -> 14791 bytes pictures/flink-maven-profile.png | Bin 0 -> 10488 bytes 5 files changed, 201 insertions(+), 29 deletions(-) create mode 100644 pictures/flink-download.png create mode 100644 pictures/flink-lib.png create mode 100644 pictures/flink-maven-profile.png diff --git a/code/Flink/flink-basis/pom.xml b/code/Flink/flink-basis/pom.xml index f4c4381..a4ef7c3 100644 --- a/code/Flink/flink-basis/pom.xml +++ b/code/Flink/flink-basis/pom.xml @@ -57,11 +57,13 @@ under the License. org.apache.flink flink-scala_${scala.binary.version} ${flink.version} + provided org.apache.flink flink-streaming-scala_${scala.binary.version} ${flink.version} + provided @@ -69,6 +71,7 @@ under the License. org.scala-lang scala-library ${scala.version} + provided diff --git a/notes/Flink开发环境搭建.md b/notes/Flink开发环境搭建.md index 66aa8b2..5906915 100644 --- a/notes/Flink开发环境搭建.md +++ b/notes/Flink开发环境搭建.md @@ -1,22 +1,34 @@ # Flink 开发环境搭建 + + ## 一、安装 Scala 插件 Flink 分别提供了基于 Java 语言和 Scala 语言的 API ,如果想要使用 Scala 语言来开发 Flink 程序,可以通过在 IDEA 中安装 Scala 插件来提供语法提示,代码高亮等功能。打开 IDEA , 依次点击 `File => settings => plugins` 打开插件安装页面,搜索 Scala 插件并进行安装,安装完成后,重启 IDEA 即可生效。 -![scala-plugin](D:\BigData-Notes\pictures\scala-plugin.png) +
## 二、Flink 项目初始化 -### 2.1 官方项目初始化方式 +### 2.1 使用官方脚本构建 -Flink 官方支持使用 Maven 和 Gradle 两种构建工具来构建基于 Java 语言的 Flink 项目,支持使用 SBT 和 Maven 两种构建工具来构建基于 Scala 语言的 Flink 项目。 这里以 Maven 为例进行说明,因为其可以同时支持 Java 语言和 Scala 语言项目的构建。 - -需要注意的是 Flink 1.9 只支持 Maven 3.0.4 以上的版本,所以需要预先进行安装。安装完成后,可以通过以下两种方式来构建项目: +Flink 官方支持使用 Maven 和 Gradle 两种构建工具来构建基于 Java 语言的 Flink 项目;支持使用 SBT 和 Maven 两种构建工具来构建基于 Scala 语言的 Flink 项目。 这里以 Maven 为例进行说明,因为其可以同时支持 Java 语言和 Scala 语言项目的构建。需要注意的是 Flink 1.9 只支持 Maven 3.0.4 以上的版本,Maven 安装完成后,可以通过以下两种方式来构建项目: **1. 直接基于 Maven Archetype 构建** -直接使用下面的 maven 语句来进行构建,然后根据交互信息的提示,依次输入 groupId , artifactId 以及包名等信息后等待初始化的完成: +直接使用下面的 mvn 语句来进行构建,然后根据交互信息的提示,依次输入 groupId , artifactId 以及包名等信息后等待初始化的完成: ```bash $ mvn archetype:generate \ @@ -29,7 +41,7 @@ $ mvn archetype:generate \ **2. 使用官方脚本快速构建** -为了更方便的初始化项目,官方提供了快速构建脚本,可以通过以下命令来直接进行调用: +为了更方便的初始化项目,官方提供了快速构建脚本,可以直接通过以下命令来进行调用: ```shell $ curl https://flink.apache.org/q/quickstart.sh | bash -s 1.9.0 @@ -53,29 +65,139 @@ mvn archetype:generate \ 可以看到相比于第一种方式,该种方式只是直接指定好了 groupId ,artifactId ,version 等信息而已。 -### 2.2 使用 IDEA 快速构建 +### 2.2 使用 IDEA 构建 如果你使用的是开发工具是 IDEA ,可以直接在项目创建页面选择 Maven Flink Archetype 进行项目初始化: -![flink-maven](D:\BigData-Notes\pictures\flink-maven.png) +
+如果你的 IDEA 没有上述 Archetype, 可以通过点击右上角的 `ADD ARCHETYPE` ,来进行添加,依次填入所需信息,这些信息都可以从上述的 `archetype:generate ` 语句中获取。点击 `OK` 保存后,该 Archetype 就会一直存在于你的 IDEA 中,之后每次创建项目时,只需要直接选择该 Archetype 即可: -如果你的 IDEA 没有上述 Archetype, 可以通过点击右上角的 `ADD ARCHETYPE` ,来进行添加,依次填入所需信息,这些信息都可以从上述的 `archetype:generate ` 语句中获取。点击 `OK` 保存后,该 Archetype 就会一直存在于你的 IDEA 中,之后每次创建项目时,只需要直接选择该 Archetype 即可。 +
+选中 Flink Archetype ,然后点击 `NEXT` 按钮,之后的所有步骤都和正常的 Maven 工程相同。 -![flink-maven-new](D:\BigData-Notes\pictures\flink-maven-new.png) +## 三、项目结构 -选中 Flink Archetype ,然后点击 `NEXT` 按钮,之后的所有步骤都和正常的 Maven 工程相同。创建完成后的项目结构如下: +### 3.1 项目结构 -![flink-basis-project](D:\BigData-Notes\pictures\flink-basis-project.png) +创建完成后的自动生成的项目结构如下: -## 三、词频统计案例 +
-### 3.1 案例代码 - -创建完成后,可以先书写一个简单的词频统计的案例来尝试运行 Flink 项目,这里以 Scala 语言为例,代码如下: +其中 BatchJob 为批处理的样例代码,源码如下: ```scala -package com.heibaiying +import org.apache.flink.api.scala._ +object BatchJob { + def main(args: Array[String]) { + val env = ExecutionEnvironment.getExecutionEnvironment + .... + env.execute("Flink Batch Scala API Skeleton") + } +} +``` + +getExecutionEnvironment 代表获取批处理的执行环境,如果是本地运行则获取到的就是本地的执行环境;如果在集群上运行,得到的就是集群的执行环境。如果想要获取流处理的执行环境,则只需要将 `ExecutionEnvironment` 替换为 `StreamExecutionEnvironment`, 对应的代码样例在 StreamingJob 中: + +```scala +import org.apache.flink.streaming.api.scala._ + +object StreamingJob { + def main(args: Array[String]) { + val env = StreamExecutionEnvironment.getExecutionEnvironment + ... + env.execute("Flink Streaming Scala API Skeleton") + } +} + +``` + +需要注意的是对于流处理项目 `env.execute()` 这句代码是必须的,否则流处理程序就不会被执行,但是对于批处理项目则是可选的。 + +### 3.2 主要依赖 + +基于 Maven 骨架创建的项目主要提供了以下核心依赖:其中 `flink-scala` 用于支持开发批处理程序 ;`flink-streaming-scala` 用于支持开发流处理程序 ;`scala-library` 用于提供 Scala 语言所需要的类库。如果在使用 Maven 骨架创建时选择的是 Java 语言,则默认提供的则是 `flink-java` 和 `flink-streaming-java` 依赖。 + +```xml + + + + org.apache.flink + flink-scala_${scala.binary.version} + ${flink.version} + provided + + + org.apache.flink + flink-streaming-scala_${scala.binary.version} + ${flink.version} + provided + + + + + org.scala-lang + scala-library + ${scala.version} + provided + +``` + +需要特别注意的以上依赖的 `scope` 标签全部被标识为 provided ,这意味着这些依赖都不会被打入最终的 JAR 包。因为 Flink 的安装包中已经提供了这些依赖,位于其 lib 目录下,名为 `flink-dist_*.jar` ,它包含了 Flink 的所有核心类和依赖: + +
+ + `scope` 标签被标识为 provided 会导致你在 IDEA 中启动项目时会抛出 ClassNotFoundException 异常。基于这个原因,在使用 IDEA 创建项目时还自动生成了以下 profile 配置: + +```xml + + + + + + add-dependencies-for-IDEA + + + + idea.version + + + + + + org.apache.flink + flink-scala_${scala.binary.version} + ${flink.version} + compile + + + org.apache.flink + flink-streaming-scala_${scala.binary.version} + ${flink.version} + compile + + + org.scala-lang + scala-library + ${scala.version} + compile + + + + +``` + +在 id 为 add-dependencies-for-IDEA 的 profile 中,所有的核心依赖都被标识为 compile,此时你可以无需改动任何代码,只需要在 IDEA 的 Maven 面板中勾选该 profile,即可直接在 IDEA 中运行 Flink 项目: + +
+ +## 四、词频统计案例 + +项目创建完成后,可以先书写一个简单的词频统计的案例来尝试运行 Flink 项目,以下以 Scala 语言为例,分别介绍流处理程序和批处理程序的编程示例: + +### 4.1 批处理示例 + +```scala import org.apache.flink.api.scala._ object WordCountBatch { @@ -98,25 +220,72 @@ c,c d,d ``` -本机不需要安装其他任何的 Flink 环境,直接运行 Main 方法即可,结果如下: +本机不需要配置其他任何的 Flink 环境,直接运行 Main 方法即可,结果如下: -![flink-word-count](D:\BigData-Notes\pictures\flink-word-count.png) +
-### 3.1 常见异常 +### 4.2 流处理示例 -这里常见的一个启动异常是如下,之所以出现这样的情况,是因为 Maven 提供的 Flink Archetype 默认是以生产环境为标准的,因为 Flink 的安装包中默认就有 Flink 相关的 JAR 包,所以在 Maven 中这些 JAR 都被标识为 `provided` , 只需要去掉该标签即可。 +```scala +import org.apache.flink.streaming.api.scala._ +import org.apache.flink.streaming.api.windowing.time.Time + +object WordCountStreaming { + + def main(args: Array[String]): Unit = { + + val senv = StreamExecutionEnvironment.getExecutionEnvironment + + val text: DataStream[String] = senv.socketTextStream("192.168.0.229", 9999, '\n') + val windowCounts = text.flatMap { w => w.split(",") }.map { w => WordWithCount(w, 1) }.keyBy("word") + .timeWindow(Time.seconds(5)).sum("count") + + windowCounts.print().setParallelism(1) + + senv.execute("Streaming WordCount") + + } + + case class WordWithCount(word: String, count: Long) + +} -```shell -Caused by: java.lang.ClassNotFoundException: org.apache.flink.api.common.typeinfo.TypeInformation ``` -## 四、使用 Scala 命令行 - https://flink.apache.org/downloads.html - -start-scala-shell.sh +这里以监听指定端口号上的内容为例,使用以下命令来开启端口服务: ```shell -[root@hadoop001 bin]# ./start-scala-shell.sh +nc -lk 9999 +``` + +之后输入测试数据即可观察到流处理程序的处理情况。 + +## 四、使用 Scala Shell + +对于日常的 Demo 项目,如果你不想频繁地启动 IDEA 来观察测试结果,可以像 Spark 一样,直接使用 Scala Shell 来运行程序,这对于日常的学习来说,效果更加直观,也更省时。Flink 安装包的下载地址如下: + +```shell +https://flink.apache.org/downloads.html +``` + +Flink 大多数版本都提供有 Scala 2.11 和 Scala 2.12 两个版本的安装包可供下载: + +
+ +下载完成后进行解压即可,Scala Shell 位于安装目录的 bin 目录下,直接使用以下命令即可以本地模式启动: + +```shell +./start-scala-shell.sh local +``` + +命令行启动完成后,其已经提供了批处理 (benv 和 btenv)和流处理(senv 和 stenv)的运行环境,可以直接运行 Scala Flink 程序,示例如下: + +
+ +最后说明一个常见的异常:这里我使用的 Flink 版本为 1.9.1,启动时会抛出如下异常。这里因为按照官方的说明,目前所有 Scala 2.12 版本的安装包暂时都不支持 Scala Shell,所以如果想要使用 Scala Shell,只能选择 Scala 2.11 版本的安装包。 + +```shell +[root@hadoop001 bin]# ./start-scala-shell.sh local 错误: 找不到或无法加载主类 org.apache.flink.api.scala.FlinkShell ``` diff --git a/pictures/flink-download.png b/pictures/flink-download.png new file mode 100644 index 0000000000000000000000000000000000000000..93fc6629dd18b364a3f3d5c749e5c80765ebd5a9 GIT binary patch literal 8176 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 literal 0 HcmV?d00001 diff --git a/pictures/flink-maven-profile.png b/pictures/flink-maven-profile.png new file mode 100644 index 0000000000000000000000000000000000000000..0c04098538b75d6542681c88b5a7fbcf9c0727f5 GIT binary patch literal 10488 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 literal 0 HcmV?d00001