Apache Flink流处理(四)

是时候动手开发Flink应用程序了!在本章中,您将学习如何设置开发、运行和调试Flink应用程序的环境。

我们将开始讨论所需的软件,并解释如何获得这本书的代码示例。使用这些示例,我们将展示Flink应用程序如何在IDE中执行和调试。 最后,我们将展示如何引导一个Flink Maven项目,该项目是新应用程序的起点。

4.1 所需软件

首先,让我们来讨论开发Flink应用程序所必需的软件。您可以在Linux、macOS和Windows上开发和运行Flink应用程序。然而,基于unix的设置可以享有最丰富的工具支持,因为大多数Flink开发人员更喜欢这种环境。在本章的其余部分中,我们将假设基于的是UNIX的设置。对于Windows用户,您可以使用WSL【Windows subsystem for Linux 】、Cygwin或Linux虚拟机,以实现在UNIX环境中运行Flink。

Flink的DataStream API适用于Java和Scala。 因此,需要Java JDK来实现Flink DataStream应用程序:

  • Java JDK 8(或更高版本)。只安装Java JRE是不够的。

我假定下面的软件您已经安装好了,虽然开发Flink应用程序并不严格要求安装以下软件:

  • Apache Maven 3.x。本书的代码示例使用Maven构建管理。此外,Flink还提供了Maven原型来引导构建一个新的Flink Maven项目。
  • 用于Java和/或Scala开发的IDE。常见的IDE选择是安装了适当插件的IntelliJ IDEA、Eclipse或Netbeans。我们建议使用IntelliJ IDEA。您可以按照https://www.jetbrains.com/idea/download/中的说明下载并安装它。

4.2 IDE中运行和调试Flink程序

即使Flink是一个分布式数据处理系统,您通常也需要会在本地机器上开发和运行初始测试。这使得开发更加容易,并简化了集群部署,因为您可以在集群环境中运行完全相同的代码,而无需进行任何更改。在下文中,我们将描述如何获得该书的代码示例,如何将它们导入IntelliJ,如何运行示例应用程序,以及如何调试它。

4.2.1 将示例程序导入IDE

本书的代码示例托管在GitHub上。 在https://github.com/streaming-with-flink,您将找到一个包含Scala示例的存储库和一个包含Java示例的存储库。 我们将使用Scala存储库进行设置,但如果您更喜欢Java,则也要遵循相同的指示进行设置。

打开终端并运行下面的Git命令,以将示例存储库克隆到本地计算机。

> git clone https://github.com/streaming-with-flink/examples-scala

您还可以从Github上下载zip形式的示例的源代码。

> wget https://github.com/streaming-with-flink/examples-scala/archive/master.zip
> unzip master.zip

本书的示例是一个Maven项目。 您将在src /目录下找到按章节分组的源代码:

.
└── main
    └── scala
        └── io
            └── github
                └── streamingwithflink
                    ├── chapter1
                    │   └── AverageSensorReadings.scala
                    ├── chapter5
                    │   └── ...
                    ├── ...
                    │   └── ...
                    └── util
                        └── ...

现在打开IDE并导入Maven项目。 大多数IDE的导入步骤都类似。 在下文中,我们将详细解释IntelliJ如何操作这一步骤。

选择Import Project,找到本书示例所在的文件夹,然后点击 Open -> Import project from external model -> Maven ,然后单击Next。 选择要导入的项目(应该只有一个)并设置SDK,为项目命名,然后单击Finish:

在这里插入图片描述
Figure 4-1. Import the book examples repository into IntelliJ
在这里插入图片描述
Figure 4-2. Select the Maven project to import (TODO: Update Screenshot for Scala version 2.11)
在这里插入图片描述

Figure 4-3. Give your project a name and click Finish (TODO: Update Screenshot for Scala version 2.11)

大功告成~现在您已经可以浏览和检查本书的示例代码。

4.2.2 IDE中运行Flink应用程序

接下来,让我们在IDE中运行本书的示例应用程序。搜索AverageSensorReadings类并打开它。如第1章所述,该程序为多个热传感器生成读取事件,并将事件中的温度从华氏温度转换为摄氏温度,并计算每个传感器每秒的平均温度。程序的结果被发送到标准输出。就像许多DataStream应用程序一样,程序的发生器、接收器和操作符都是在averagesensorreading类的main()方法中组装的。

要启动该应用程序,请运行main()方法。程序的输出被写入到IDE的标准输出(或控制台)窗口。输出以关于并行操作符任务所经历的状态的日志语句开始,例如SCHEDULING, DEPLOYING, 和RUNNING.。一旦所有任务都启动并运行,程序就会开始生成看起来类似于以下几行的结果:

2> SensorReading(sensor_31,1515014051000,23.924656183848732)
4> SensorReading(sensor_32,1515014051000,4.118569049862492)
1> SensorReading(sensor_38,1515014051000,14.781835420242471)
3> SensorReading(sensor_34,1515014051000,23.871433252250583)

程序将继续生成新事件,处理它们,并每秒发射出新的结果(即平均温度),直到您终止它为止。

现在让我们快速讨论一下背后究竟发生了什么。如第3章所述,Flink应用程序被提交给JobManager (master,,表示的是管理者),它将执行任务分配给一个或多个TaskManagers (workers,表示的是工作者)。由于Flink是一个分布式系统,JobManager和TaskManagers通常作为独立的JVM进程在不同的机器上运行。通常,程序的main()方法负责组装数据流,并在调用StreamExecutionEnvironment.execute()方法时将其提交给远程JobManager。

但是,还有另一种模式,在这种模式中,当我们调用execute()方法时,会在同一JVM进程中将JobManager和TaskManager(默认情况下,具有与可用CPU线程一样多的插槽)作为独立的线程启动。因此,整个Flink应用程序是多线程的,并在同一个JVM进程中执行。此模式用于在IDE中执行Flink程序。

4.2.3 IDE中调试Flink应用程序

由于是单个JVM执行模式,所以在IDE中调试Flink应用程序几乎可以与IDE中的任何其他程序一样。您可以像在正常情况下那样在代码中定义断点并调试应用程序。

然而,在IDE中调试Flink应用程序时,有几个方面需要注意:

  • 除非指定了并行度,否则程序由与本机CPU线程数量相同的线程执行。因此,您应该意识到您可能调试的是一个多线程程序。
  • 与通过向远程JobManager发送Flink应用程序来执行的模式不同,该应用程序是在单个JVM中执行的。因此,某些像类加载的问题不能正确调试。
  • 尽管程序是在单个JVM中执行的,但是记录被序列化以用于跨线程通信和可能的状态持久化。

4.3 引导Flink Maven Project

将本书的示例存储库导入IDE以体验Flink是很好的第一步。但是,您还应该知道如何从头创建一个新的Flink项目。

Flink提供了Maven原型,用于为Java或Scala Flink应用程序生成Maven项目。打开终端,运行以下命令创建一个Flink Maven Quickstart Scala项目,作为Flink应用程序的起点:

mvn archetype:generate                            \
   -DarchetypeGroupId=org.apache.flink            \
   -DarchetypeArtifactId=flink-quickstart-scala   \
   -DarchetypeVersion=1.7.1                       \
   -DgroupId=org.apache.flink.quickstart          \
   -DartifactId=flink-scala-project               \
   -Dversion=0.1                                  \
   -Dpackage=org.apache.flink.quickstart          \
   -DinteractiveMode=false

这将在一个名为flink-scala-project的文件夹中为Flink 1.7.1版本你的Flink生成一个Maven项目。您可以通过更改上述mvn命令的各个参数来更改Flink版本、group和artifact ID、版本和生成的包。生成的文件夹包含一个src/文件夹和一个pom.xml文件。src/文件夹的结构如下:

src/
└── main
    ├── resources
    │   └── log4j.properties
    └── scala
        └── org
            └── apache
                └── flink
                    └── quickstart
                        ├── BatchJob.scala
                        └── StreamingJob.scala

该项目包含两个骨架文件,BatchJob.scala和StreamingJob.scala分别为批处理式Flink程序和流式Flink程序提供了骨架代码。如果不需要,也可以删除它们。或简单地删除。

您可以按照我们在上一节中描述的步骤在IDE中导入项目,也可以执行以下命令来构建jar:

mvn clean package -Pbuild-jar

如果命令成功完成,您将在项目文件夹中找到一个新的target文件夹。其中包含一个名为flink-scala-project-0.1.jar的jar文件。生成的pom.xml文件还包含关于如何向项目添加新依赖项的说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值