阿龙学堂-Flink简介

Apache Flink 是一个针对流数据和批数据的分布式处理引擎,起源于2008年的柏林理工大学研究项目,现已成为Apache顶级项目。Flink以其对流数据的高效处理、低延迟和高性能著称,支持事件时间窗口、有状态计算的Exactly-once语义及灵活的窗口操作。Flink 提供DataStream和DataSet API,支持机器学习、图分析、关系数据处理和复杂事件处理。它可以部署在Local、Standalone或Yarn集群模式,具备与Hadoop生态的广泛集成。安装过程包括配置环境变量、修改配置文件和启动服务。Flink 的开发流程涉及获取执行环境、数据处理和结果存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Flink的引入

这几年大数据的飞速发展,出现了很多热门的开源社区,其中著名的有 Hadoop、Storm,以及后来的 Spark,他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河,也以内存为赌注,赢得了内存计算的飞速发展。Spark 的火热或多或少的掩盖了其他分布式计算的系统身影。就像 Flink,也就在这个时候默默的发展着。

在国外一些社区,有很多人将大数据的计算引擎分成了 4 代,当然,也有很多人不会认同。我们先姑且这么认为和讨论。

首先第一代的计算引擎,无疑就是 Hadoop 承载的 MapReduce。这里大家应该都不会对 MapReduce 陌生,它将计算分为两个阶段,分别为 Map 和 Reduce。对于上层应用来说,就不得不想方设法去拆分算法,甚至于不得不在上层应用实现多个 Job 的串联,以完成一个完整的算法,例如迭代计算。

由于这样的弊端,催生了支持 DAG 框架的产生。因此,支持 DAG 的框架被划分为第二代计算引擎。如 Tez 以及更上层的 Oozie。这里我们不去细究各种 DAG 实现之间的区别,不过对于当时的 Tez 和 Oozie 来说,大多还是批处理的任务。

接下来就是以 Spark 为代表的第三代的计算引擎。第三代计算引擎的特点主要是 Job 内部的 DAG 支持(不跨越Job),以及强调的实时计算。在这里,很多人也会认为第三代计算引擎也能够很好的运行批处理的 Job。

随着第三代计算引擎的出现,促进了上层应用快速发展,例如各种迭代计算的性能以及对流计算和 SQL 等的支持。Flink 的诞生就被归在了第四代。这应该主要表现在 Flink 对流计算的支持,以及更一步的实时性上面。当然Flink 也可以支持 Batch 的任务,以及 DAG 的运算。

首先,我们可以通过下面的性能测试初步了解两个框架的性能区别,它们都可以基于内存计算框架进行实时计算,所以都拥有非常好的计算性能。经过测试,Flink计算性能上略好。 

 

测试环境: 

1.CPU:7000个; 

2.内存:单机128GB; 

3.版本:Hadoop 2.3.0,Spark 1.4,Flink 0.9 

4.数据:800MB,8GB,8TB; 

5.算法:K-means:以空间中K个点为中心进行聚类,对最靠近它们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。 

6.迭代:K=10,3组数据 

 

迭代次数(纵坐标是秒,横坐标是次数)

Spark和Flink全部都运行在Hadoop YARN上,性能为Flink > Spark > Hadoop(MR),迭代次数越多越明显,性能上,Flink优于Spark和Hadoop最主要的原因是Flink支持增量迭代,具有对迭代自动优化的功能。 

2. Flink简介

很多人可能都是在 2015 年才听到 Flink 这个词,其实早在 2008 年,Flink 的前身已经是柏林理工大学一个研究性项目, 在 2014 被 Apache 孵化器所接受,然后迅速地成为了 ASF(Apache Software Foundation)的顶级项目之一。Flink 的最新版本目前已经更新到了 0.10.0 了,在很多人感慨 Spark 的快速发展的同时,或许我们也该为 Flink的发展速度点个赞。

Flink 是一个针对流数据和批数据的分布式处理引擎。它主要是由 Java 代码实现。目前主要还是依靠开源社区的贡献而发展。对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已。再换句话说,Flink 会把所有任务当成流来处理,这也是其最大的特点。

Flink 可以支持本地的快速迭代,以及一些环形的迭代任务。并且 Flink 可以定制化内存管理。在这点,如果要对比 Flink 和 Spark 的话,Flink 并没有将内存完全交给应用层。这也是为什么 Spark 相对于 Flink,更容易出现 OOM的原因(out of memory)。就框架本身与应用场景来说,Flink 更相似与 Storm。如果之前了解过 Storm 或者Flume 的读者,可能会更容易理解 Flink 的架构和很多概念。下面让我们先来看下 Flink 的架构图。

 

 

我们可以了解到 Flink 几个最基础的概念,Client、JobManager 和 TaskManager。Client 用来提交任务给JobManager,JobManager 分发任务给 TaskManager 去执行,然后 TaskManager 会心跳的汇报任务状态。看到这里,有的人应该已经有种回到 Hadoop 一代的错觉。确实,从架构图去看,JobManager 很像当年的 JobTracker,TaskManager 也很像当年的 TaskTracker。然而有一个最重要的区别就是 TaskManager 之间是是流(Stream)。其次,Hadoop 一代中,只有 Map 和 Reduce 之间的 Shuffle,而对 Flink 而言,可能是很多级,并且在 TaskManager内部和 TaskManager 之间都会有数据传递,而不像 Hadoop,是固定的 Map 到 Reduce。

3. 技术的特点(可选)

关于Flink所支持的特性,我这里只是通过分类的方式简单做一下梳理,涉及到具体的一些概念及其原理会在后面的部分做详细说明。

3.1. 流处理特性

支持高吞吐、低延迟、高性能的流处理

支持带有事件时间的窗口(Window)操作

支持有状态计算的Exactly-once语义

支持高度灵活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作

支持具有Backpressure功能的持续流模型

支持基于轻量级分布式快照(Snapshot)实现的容错

一个运行时同时支持Batch on Streaming处理和Streaming处理

Flink在JVM内部实现了自己的内存管理

支持迭代计算

支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存

3.2. API支持

对Streaming数据类应用,提供DataStream API

对批处理类应用,提供DataSet API(支持Java/Scala)

3.3. Libraries支持

支持机器学习(FlinkML)

支持图分析(Gelly)

支持关系数据处理(Table)

支持复杂事件处理(CEP)

3.4. 整合支持

支持Flink on YARN

支持HDFS

支持来自Kafka的输入数据

支持Apache HBase

支持Hadoop程序

支持Tachyon

支持ElasticSearch

支持RabbitMQ

支持Apache Storm

支持S3

支持XtreemFS

3.5. Flink生态圈

一个计算框架要有长远的发展,必须打造一个完整的 Stack。不然就跟纸上谈兵一样,没有任何意义。只有上层有了具体的应用,并能很好的发挥计算框架本身的优势,那么这个计算框架才能吸引更多的资源,才会更快的进步。所以 Flink 也在努力构建自己的 Stack。

Flink 首先支持了 Scala 和 Java 的 API,Python 也正在测试中。Flink 通过 Gelly 支持了图操作,还有机器学习的FlinkML。Table 是一种接口化的 SQL 支持,也就是 API 支持,而不是文本化的 SQL 解析和执行。对于完整的 Stack我们可以参考下图。

 

Flink 为了更广泛的支持大数据的生态圈,其下也实现了很多 Connector 的子项目。最熟悉的,当然就是与Hadoop HDFS 集成。其次,Flink 也宣布支持了 Tachyon、S3 以及 MapRFS。不过对于 Tachyon 以及 S3 的支持,都是通过 Hadoop HDFS 这层包装实现的,也就是说要使用 Tachyon 和 S3,就必须有 Hadoop,而且要更改 Hadoop的配置(core-site.xml)。如果浏览 Flink 的代码目录,我们就会看到更多 Connector 项目,例如 Flume 和 Kafka。

4. 安装

Flink 有三种部署模式,分别是 Local、Standalone Cluster 和 Yarn Cluster。

4.1. Local模式

对于 Local 模式来说,JobManager 和 TaskManager 会公用一个 JVM 来完成 Workload。如果要验证一个简单的应用,Local 模式是最方便的。实际应用中大多使用 Standalone 或者 Yarn Cluster,而local模式只是将安装包解压启动(./bin/start-local.sh)即可,在这里不在演示。

4.2. Standalone 模式

4.2.1. 下载

安装包下载地址:http://flink.apache.org/downloads.html

快速入门教程地址:

https://ci.apache.org/projects/flink/flink-docs-release-1.3/quickstart/setup_quickstart.html

 

 

 

4.2.2. 上传安装包到linux系统

使用rz命令

4.2.3. 解压

tar –zxvf flink-1.3.2-bin-hadoop26-scala_2.10.tgz

4.2.4. 重命名

mv flink-1.3.2 flink

4.2.5. 修改环境变量

切换到root用户配置

export FLINK_HOME=/home/hadoop/flink
export PATH=$PATH:$FLINK_HOME/bin

配置结束后切换会普通用户

source /etc/profile

4.2.6. 修改配置文件

修改flink/conf/masters

master1:8081

修改flink/conf/slaves

master1ha

master2

master2ha

修改flink/conf/flink-conf.yaml

taskmanager.numberOfTaskSlots: 2

jobmanager.rpc.address: master1

4.2.7. 启动flink

/home/Hadoop/flink/bin/start-cluster.sh

 

4.2.8. Flink 的 Rest API

Flink 和其他大多开源的框架一样,提供了很多有用的 Rest API。不过 Flink 的 RestAPI,目前还不是很强大,只能支持一些 Monitor 的功能。Flink Dashboard 本身也是通过其 Rest 来查询各项的结果数据。在 Flink RestAPI 基础上,可以比较容易的将 Flink 的 Monitor 功能和其他第三方工具相集成,这也是其设计的初衷。

在 Flink 的进程中,是由 JobManager 来提供 Rest API 的服务。因此在调用 Rest 之前,要确定 JobManager 是否处于正常的状态。正常情况下,在发送一个 Rest 请求给 JobManager 之后,Client 就会收到一个 JSON 格式的返回结果。由于目前 Rest 提供的功能还不多,需要增强这块功能的读者可以在子项目 flink-runtime-web 中找到对应的代码。其中最关键一个类 WebRuntimeMonitor,就是用来对所有的 Rest 请求做分流的,如果需要添加一个新类型的请求,就需要在这里增加对应的处理代码。下面我例举几个常用 Rest API。

1.查询 Flink 集群的基本信息: /overview。示例命令行格式以及返回结果如下:

$ curl http://localhost:8081/overview

{"taskmanagers":1,"slots-total":16,

"slots-available":16,"jobs-running":0,"jobs-finished":0,"jobs-cancelled":0,"jobs-failed":0}

2.查询当前 Flink 集群中的 Job 信息:/jobs。示例命令行格式以及返回结果如下:

$ curl http://localhost:8081/jobs

{"jobs-running":[],"jobs-finished":

["f91d4dd4fdf99313d849c9c4d29f8977"],"jobs-cancelled":[],"jobs-failed":[]}

3.查询一个指定的 Job 信息: /jobs/jobid。这个查询的结果会返回特别多的详细的内容,这是我在浏览器中进行的测试,如下图:

想要了解更多 Rest 请求内容的读者,可以去 Apache Flink 的页面中查找。

4.2.9. 运行测试任务

./bin/flink run -m master1:8082 ./examples/batch/WordCount.jar --input hdfs://master1:9000/words.txt --output hdfs://master1:9000/clinkout

 

 

4.3. Flink 的 HA

首先,我们需要知道 Flink 有两种部署的模式,分别是 Standalone 以及 Yarn Cluster 模式。对于 Standalone 来说,Flink 必须依赖于 Zookeeper 来实现 JobManager 的 HA(Zookeeper 已经成为了大部分开源框架 HA 必不可少的模块)。在 Zookeeper 的帮助下,一个 Standalone 的 Flink 集群会同时有多个活着的 JobManager,其中只有一个处于工作状态,其他处于 Standby 状态。当工作中的 JobManager 失去连接后(如宕机或 Crash),Zookeeper 会从Standby 中选举新的 JobManager 来接管 Flink 集群。

对于 Yarn Cluaster 模式来说,Flink 就要依靠 Yarn 本身来对 JobManager 做 HA 了。其实这里完全是 Yarn 的机制。对于 Yarn Cluster 模式来说,JobManager 和 TaskManager 都是被 Yarn 启动在 Yarn 的 Container 中。此时的JobManager,其实应该称之为 Flink Application Master。也就说它的故障恢复,就完全依靠着 Yarn 中的ResourceManager(和 MapReduce 的 AppMaster 一样)。由于完全依赖了 Yarn,因此不同版本的 Yarn 可能会有细微的差异。这里不再做深究。

4.3.1. 修改配置文件

修改flink-conf.yaml

state.backend: filesystem

state.backend.fs.checkpointdir: hdfs://master1:9000/flink-checkpoints

high-availability: zookeeper

high-availability.storageDir: hdfs://master1:9000/flink/ha/

high-availability.zookeeper.quorum: master1ha:2181,master2:2181,master2ha:2181

high-availability.zookeeper.client.acl: open

修改conf

server.1=master1ha:2888:3888

server.2=master2:2888:3888

server.3=master2ha:2888:3888

修改masters

master1:8082

master1ha:8082

修改slaves

master1ha

master2

master2ha

4.3.2. 启动

/home/Hadoop/flink/bin/start-cluster.sh

 

 

 

4.4. Yarn Cluster 模式

4.4.1. 引入

在一个企业中,为

<think>好的,用户现在想用conda安装apache-flink。首先,我需要确认conda是否支持直接安装flink。通常,Flink的官方安装方式是通过下载二进制包或者使用Maven依赖,但可能conda-forge上有相关的包。 我先检查conda的可用包。执行`conda search apache-flink`可能会显示是否有这个包。如果存在,用户可以直接安装。但根据我的知识,Flink在conda主渠道可能没有官方包,但conda-forge社区可能有。所以可能需要添加conda-forge频道。 如果conda里确实没有,可能需要用pip安装。但用户明确要求用conda,所以可能需要指导他们通过conda安装pip,再用pip安装flink。或者,说明conda不支持,建议使用其他方法。 另外,需要注意Python版本兼容性。Flink的Python API(PyFlink)可能需要特定Python版本,比如3.6+。用户需要确保conda环境中的Python版本符合要求。 步骤可能是:创建conda环境,安装Java(因为Flink依赖Java),然后尝试conda install -c conda-forge apache-flink。如果不行,改用pip安装,并说明conda和pip混用的注意事项。 最后,验证安装是否成功,运行一个简单的PyFlink脚本检查是否有错误。常见问题可能包括Java环境未正确设置或版本不兼容。</think><< 使用 conda 直接安装 Apache Flink 目前不可行,因为 Flink 并未在默认或 conda-forge 频道中提供官方 conda 包。以下是替代方案和详细说明: --- ### **1. 使用 pip 安装 PyFlink** Apache Flink 的 Python API(PyFlink)可通过 pip 安装: ```python # 创建并激活 conda 环境 conda create -n flink_env python=3.8 conda activate flink_env # 安装 PyFlink pip install apache-flink ``` **原因**: - Flink 的 Python API 通过 PyPI 分发,而非 conda 包。 - 需要 Python 3.6+ 环境,建议使用 conda 管理 Python 版本。 --- ### **2. 验证安装** ```python from pyflink.datastream import StreamExecutionEnvironment env = StreamExecutionEnvironment.get_execution_environment() print("Flink 环境初始化成功!") ``` **常见错误**: - **Java 依赖缺失**:Flink 依赖 Java 8/11,需提前安装并设置 `JAVA_HOME`。 - 解决方法: ```bash conda install -c conda-forge openjdk=11 export JAVA_HOME=$CONDA_PREFIX ``` --- ### **3. 完整 conda 环境配置** ```bash # 创建包含 Python 和 Java 的环境 conda create -n flink_env python=3.8 openjdk=11 -c conda-forge conda activate flink_env pip install apache-flink ``` --- ### **4. 为什么 conda 不直接支持 Flink?** - Flink 是 JVM 生态工具,核心功能基于 Java,Python API 是附加组件。 - conda 更适合 Python/C/C++ 原生包,JVM 生态工具通常通过系统包管理器或 SDKMAN! 管理。 --- ### **5. 替代方案** - **直接下载 Flink 二进制包**(推荐生产环境使用): ```bash wget https://archive.apache.org/dist/flink/flink-1.16.0/flink-1.16.0-bin-scala_2.12.tgz tar -xzf flink-*.tgz ./bin/start-cluster.sh ``` --- ### **代码验证示例(WordCount)** ```python from pyflink.table import EnvironmentSettings, TableEnvironment settings = EnvironmentSettings.in_batch_mode() t_env = TableEnvironment.create(settings) t_env.execute_sql(""" CREATE TABLE words ( word STRING ) WITH ( 'connector' = 'filesystem', 'path' = 'input.txt', 'format' = 'csv' ) """) result = t_env.sql_query("SELECT word, COUNT(*) FROM words GROUP BY word") result.execute().print() ``` ---
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值