Hello Flink(一)
其实这并不是我第一次接触Flink,但是之前都是浅浅的了解,这次准备好好认识一下这位公认的Spark的强大对手——Flink!
一、开发语言
作为一名大数据开发者,我首先关心的就是Flink需要用到哪些语言来进行开发,以及它的原生语言是什么。
Apache Flink 主要使用 Java 和 Scala 语言进行开发,但也支持 Python 和 SQL 等语言。其中,Java 和 Scala 是 Flink 最主要的开发语言,因为它们能够充分利用 Flink 的类型系统和面向对象特性,使得代码更加健壮和可维护。
在 Java 和 Scala 中,使用 Flink 提供的 API 可以编写丰富的批处理和流处理应用程序。此外,Flink 还提供了 DataStream API 和 DataSet API,可以分别用于流处理和批处理场景。这两个 API 都提供了丰富的操作符和函数,方便用户进行数据转换、聚合、过滤等操作。
在 Python 中,Flink 提供了 PyFlink API,可以用于编写流处理和批处理应用程序。使用 PyFlink,用户可以使用 Python 语言编写 Flink 应用程序,并利用 Python 生态系统中的第三方库进行数据处理和分析。
总的来说,Java 和 Scala 是 Flink 的主要开发语言,Python 也可以使用 PyFlink API 进行开发。在 Flink 社区中,Java 和 Scala 的使用比较广泛,但也有不少用户使用 PyFlink 进行开发。我目前最熟悉的就是Scala语言啦,可以基本无缝衔接,不错!
二、输入类型
既然是一款大数据分析框架,那很关键的事情之一就是输入源,如果输入源和业务侧不能对接,那也是一件挺尴尬的事情。目前我使用Spark时最常用的是FileStream,监控HDFS文件的变动,取新文件来分析。
Apache Flink 支持多种类型的输入流,包括批处理和流处理两种模式。下面列举了 Flink 常见的输入流类型:
-
文件输入流:Flink 可以读取 HDFS、本地文件系统和 S3 等存储系统中的文件作为输入流。使用 Flink 提供的 FileInputFormat 和 TextInputFormat 可以读取文本文件,使用 AvroInputFormat 可以读取 Avro 格式的文件,使用 SequenceFileInputFormat 可以读取 Hadoop Sequence File 格式的文件,还可以使用自定义的 Input Format 来读取其他格式的文件。
-
数据库输入流:Flink 支持从 JDBC 数据源中读取数据作为输入流。使用 Flink 的 JDBCInputFormat 可以连接到关系型数据库,并通过 SQL 语句查询数据。同时,Flink 还支持连接到 NoSQL 数据库,例如 Apache Cassandra 和 Apache HBase,并读取数据作为输入流。
-
Socket 输入流:Flink 可以通过 Socket 接收数据作为输入流。使用 Flink 提供的 SocketTextStreamFunction 可以接收文本数据,使用 SocketStreamFunction 可以接收二进制数据。
-
消息队列输入流:Flink 支持从多种消息队列中读取数据作为输入流,包括 Apache Kafka、Apache Pulsar、RabbitMQ 等。使用 Flink 提供的 KafkaConsumer 和 PulsarSourceFunction 可以分别从 Kafka 和 Pulsar 中读取数据。
-
自定义输入流:Flink 还支持通过实现 SourceFunction 接口来创建自定义输入流。SourceFunction 是 Flink 中用于定义数据源的接口,可以用于实现各种输入流,例如从 Web API 中读取数据、从自定义协议中读取数据等。
总的来说,Flink 支持多种输入流,可以满足不同应用场景的需求。用户可以根据自己的数据来源,选择合适的输入流类型,并使用 Flink 提供的相应 API 进行开发。
三、最简单的样例
在我打开官网的Fraud Detection with the DataStream API页面之后,发现事情没那么简单,这里面的样例竟然都是使用Java 11。我平时用的Java 8,这里是稍稍有点怕,万一整出一堆新特性的使用,我还没了解到的那种,就得先学Java 11咯。
不过还好,仔细看了一下样例代码比较简单,我来浅浅解读一下。
package scala.flink
import org.apache.flink.api.scala.createTypeInformation
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.walkthrough.common.source.TransactionSource
class FraudDetectionJob {
@throws[Exception]
def main(args: Array[String]): Unit = {
// 创建一个environment
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 流式读取一个路径下的文件
val transactions = env.readFileStream[Transaction](path = "src/main/resources/",
maxParallelism = 1,
watchType = FileProcessingMode.PROCESS_CONTINUOUSLY,
interval = 1000,
pathFilter = new PathFilter {
// 过滤掉不是csv文件的文件
override def filter(path: Path): Boolean = {
path.getName.endsWith(".csv")
}
})
// 按照账户id分组
val alerts = transactions.keyBy(transaction => transaction.getAccountId).process(new FraudDetector)
// 打印结果
alerts.print
}
}
是不是发现和官网不一样,那就对了。因为这个代码是自己写的,也没测试,只是试试用Scala写一个简单的样例,有时间了再上机测试一下。使用Scala写代码的时候,maven引用和官网不太一样,可以参考下面的引用:
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.12</artifactId>
<version>1.17.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-walkthrough-common</artifactId>
<version>1.17.0</version>
</dependency>
</dependencies>
今天就到这结束吧,再仔细看看官网的代码去,说不定以后就要换回Java为主了。
小伙伴们喜欢使用哪种语言呢?