首页 > 编程知识 正文

如何让手机获得实时天气位置,实时计算 Flink

时间:2023-05-06 12:48:29 阅读:138981 作者:2342

前言

随着近几年大数据的快速发展,也出现了许多计算框架(Hadoop、Storm、Spark、Flink )。 网上有人把大数据计算引擎的发展分为四个阶段。

第一代:带Hadoop的MapReduce第二代:支持无方向图(DAG )框架的计算引擎Tez和Oozie,主要是批处理任务第三代) Job内部的DAG )无方向图),将Spark 包括批处理、AI、机器学习、制图等在内,以Flink为首可能有人不同意以上分类,但其实我认为这并不重要,重要的是感受各框架的不同和更合适的场景没有一个框架可以理解并完美支持所有场景,也没有一个框架可以完全替代另一个。

本文详细介绍了Flink的总体体系结构和Flink的各种特性! 在讨论Flink之前,我们先看一下数据集类型数据运算模型的类型。

数据集类型

无限数据集:无限连续集成的数据集有界数据集:对于有限且不变的数据集,一般的无限数据集是什么?

用户与客户端的实时交互数据应用实时发生的日志金融市场的实时交易记录…数据运算模型

流式处理:只要始终生成数据,计算就会持续批处理。 在预定义的时间内执行计算,并在计算完成后释放计算机资源。 什么是Flink呢?

什么是Flink?

Flink是用于流数据和批处理数据的分布式处理引擎,代码主要由Java实现,有些代码是Scala。 既可以处理大量有边界的数据集,也可以处理无边界的实时数据集。 对于Flink来说,由于要处理的主要场景是流数据,批数据只是流数据的极限特例,所以Flink也是真正的流批统一计算引擎。

Flink提供了状态、检查点、时间、窗口等,它们为Flink提供了基础。 在本文的后半部分会稍微说明一下。 关于具体的深度分析,请参照专门的文章。

Flink的整体结构

自下而上:

1、部署: Flink可以本地运行(直接在IDE中运行程序)、独立群集(Standalone模式),也可以在由YARN、Mesos、K8s管理的群集中运行,并部署到云中。

2、执行: Flink的核心是分布式流媒体数据引擎,意味着数据一次作为一个事件处理。

3、API:DataStream、DataSet、Table、SQL API。

4、扩展库: Flink还包括用于CEP (复杂事件处理)、机器学习、图形处理等场景。

Flink可以用多种方式部署

Flink支持多种模式下的运行。

local :在ide中直接运行Flink Job将在本地启动mini Flink群集Standalone。 在Flink目录下,微笑的虾/start-cluster.sh脚本启动Standalone模式的群集YARN。 YARN是Hadoop群集资源管理系统,可以在群集上执行各种分布式APP。 Flink可以与其他APP应用程序并行应用于YARN。 Flink on YARN的体系结构如下。

Kubernetes:Kubernetes是谷歌开源容器集群管理系统,基于Docker技术,实现了集装箱化APP应用部署执行、资源调度、服务发现、动态扩展等一系列完整功能在GitHub上

通常以上4种较多,另外也支持AWS、MapR、Aliyun OSS等。

Flink分散运转

Flink作业提交框架的流程如下图所示。

1、程序代码:我们写的flink APP代码

2、作业客户端:作业客户端不是Flink程序运行的内部部分,但它是任务运行的起点。 作业客户端接受用户的程序代码,创建数据流,并将数据流发送到作业管理器以供进一步执行。 执行完成后,Job Client将结果返回给用户

3、作业管理器:协调和管理主进程(也称为作业管理器)程序的执行。 其主要作用是安排任务、管理检查点和回切等。 机器群集必须至少有一个主群集。 master安排任务时间,并协调检查点和灾难恢复。 对于高可用性设置,可以有多个主节点,但请确保一个主节点是读节点,其他节点是标准节点。 作业管理器包括三个重要组件:加速器系统、调度器和检查点

4、任务管理器:从作业管理器接收需要部署的任务。 任务管理器是

JVM 中的一个或多个线程中执行任务的工作节点。任务执行的并行性由每个 Task Manager 上可用的任务槽(Slot 个数)决定。每个任务代表分配给任务槽的一组资源。例如,如果 Task Manager 有四个插槽,那么它将为每个插槽分配 25% 的内存。可以在任务槽中运行一个或多个线程。同一插槽中的线程共享相同的 JVM。

同一 JVM 中的任务共享 TCP 连接和心跳消息。Task Manager 的一个 Slot 代表一个可用线程,该线程具有固定的内存,注意 Slot 只对内存隔离,没有对 CPU 隔离。默认情况下,Flink 允许子任务共享 Slot,即使它们是不同 task 的 subtask,只要它们来自相同的 job。这种共享可以有更好的资源利用率。

Flink API

Flink 提供了不同的抽象级别的 API 以开发流式或批处理应用。

最底层提供了有状态流。它将通过 Process Function 嵌入到 DataStream API 中。它允许用户可以自由地处理来自一个或多个流数据的事件,并使用一致性、容错的状态。除此之外,用户可以注册事件时间和处理事件回调,从而使程序可以实现复杂的计算。DataStream / DataSet API 是 Flink 提供的核心 API ,DataSet 处理有界的数据集,DataStream 处理有界或者无界的数据流。用户可以通过各种方法(map / flatmap / window / keyby / sum / max / min / avg / join 等)将数据进行转换或者计算。Table API 是以表为中心的声明式 DSL,其中表可能会动态变化(在表达流数据时)。Table API 提供了例如 select、project、join、group-by、aggregate 等操作,使用起来却更加简洁(代码量更少)。 你可以在表与 DataStream/DataSet 之间无缝切换,也允许程序将 Table API 与 DataStream 以及 DataSet 混合使用。Flink 提供的最高层级的抽象是 SQL 。这一层抽象在语法与表达能力上与 Table API 类似,但是是以 SQL查询表达式的形式表现程序。SQL 抽象与 Table API 交互密切,同时 SQL 查询可以直接在 Table API 定义的表上执行。

Flink 程序与数据流结构

一个完整的 Flink 应用程序结构就是如上两图所示:

1、Source:数据输入,Flink 在流处理和批处理上的 source 大概有 4 类:基于本地集合的 source、基于文件的 source、基于网络套接字的 source、自定义的 source。自定义的 source 常见的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等,当然你也可以定义自己的 source。

2、Transformation:数据转换的各种操作,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,操作很多,可以将数据转换计算成你想要的数据。

3、Sink:数据输出,Flink 将转换计算后的数据发送的地点 ,你可能需要存储下来,Flink 常见的 Sink 大概有如下几类:写入文件、打印出来、写入 socket 、自定义的 sink 。自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也可以定义自己的 sink。

Flink 支持多种扩展库

Flink 拥有丰富的库来进行机器学习,图形处理,关系数据处理等。由于其架构,很容易执行复杂的事件处理和警报。

Flink 提供多种 Time 语义

Flink 支持多种 Time,比如 Event time、Ingestion Time、Processing Time,后面的文章 [Flink 中 Processing Time、Event Time、Ingestion Time 对比及其使用场景分析] 中会很详细的讲解 Flink 中 Time 的概念。

Flink 提供灵活的窗口机制

Flink 支持多种 Window,比如 Time Window、Count Window、Session Window,还支持自定义 Window。后面的文章 [如何使用 Flink Window 及 Window 基本概念与实现原理] 中会很详细的讲解 Flink 中 Window 的概念。

Flink 并行的执行任务

Flink 的程序内在是并行和分布式的,数据流可以被分区成 stream partitions,operators 被划分为 operator subtasks; 这些 subtasks 在不同的机器或容器中分不同的线程独立运行;

operator subtasks 的数量在具体的 operator 就是并行计算数,程序不同的 operator 阶段可能有不同的并行数;如下图所示,source operator 的并行数为 2,但最后的 sink operator 为 1:

Flink 支持状态存储

Flink 是一款有状态的流处理框架,它提供了丰富的状态访问接口,按照数据的划分方式,可以分为 Keyed State 和 Operator State,在 Keyed State 中又提供了多种数据结构:

ValueStateMapStateListStateReducingStateAggregatingState

另外状态存储也支持多种方式:

MemoryStateBackend:存储在内存中FsStateBackend:存储在文件中RocksDBStateBackend:存储在 RocksDB 中

Flink 支持容错机制

Flink 中支持使用 Checkpoint 来提高程序的可靠性,开启了 Checkpoint 之后,Flink 会按照一定的时间间隔对程序的运行状态进行备份,当发生故障时,Flink 会将所有任务的状态恢复至最后一次发生 Checkpoint 中的状态,并从那里开始重新开始执行。

另外 Flink 还支持根据 Savepoint 从已停止作业的运行状态进行恢复,这种方式需要通过命令进行触发。

Flink 实现了自己的内存管理机制

Flink 在 JVM 中提供了自己的内存管理,使其独立于 Java 的默认垃圾收集器。它通过使用散列,索引,缓存和排序有效地进行内存管理。我们在后面的文章 《深入探索 Flink 内存管理机制》 会深入讲解 Flink 里面的内存管理机制。

总结

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。