为什么PyFlink?
pyflink顾名思义,Pythoh 生态与大数据生态有密不可分的关系,调查发现大多数 Python 用户正在解决 ”数据分析“,”机器学习“的问题,那么 Python 生态和大数据生态结合,对 Python 生态一个特别重要到意义就是单机到分布式的能力增强,这是大数据时代海量数据分析对 Python 生态的强需求。
PyFlink 的核心目标
- 将 Flink 能力输出到 Python 用户,进而可以让 Python 用户使用所有的 Flink 能力。
- 将 Python 生态现有的分析计算功能运行到 Flink 上,进而增强 Python 生态对大数据问题的解决能力。
PyFlink 该如何落地?
为追求以最小的代价的原则,Python API 被设计为置于High-level 的 TableAPI/SQL 和有状态的 DataStream API之上的。pyflink复用现有的java计算引擎,故后续通过对比了Beam和Py4J性能后,选择Py4J作为 Java VM 和 Python VM 之间通讯的桥梁解决了两者的通讯问题,在 PythonVM 启动一个 Gateway,并且 Java VM 启动一个 Gateway Server 用于接受 Python 的请求,同时在 Python API 里面提供和 Java API 一样的对象,比如 TableENV, Table,等等。这样 Python 在写 Python API 的时候本质是在调用 Java API。
Flink 功能向 Python 用户的输出解决了,反过来如何将 Python 生态功能引入 Flink 中,进而将 Python 功能分布式化?
两种方法:
1、选择有代表性的 Python 类库,将其 API 增加到 PyFlink 中,这种方式是一个漫长的过程,因为 Python 的生态库太多了。pass
2、用户自定义函数(UDF): 集成 Python 生态( Python 类库)到 Flink 中,以集成 Apache Beam 的 Portability Framework 的方式获取高效稳定的 Python UDF 的支持。对 UDF ( User-defined-Funciton)的支持上,需要添加 UDF 注册的 API , register_function,但仅仅是注册还不够,用户在自定义 Python UDF 的时候往往会依赖一些三方库,所以我们还需要增加添加依赖的方法,那就是一系列的 add 方法,比如 add_Python_file()。在编写 Python 作业的同时, Java API 也会同时被调用在提交作业之前,Java 端会构建JobGraph。然后通过 CLI 等多种方式将作业提交到集群进行运行。
PyFlink 适用的场景
- 第一个,事件驱动型,比如:刷单,监控等;
- 第二个,数据分析型的,比如:库存,双11大屏等;
- 第三个适用的场景是数据管道,也就是ETL场景,比如一些日志的解析等;
- 第四个场景,机器学习,比如个性推荐等。
案例:PyFlink 案例-阿里云 CDN 实时日志分析
CDN 日志的解析一般有一个通用的架构模式,就是首先要将各个边缘节点的日志数据进行采集,一般会采集到消息队列,然后将消息队列和实时计算集群进行集成进行实时的日志分析,最后将分析的结果写到存储系统里面。案例将架构实例化,消息队列采用 Kafka,实时计算采用Flink,最终将数据存储到 MySQL 中。
1、核心依赖的导入,然后是我们需要创建ENV,并设置采用的 planner(目前Flink支持Flink和blink两套 planner)建议大家采用 blink planner。
2、采用named function 的方式定义一个 ip_to_province() 的UDF,目的是根据 client_ip 来查询对应的地区, UDF所依赖的其他文件也可以在API里面进行制定,这样在job提交时候会一起提交到集群。
3、通用的作业结构,需要定义 Source connector 来读取 Kafka 数据,定义 Sink connector 来将计算结果存储到 MySQL。( PyFlink 支持 SQL DDL 的编写)
4、描述的 kafka 和 mysql 的 ddl 进行表的注册
5、核心统计逻辑编写:
任务综述:首先从数据源读取数据,然后需要先将 clien_ip 利用定义的 ip_to_province(ip) 转换为具体的地区。之后,在进行按地区分组,统计访问量,下载量和资源下载速度。最后将统计结果存储到结果表中。这个统计逻辑中,我们不仅使用了Python UDF,而且还使用了 Flink 内置的 Java AGG 函数,sum 和 count。
6、最后调用 executre 提交作业