欢迎来 kk大数据,今天分享的是 Flink 提供了哪些编程接口可以给我们开发。

一、数据集类型

现实世界中,所有的数据都是以流式的形态产生的,不管是哪里产生的数据,在产生的过程中都是一条条地生成,最后经过了存储和转换处理,形成了各种类型的数据集。

根据现实世界中,数据产生方式和数据产生是否含有边界(具有起始点和终止点)角度,将数据分为两种类型的数据集,一种是有界数据集,另外一种是无界数据集。

(1)有界数据集

有界数据具有时间边界,在处理过程中数据一定会在某个时间范围内起始和结束,有可能是一分钟,也有可能是一天内的交易数据。

对有界数据集的数据处理方式被称为批计算,例如将数据从 RDBMS 或文件系统中读取出来,然后在分布式系统内处理,最后再将处理结果写入存储介质中,整个过程就被称为批处理。

(2)无界数据集

数据从开始生成就一直持续不断地产生新的数据,因此数据是没有边界的,例如服务器的日志,传感器信号等。

和批量数据处理方式对应,对无界数据集的处理方式被称为流式处理(Stream Process)。

可以看出,流式数据处理过程实现复杂度会更高,因为需要考虑处理过程中数据的顺序错乱,以及系统容错方面的问题。

(3)统一数据处理

有界数据集和无界数据集只是一个相对的概念,主要根据时间的范围而定,可以认为一段时间内的无界数据集其实就是有界数据集,同时有界数据也可以通过一些方法转换成无界数据集。

例如系统一年的订单交易系统,其本质上应该是有界的数据集,可是当我们把它一条一条按照产生的顺序发送到流式系统,通过流式系统对数据进行处理,在这种情况下可以认为数据是相对无界的。

对于无界数据也可以拆分成有界数据进行处理,例如将系统产生的数据接入到存储系统,按照年或月进行切割,切分成不同时间长度的有界数据集,然后就可以通过批处理方式对数据进行处理。

从以上,我们可以得出一个结论:有界数据和无界数据其实是可以相互转换的。

目前业界比较熟知的开源大数据处理框架中,能够同时支持流式计算和批量计算,比较典型的代表为 Apache Spark 和 Apacke Flink 两套框架。

Spark 是通过批处理模式来统一处理不同类型的数据集,对于流数据是将数据按照批次切分成微批(有界数据集)来进行处理。

Flink 用比较符合数据产生的规律方式处理流式数据,对于有界数据可以转换成无界数据统一处理,最终将批处理和流处理统一在一套流式引擎中。

说完了数据集类型之后,我们来看看 Flink 提供了哪些编程接口来处理数据。

二、Flink 编程接口

Flink 根据数据集类型的不同将核心数据处理接口分为两大类,一类是 批计算接口 DataSet API,一类是支持流式计算的接口 DataStream API。

同时 Flink 将数据处理接口抽象成四层,由上而下分别为 SQL API,Table API,DataStream/DataSet API,以及 StateFul Stream Processing API

(1)Flink SQL

Flink 提供了统一的 SQL API 完成对批计算和流计算的处理,SQL语言具有比较低的学习成本,能够让数据分析人员和开发人员快速的上手

(2)Table API

Table API 将内存中的 DataStream 和 DataSet 数据集在原有的基础之上增加 Schema 信息,将数据类型统一抽象成表结构,然后通过 Table API 提供的接口处理对应的数据集。

SQL API 可以直接查询 Table API 中注册表中的数据表。

Table API 构建在 DataStream 和 DataSet 之上的同时,提供了大量面向领域语言的编程接口,例如 GroupByKey,Join 等操作符,提供给用户一种更加友好的处理数据集的方式。

同时 Table API 在转换为DataStream 和 DataSet 的数据处理过程中,也应用了大量的优化规则对处理逻辑进行了优化。

(3)DataStream API 和 DataSet API

DataStream API 处理流式数据,DataSet API 处理批量数据,用户 可以使用 map,filter,join,aggregation,window 等方法,同时每种接口都支持了 Java、Scala 及 Python 多种语言

(4)Stateful Stream Process API

这个 Api 是Flink 中处理 Stateful Stream 最底层的接口,用户可以通过这个 api 接口操作状态、时间等底层数据。

使用 Stateful Stream Process API 接口开发应用灵活性非常强,可以实现非常复杂的流式计算逻辑,但是相对用户使用成本也比较高,一般企业使用Flink 进行二次开发或深度封装的时候会用到这层接口。

最新文章

  1. 多对多关系<EntityFramework6.0>
  2. windows服务(installutil.exe)报错。异常来自 HRESULT:0x80131515
  3. requirejs+cdn
  4. path和classpath
  5. Go学习记录
  6. 获取本地ip地址
  7. C# 6和 VB 12的最新特性列表
  8. react 学习之十月之思
  9. 提交App Store注意事项1
  10. 华为oj 统计字符串不同字符
  11. BaseActivity的定义——作为所有Activity类的父类
  12. WPF动态改变主题颜色
  13. winform实现矩形框截图
  14. android的drawable资源
  15. OpenStack云平台网络模式及其工作机制
  16. Error: Default interface methods are only supported starting with Android N (--min-api 24): java.io.InputStream org.apache.poi.sl.usermodel.ObjectShape.readObjectData()
  17. 《生命》第五集:Birds (鸟类)
  18. java SSM 解决跨域问题
  19. UI自动化(三)css优先级
  20. ubuntu16.04安装nvidia ,cuda(待完善)

热门文章

  1. 【资源共享】eBook分享大集合
  2. Ubuntu18设置mysql的sql_mode
  3. [ PyQt入门教程 ] PyQt+socket实现远程操作服务器
  4. VSCode 远程开发(带免密)
  5. [程序人生]那些IT界“活久见”的奇葩现象
  6. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
  7. java多线程理解及实现
  8. 搭建SFTP服务器,允许一个或多个用户拥有一个或多个目录的rwx权限
  9. Hive on Tez 中 Map 任务的数量计算
  10. Java多线程之Runnable与Thread