算法 自动采集列表( flinkflinksql实践遇到的典型问题以及云顶集团官方网站入口的解决方案2.实时计算平台建设过程中的思考) -云顶集团官方网站入口

云顶集团官方网站入口-yd222云顶线路检测中心 发布时间: 2022-02-02 03:10

  算法 自动云顶集团官方网站入口-yd222云顶线路检测中心列表(

flinkflinksql实践遇到的典型问题以及云顶集团官方网站入口的解决方案2.实时计算平台建设过程中的思考)

  文/张颖

  概括

  flink 在 homework 实时计算的演进中发挥了重要作用。尤其是在 flinksql 的帮助下,实时任务的开发效率得到了极大的提升。

  本文文章主要分享flinksql在作业帮助中的使用和实践经验,以及随着任务规模的增加,从0到1搭建实时计算平台过程中遇到的问题和解决方法.

  一、发展历程

  homework help主要利用人工智能、大数据等技术为学生提供更高效的学习云顶集团官方网站入口的解决方案。因此,业务数据主要包括学生的出勤率和知识点的掌握情况。在整体架构中,无论是binlog还是普通日志,都是在采集之后写入kafka,分别通过实时和离线计算写入存储层。基于olap,对外提供相应的产品化服务,如工作台、bi分析等。工具。

  目前 homework help 的实时计算主要基于 flink,开发过程分为三个阶段:

  1. 2019 年实时计算包括少量 sparkstreaming 作业,提供给导师和讲师。在解决实时性需求的过程中,会发现开发效率很低,数据几乎无法复用。

  2. 之后,正常的做法是在生产实践中逐步应用flink jar,积累经验后开始搭建平台和应用flink sql。但是在过去的20年里,业务对实时计算提出了很多要求,而我们开发的人力储备不足。当时,在 flink sql 1.9 发布后不久,sql 功能发生了很大变化,所以我们的做法是直接将 flink sql 应用到实时数仓方向。目前整个实时数仓90%以上的任务都是使用flink sql实现的。

  3. 到 2020 年 11 月,flink 的 job 数量迅速增加到数百个,我们开始构建从 0 到 1 的实时计算平台,已经支撑了公司所有的重要业务线,计算是部署在多个云中。在一个集群上。

  介绍以下两个方面:

  1. flinksql 实践中遇到的典型问题及云顶集团官方网站入口的解决方案

  2. 实时计算平台建设的几点思考

  二、flink sql 应用实践

  下面是基于 flink sql 的完整数据流架构:

  binlog/log 采集 写入 kafka 后,topic 会自动注册为元数据表,这是后续所有实时 sql 作业的起点。用户可以在 sql 作业中使用此表,而无需定义复杂的 ddl。

  同时,在考虑实际应用时,还需要根据元数据表添加或替换表属性:

  1. 新增:元数据记录表级属性,但 sql 作业可能需要添加任务级属性。例如,对于kafka源表,添加作业的group.id来记录偏移量。

  2. 替换:离线测试时,在引用元数据表的基础上,只需要定义broker topic等属性覆盖源表,即可快速构建离线测试表。

  框架还需要支持用户的sql作业,方便输出指标和日志,实现全链路监控和跟踪。

  这里主要介绍sql添加trace函数时的dag优化实践,以及我们对table底层物理存储的选择和封装。

  2.1. sql 增加 trace 功能

  sql可以提高开发效率,但是业务逻辑的复杂度还是有的,复杂的业务逻辑写的dml会很长。在这种情况下,建议使用视图来提高可读性。因为视图的 sql 比较短,所以不应该像代码规范中的单个函数那样太长。

  下图左侧是一个示例任务的部分dag,可以看到有很多sql节点。这种情况下很难定位,因为如果是datastream api实现的代码,也可以加日志。但是 sql 做不到。用户可以干预的入口很少,只能看到整个作业的输入输出。

  类似于在函数中打印日志,我们希望支持在视图中添加 trace,以方便案例追踪。

  但是我在尝试将 trace 添加到 sql 时遇到了一些问题,这是一个简化的示例:

  右上角的sql创建source_table为源表,prepare_data视图读取表,在sql中调用foo udf,然后使用statementset分别插入两个下游,同时将视图转换为datastream调用 tracesdk 写入跟踪系统。

  注意:我们当时是基于 1.9 开发的。为了清楚起见,我们还使用了一些后来添加的功能。

  上图下方的实际 dag 看起来并不像预期的那样:

  1. dag分为上下不相关的两部分。kafka源表是datasource部分,读取两次。

  2. foo 方法被调用了 3 次。

  数据源压力和计算性能需要优化。

  为了解决这个问题,我们需要从几个角度进行优化。这里主要介绍dag合并的思想。无论是table还是stream的env,都会产生相应的transformation。我们的做法是统一合并到stream env中,这样就可以在stream env中得到一个完整的变换列表,然后生成streamgraph提交。

  左下角是我们优化的 dag,读取源表并只调用一次 foo 方法:

  优化后的 dag 效果与我们写 sql 时的逻辑图非常相似,性能自然符合预期。

  回到问题本身,业务可以简单的使用一条语句给视图的某些字段添加trace,例如:prepare_data.trace.fields=f0,f1. 由于sql中自然收录字段名,所以trace数据可读性甚至高于普通日志。

  2.2. 表选择与设计

  如前所述,我们的首要要求是提高人的效率。因此,table 需要具备更好的分层和复用能力,并且支持模板化开发,以便 n 个端到端的 flink 作业能够快速串联起来。

  我们的云顶集团官方网站入口的解决方案是基于 redis 实现的,它首先有几个优点:

  1. 高qps,低延迟:这应该是所有实时计算的关注点。

  2. ttl:用户无需关心数据如何退出该字段,只需给一个合理的ttl即可。

  3. 通过使用protobuf等高性能紧凑的序列化方式,并使用ttl,整体存储小于200g,redis的内存压力可以接受。

  4. 适配计算模型:为了保证计算本身的时序,会进行keyby操作,同时需要处理的数据会被shuffle到同一个并发,所以它不会过多依赖存储来考虑锁的优化。

  接下来,我们的场景主要是解决多索引和触发消息的问题。

  上图显示了一个表格示例,显示学生是否出现在某个章节中:

  1. 多索引:数据首先以字符串形式存储,比如key=(uid, course_id), value=serialize(is_attend, ...),这样我们就可以在sql中join on uid and course_id . 如果 join on 其他字段,比如 course_id 怎么办?我们的做法是同时写一个以lesson_id为key的集合,集合中的元素是对应的(uid,lesson_id)。接下来在找lesson_id = 123的时候,先取出集合下的所有元素,然后通过管道找到所有的value并返回。

  2. 触发消息:写入redis后,会同时向kafka写入一条更新消息。在 redis connector 的实现中,保证了两个存储之间的一致性、顺序性和不丢失数据。

  这些功能都封装在 redis connector 中,业务可以通过 ddl 简单定义这样的 table。

  ddl 中的几个重要属性:

  1. primary 定义了主键,对应字符串数据结构,比如例子中的uid course_id。

  2. index.fields 定义了辅助搜索的索引字段,例如示例中的课程id;也可以定义多个索引。

  3. poster.kafka 定义了接收触发消息的kafka 表。该表也在元数据中定义,用户可以直接读取该表,而无需在后续的 sql 作业中定义。

  因此,整个开发模式复用性高,用户可以轻松开发端到端的n个sql作业,而无需担心如何追溯案例。

  三、 平台搭建

  上述数据流架构搭建完成后,2020.11实时作业数量迅速增加到几百个,比2019年快很多。这个时候我们开始搭建实时计算平台从0到1,然后分享了搭建过程中的一些想法。

  平台支持的功能主要有三个起点:

  1. 统一:统一不同云厂商的不同集群环境、flink版本、提交方式等;之前hadoop客户端分散在用户的提交机器上,对集群数据和任务安全存在隐患。升级和迁移成本。我们希望通过平台统一任务的提交入口和提交方式。

  2.易用性:平台交互可以提供更易用的功能,如调试、语义检测等,可以提高任务测试的人为效率,并记录任务的版本历史,支持方便在线和回滚操作。

  3. 规范:权限控制、流程审批等,类似于在线服务的在线流程,通过平台可以规范实时任务的研发流程。

  3.1.规范——实时任务进程管理

  flinksql 让开发变得非常简单和高效,但是越简单越难标准化,因为可能写一段 sql 只需要两个小时,但通过规范却需要半天时间。

  但是,该规范仍然需要执行。一些问题类似于在线服务,在实时计算中也遇到过:

  1. 记不清了:任务上线一年了,最初的需求可能是口耳相传。最好记住wiki或email,但在任务交接时很容易记不清。

  2. 不规则:udf或datastream代码,均不符合规范,可读性差。结果,后来接手的学生无法升级,也不敢改变,无法长期维持。还应该有一个关于如何编写包括实时任务在内的 sql 的规范。

  3. 找不到:线上运行的任务依赖一个jar,哪个git模块对应哪个commitid,有问题怎么第一时间找到对应的代码实现。

  4.盲改:一直正常的任务,周末突然报警,原因是私下修改了线上任务的sql。

  规范主要分为三个部分:

  1. 开发:rd 可以从 udf 原型项目中快速创建 udf 模块,该项目基于 flink 快速入门。创建的 udf 模块可以正常编译,包括 wordcount 之类的 udf 示例,以及 readme 和 versionhelper 等默认的 helper 方法。根据业务需求修改后,通过cr上传到git。

  2. 需求管理与编译:提交的代码将与需求卡片相关联。集群编译和qa测试后,即可下单上线。

  3. 在线:根据模块和编译输出选择更新/创建哪些作业,并在作业所有者或领导批准后重新部署。

  整个研发过程不能离线修改,比如更改jar包或者对哪个任务生效。一个实时任务,即使跑了几年,也能查到谁在线,谁批准了当前任务,当时的测试记录,对应的git代码,以及提出的实时指标要求谁开始的。任务维持很长时间。

  3.2 易用性监控

  我们当前的 flink 作业在 yarn 上运行。作业启动后,预计 prometheus 会抓取 yarn 分配的 container,然后连接到报警系统。用户可以根据告警系统配置kafka延迟告警和checkpoint故障告警。构建此路径时遇到两个主要问题:

  1. prometheusreporter启动httpserver后,prometheus如何动态感知;它还需要能够控制度量的大小以避免采集大量无用数据。

  2. 我们sql的源表基本都是kafka。相比第三方工具,在计算平台上配置kafka延迟告警更方便。因为自然可以得到任务读取的topic和group.id,所以也可以和任务失败使用同一个告警组。结合告警模板,配置告警非常简单。

  关于云顶集团官方网站入口的解决方案:

  1. 添加了基于官方 prometheusreporter 的发现功能。container 的 httpserver 启动后,对应的 ip:port 以临时节点的形式注册到 zk 上,然后使用 prometheus 的 discover 目标来监控 zk 节点的变化。由于是临时节点,当 container 被销毁时,该节点就消失了,prometheus 也能感应到它不再被抓取。这样一来,就很容易为普罗米修斯搭建一条抢夺的路径。

  2. kafkaconsumer.records-lag 是一个比较实用和重要的延迟指标,主要做了两个任务。修改 kafkaconnector 并在 kafkaconsumer.poll 之后将其公开,以确保 records-lag 指示器可见。另外,在做这个的过程中,我们发现不同kafka版本的metric格式是不同的()。我们的方法是将它们扁平化为一种格式,并将它们注册到 flink 的指标中。这样不同版本暴露的指标是一致的。

  四、总结与展望

  上一阶段使用 flink sql 来支持实时作业的快速开发,搭建了实时计算平台来支持数千个 flink 作业。

  更大的见解之一是 sql 确实简化了开发,但它也阻止了更多的技术细节。对实时作业运维工具的要求,比如 trace,或者任务的规范没有改变,对这些的要求更加严格。

  因为在细节被屏蔽的同时,一旦出现问题,用户不知道如何处理。就像冰山一角,漏水越少,下沉越多,越需要做好周边系统的建设。

  二是适应现状。一是能尽快满足当前的需求。比如,我们正在提高人的效率,降低发展门槛。同时还要继续探索更多的业务场景,比如用hbase和rpc服务代替redis connector。现在的好处是修改了底层存储,用户对sql作业的感知很小,因为sql作业基本都是业务逻辑,ddl定义了元数据。

  接下来的计划主要分为三个部分:

  1. 支持资源弹性伸缩,平衡实时作业的成本和时效性。

  2. 我们从 1.9 开始*敏*感*词*应用 flink sql。现在版本升级发生了很大的变化,我们需要考虑如何让业务能够低成本的升级和使用新版本中的特性。

  3. 探索流批集成在实际业务场景中的实现。

  关于作者

  张颖,2019年加入乔邦大数据中台研发部,负责实时计算相关工作。

       优采云采集器是一个根据用户提供的关键词,云端自动采集相关文章并发布到用户网站的网站采集器。它能够自动识别各种网页上的标题、正文等信息,不需要用户编写任何采集规则就可以实现全网采集。采集到内容后,会自动计算内容与所设定的关键词的相关度,只把相关的文章推送给用户。支持标题前缀、关键词自动加粗、插入固定链接、自动提取tag标签、自动内链、自动配图、自动伪原创、内容过滤和替换、电话号码和网址清理、定时采集、百度主动提交等一系列seo功能。用户只需设置好关键词和相关需求,就能实现全托管、零维护的网站内容更新。不限网站数量,不管是单个网站还是大批量站群,都可以非常方便的进行管理。

2022-02-02

0 个评论

要回复文章请先登录注册

云顶集团官方网站入口
官方客服qq群


线

网站地图