2022Apache Flink 十大技术难点实战.docx
《2022Apache Flink 十大技术难点实战.docx》由会员分享,可在线阅读,更多相关《2022Apache Flink 十大技术难点实战.docx(110页珍藏版)》请在课桌文档上搜索。
1、ApacheFlink十大技术难点买战I目录102万行代码,1270个问题,Flink新版发布了什么?4从开发到生产上线,如何确定集群规划大小?11Demo:基于FIinkSQ1.构建流式应用22FlinkCheckpoint问题排查实用指南37如何分析及处理Flink反压?48FlinkonYARN():一张图轻松掌握基础架构与启动流程56FlinkonYARN(下):常见问题与排查思路64ApacheFlink与ApacheHive的集成72FlinkBatchSQ1.1.10实践83如何在PyFlink1.10中自定义PythonUDF?90107Flink1.10NativeKUber
2、neteS原理与实践102万行代码,1270个问题,Flink新版发布了什么?导读:ApacheFlink是公认的新一代开源大数据计算引擎,可以支持流处理、批处理和机器学习等多种计算形态,也是Apache软件基金会和GitHub社区最为活跃的项目之一。2019年1月,阿里巴巴实时计算团队宣布将经过双十一历练和集团内部业务打磨的Blink引擎进行开源并向ApacheFiink贡献代码,此后的一年中,阿里巴巴实时计算团队与ApacheFlink社区密切合作,持续推进FIink对Blink的整合。2月12日,ApacheFlink1.10.0正式发布,在Flink的第一个双位数版本中正式完成了Bli
3、nk向FIink的合并。在此基础之上,Flink1.10版本在生产可用性、功能、性能上都有大幅提升。本文将详细为大家介绍该版本的重大变更与新增特性。Flink1.10是迄今为止规模最大的一次版本升级,除标志着Blink的合并完成外,还实现了Flink作业的整体性能及稳定性的显著优化、对原生Kubernetes的初步集成以及对Python支持(PyFlink)的重大优化等。综述Flink1.10.0版本一共有218名贡献者,解决了1270个JIRAissue,经由2661个Comrnii总共提交了超过102万行代码,多项数据对比之前的几个版本都有所提升,印证着Flink开源社区的蓬勃发展。1.7
4、.0版本1.8.0版本1.9.0版本1.10.0版本解决的问题数量4284229771270代码提交次数969109419642661贡献者人数112140190218其中阿里巴巴实时计算团队共提交64.5万行代码,超过总代码量的60%,做出了突出的贡献。CommitsCode1.ines在该版本中,FIink对SQ1.的DD1.进行了增强,并实现了生产级别的Batch支持和Hive兼容,其中TPC-DSIOT的性能更是达到了Hive3.0的7倍之多。在内核方面,对内存管理进行了优化。在生态方面,增加了PythonUDF和原生Kubernetes集成的支持。后续章节将在这些方面分别进行详细介绍
5、。内存管理优化在旧版本的Flink中,流处理和批处理的内存配置是割裂的,并且当流式作业配置使用RocksDB存储状态数据时,很难限制其内存使用,从而在容器环境下经常出现内存超用被杀的情况。在1.10.0中,我们对TaskExecutor的内存模型,尤其是受管理内存(ManagedMemory)进行了大幅度的改进(F1.IP-49),使得内存配置对用户更加清晰:PressMemoryFBnkMemoryFramewortcHeapMemoryFrameworkOff-HeapMemoryTaskHeapMemoryTaskOff-HeapMemoryNetworkMemoryManagedMem
6、oryOn-HeapOff-HeapJVMMetaspaceJVMOverhead此外,我们还将RocksDBstatebackend使用的内存纳入了托管范畴,同时可以通过简单的配置来指定其能使用的内存上限和读写缓存比例(F1.INK-7289)o如下图所示,在实际测试当中受控前后的内存使用差别非常明显。受控前的内存使用情况(share-slot)IaftaaeUeFaMW;3j、l1MI.HMwm%小心A山山儿1nwAM0MMUMi.IMWMrUIMMVUW/MU1me”jna*vyIMWIMWBW.I2VS623Z4,Wh,-BrrwHr”扁版MMhuUMM曲WMAOW30M0*-*M*l
7、-K-wmwMetoVMteM5jFvjM4WUM(c*)m受控后的内存使用情况(share-slot)Batch兼容Hive且生产可用Flink从1.9.0版本开始支持Hive集成,但并未完全兼容。在1.10.0中我们对Hive兼容性做了进一步的增强,使其达到生产可用的标准。具体来说,FEnk1.10.0中支持: Meta兼容-支持直接读取Hivecatalog,覆盖Hive1.x2.x3.X全部版本 数据格式兼容-支持直接读取Hve表,同时也支持写成Hve表的格式;支持分区表 UDF兼容-支持在FlinkSQ1.内直接调用Ilive的UDF,UDTF和UDAF与此同时,1.10.0版本中对
8、batch执行进行了进一步的优化(F1.INK-14133),主要包括: 向量化读取ORC(F1.INK-14135) 基于比例的弹性内存分配(F1.IP-53) Shuffle的压缩(F1.INK-14845) 基于新调度框架的优化(F1.INKT4735)在此基础上将Flink作为计算引擎访问Hive的meIa和数据,在TPC-DSIOTbenchmark下性能达到Hive3.0的7倍以上。TPC-DSBenchmarkFlink7XFasterthanHiveSQ1.DD1.增强Flink1.10.0支持在SQ1.建表语句中定义watermark和计算列,以watermark为例:CRE
9、ATETAB1.Etablejame(WATERMARKFORCOlUmnNameAS)WITH()除此之外,Flink1.10.0还在SQ1.中对临时函数/永久函数以及系统/目录函数进行了明确区分,并支持创建目录函数、临时函数以及临时系统函数:CREATE(TEMPORARYTEMPORARYSYSTEMFUNCTIONIFNOTEXISTScatalog_name.db_name.function_nameASidentifier1.ANGUAGEJAVASCA1.APythonUDF支持Flink从1.9.0版本开始增加了对Python的支持(PyFlink),但用户只能使用Java开发
10、的User-defined-function(UDF),具有一定的局限性。在1.10.0中我们为PyFlink增加了原生UDF支持(F1.IP-58),用户现在可以在TableAPI/SQ1.中注册并使用自定义函数,如下图所示:,ifos.path.ex1sts(s1nk_path): ifos.path.Isf1le(s1nk-path):,os.renove(s1nk-path) else: Shutll.rtree(stnk_path) senv.setParalIeIlSla(D t-三st_env.fronelements(l.hi,.hello).(2.hi.,hello)1.Ia
11、,.b.,c) st_env.connect(F1leSysten().path(sink_path),.wlth-fornat(OldCsv() 一fielddel1n1ter(,*).field(a-.DataTypes.BIGINT(),.f1eldCb,DataTypes.STRING(),.field(c-,DataTypes.STRIMG(),.w1th_schema(Scheaa(),.fieldCa,DataTypes.BIGINT().f1eld(-b-,DataTypes.STRING(),.f1eld(c-,DataTypes1STRINGO),.re|ister_tab
12、le_sink(strean_s1nk-).,t.select(a1.b.c,).1nsert_1nto(strea_s1nk),st_env.execute(streaB_job)I同时也可以方便的通过pip安装PyFlink:pipinstallapache-flink更多详细介绍,请参考:hltRs:enjoyment.cool20200219Deep-dive-how-tc-SUPPort-Python-UDF-in-Apache-F1ink-ITO/原生Kubernetes集成Kubernetes(K8S)是目前最为流行的容器编排系统,也是目前最流行的容器化应用发布平台。在旧版本当中
13、,想要在K8S上部署和管理一个Flink集群比较复杂,需要对容器、算子及kubectl等K8S命令有所了解。在Flink1.10中,我们推出了对K8S环境的原生支持(F1.lNK-9953),Flink的资源管理器会主动和Kubernetes通信,按需申请pod,从而可以在多租户环境中以较少的资源开销启动Flink,使用起来也更加的方便。更多内容,参考1.10.0版本发布日志:htips;ci.apache.Org/projects;f!:nkink-docs-stab沦/release-notes;flinkT.IOhtml结语2019年1月,阿里巴巴实时计算团队宣布Blink开源。整整一年
14、之后,Flink1.10.0版本的发布宣告Flink和Blink的整合正式完成。我们践行着自己的诺言,开放源码,更相信社区的力量,相信社区是开源协作精神与创新的摇篮。我们也衷心希望有更多的志同道合的小伙伴加入我们,一起把APaCheFIink做的越来越好!I从开发到生产上线,如何确定集群规划大小?在Flink社区中,最常被问到的问题之一是:在从开发到生产上线的过程中如何确定集群的大小。这个问题的标准答案显然是“视情况而定”,但这并非一个有用的答案。本文概述了一系列的相关问题,通过回答这些问题,或许你能得出一些数字作为指导和参考。计算并建立一个基线第一步是仔细考虑应用程序的运维指标,以达到所需资
15、源的基线。需要考虑的关键指标是: 每秒记录数和每条记录的大小 已有的不同键(key)的数量和每个键对应的状态大小 状态更新的次数和状态后端的访问模式最后,一个更实际的问题是与客户之间围绕停机时间、延迟和最大吞吐量的服务级别协议(sla),因为这些直接影响容量规划。接下来,根据预算,看看有什么可用的资源。例如: 网络容量,同时把使用网络的外部服务也纳入考虑,如Kafka、HDFS等。 磁盘带宽,如果您依赖于基于磁盘的状态后端,如RocksDB(并考虑其他磁盘使用,如Kafka或HDFS) 可用的机器数量、CPU和内存基于所有这些因素,现在可以为正常运行构建一个基线,外加一个资源缓冲量用于恢复追赶
16、或处理负载尖峰。建议您在建立基线时也考虑检查点期间(checkpoim-ing)使用的资源情况。示例:数据说明当前在假设的集群上计划作业部署,将建立资源使用基线的过程可视化。这些数字是粗略的值,它们并不全面在文章的最后将进一步说明在进行计算过程中遗漏的部分。Flink流计算作业和硬件示例Flink流计算作业拓扑示例在本案例中,我将部署一个典型的Flmk流处理作业,该作业使用Fiink的Kafka数据消费者从Kafka消息源中读取数据。然后使用带键的总计窗口运穿符(windowoperator)进行转换运算。窗口运算符在时间窗口5分钟执行聚合。由于总是有新的数据,故符把窗口配置为1分钟的滑动窗口
17、(slidingwindow)o这意味着将在每分钟更新过去5分钟的聚合量。流计算作业为每个用户id创建一个合计量。从Kafka消息源消费的每条消息大小(平均)为2kbo假设吞吐量为每秒100万条消息。要了解窗口运算符(WindOWOPerator)的状态大小,需要知道不同键的数目。在本例中,键(keys)是用户id的数量,即500000000个不同的用户。对于每个用户,需要计算四个数字,存储为长整形(8字节)。总结一下工作的关键指标: 消息大小:2KB 吞吐量:100OOOomSg/秒 不同键数量:500000000(窗1.l聚合:每个键4个长整形) Checkpointing:每分钟一次。H
18、ardware:5machines10gigabitEthernet,EachmachinerunningaFIinkTaskManager,DisksareattachedviathenetworkKafkaisseparate假定的硬件设置如上图所示,共有五台机器在运行作业,每台机器运行一个Flink任务管理器(Flink的工作节点)。磁盘是通过网络相互连接的(这在云设置中很常见),从主交换机到运行TaskManager的每台计算机都由一个10千兆位以太网连接。Kafka缓存f三(brokers)在不同的机器上分开运行。每台机器有16个CPU核。为了简化处理,不考虑CPU和内存需求。但实际
19、情况中,根据应用程序逻辑和正在使用的状态后端,我们需要注意内存。这个例子使用了一个基于R。CkSDB的状态后端,它稳定并且内存需求很低。从单独的一台机器的视角要了解整个作业部署的资源需求,最容易的方法是先关注一台计算机和一个TaskManager中的操作。然后,可以使用一台计算机的数字来计算总体资源需求量。默认情况下(如果所有运算符具有相同的并行度并且没有特殊的调度限制),流作业的所有运算符都在每一台计算机上运行。在这种情况下,Kafka源(或消息消费者)、窗口运算符和Kafka发送端(或消息生产者)都在这五台机器上运行。TaskManagernKafkaSourcekeyBywindowKa
20、fkaSink机器视角图-TaskManagcrn从上图来看,keyBy是一个单独运算符,因此计算资源需求更容易。实际上,keyBy是一个API构造,并转换为Kafkasource和窗口运算符(WindoWoperator)之间连接的配置属性。以下将自上而下地分析(上图)这些运算符,了解他们的网络资源需求。TheKafkasource要计算单个Karka源(SOUrCe)接收的数据量,我们首先计算Kafka的合计输入。这些source每秒接收1000000条消息,每条消息大小为2KBo2KBX1,000,000/s=2GB/s将2GB/s除以机器数(5)得到以下结果:2GB/s5台机器=400
21、MB/s群集中运行的5个Kafka源中的每一个都接收平均吞吐量为400MB/s的数据结果。10GigebitEthernet(FullDuplex)In:1250MB/sKaftea:400MB/s2KB*1f000f000=2GBs2GBs/5machines400MB/s10GgbitEthernet(FullDuplex)Out:1250MB/sKafkasource的计算过程TheShuffle/keyBy接下来,需要确保具有相同键(在本例中为用户id)的所有事件都在同一台计算机上结束。正在读取的Kafka消息源的数据(在Kafka中)可能会根据不同的分区方案进行分区。Shuffle过
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022Apache Flink 十大技术难点实战 2022 Apache 技术 难点 实战
链接地址:https://www.desk33.com/p-1421964.html