热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

docker版京东薅羊毛脚本(分布式系统面试题)

本文整理自京东高级技术专家怕孤独的滑板在FlinkForwardAsia2020分享的议题《ApacheFlink在京东的实践与优化》,内容包括:1.业务演进和规模2.容器


本文将整理京东高级技术专家害怕孤独的滑板在Flink Forward Asia 2020上分享的议题《Apache Flink 在京东的实践与优化》。 内容如下。


1 .业务发展和规模


2 .容器化的实践


3 .改进3.Flink的优化


4 .未来计划


一、业务演进和规模 1.业务发展


京东在2014年基于storm搭建了第一代流媒体平台,能够很好地满足业务对数据处理实时性的要求。 但是,在数据量非常大但对延迟并不敏感的业务场景中,存在一些限制。 于是,2017年引入了Spark streaming,利用其微批处理来应对这样的商业场景。


随着业务的发展和业务规模的扩大,迫切需要兼具低延迟和高吞吐量,同时支持窗口计算、状态和最佳时间意义的计算引擎。


于是,2018年,我们引进了Flink,同时基于K8s开始了实时计算容器化的升级改造; 到了2019年,我们所有的实时计算任务都在K8s上运行。 同年,我们基于Flink 1.8构建了新的SQL平台,便利了业务开发的实时计算APP应用; 到了2020年,基于Flink和K8s构建的新的实时计算平台得到了充实。 我们统一了计算引擎,同时支持智能诊断,降低了用户研发和运维APP的成本和难度。 以前,流处理是我们关注的重点。 同年,我们也开始支持批处理,整个实时计算平台开始向批处理流一体化的方向发展。


2 .业务场景


京东Flink在京东内部非常多的业务线提供服务,主要应用场景有实时数仓、实时大屏幕、实时推荐、实时报告、实时风控和实时监控,当然还有其他几个应用场景无论如何,实时计算的业务需求一般由Flink开发。




3 .业务规模


目前,我们的K8s集群由5000多台机器组成,服务于京东内部20多个一级部门。 目前,在线流量计算任务数为3000多项,流量计算处理高峰期达到每秒5亿件。




二、容器化实践接下来分享容器化的实践。


2017年,京东内部大部分任务还是storm任务,它们都在物理机上跑,同时也有部分Spark streaming在Yarn上跑。 由于不同的运营环境导致部署和运输成本特别高,在资源利用上存在一定的浪费,因此解决这一问题迫切需要集成的集群资源管理和调度系统。


经过一系列的尝试、比较、优化,我们选择了K8s。 这不仅解决了运维的引入、资源利用的几个问题,还具有云原生灵活性的自我恢复、天然容器的完全隔离、更容易扩展的迁移等优点。 于是,2018年初,开始了容器化的升级改造。


在2018年的6.18中,我们只跑了任务的20%的K8s; 2019年2月,实现实时计算的所有任务都在K8s上运行。 容器化的实时计算平台经历了6.18,双11经历了多次巨大的促进,承担着bhdpw的压力,运行非常稳定。


但是,我们过去的Flink集装箱化方案是基于资源预分配的静态方式,不能满足很多业务场景。 因此,2020年也进行了集装箱化方案的升级。 后面会详细叙述。




容器化可以带来非常多的利益,这里主要强调三点。


第一,可以方便地实现服务器的混合部署,大幅提高资源共享能力,节约机器资源。 第二,天然的弹性扩张,一定的自我治愈能力,以及它可以实现更完全的资源隔离,更好地保障业务的稳定性。 第三,通过集装箱化实现了开发、测试、生产的一致环境,同时提高了运维的部署和自动化能力,使管理和运维的成本降低了一半。 我们过去的集装箱化方案基于k8s部署引入的标准会话集群。 用户在平台上创建集群时,需要事先

预估出集群所需资源,比如需要的 jobmanager 和 taskmanager 的资源规格和个数,然后平台通过 K8s 客户端向 K8s master 发出请求,来创建 jobmanager 的 deployment 和 taskmanager 的 deployment。

其中,整个集群的高可用是基于 ZK 实现;状态存储主要是存在 HDFS,有小部分存在 OSS;监控指标 (容器指标、JVM 指标、任务指标) 上报到 Prometheus,结合 Grafana 实现指标的直观展示;日志是基于我们京东内部的 Logbook 系统进行采集、存储和查询。

在实践中发现,这个方案有两点不足:

第一,资源需要提前分配,无法满足灵活多变的业务需要,无法做到按需分配。第二,极端场景下 Pod 不能正常拉起, 影响任务恢复 。

于是我们进行了一个容器化方案的升级,实现了基于 K8s 的动态的资源分配方式。在集群创建的时候,首先我们会根据用户指定的 job manager 的数量创建 jobmanager 的 deployment;用户在提交任务的时候,我们会根据任务所需要的资源数,动态的向平台申请资源,创建 taskmanager。

在运行过程中,如果发现这个任务需要扩容,job manager 会和平台交互,进行动态扩容;而在发现资源浪费时,会进行缩容。通过这样一个方式可以很好的解决静态预分配带来的问题,并提高了资源利用率。

此处,通过平台与 K8s 交互进行资源的创建&销毁,主要基于 4 点考虑:

保证了计算平台对资源的监管。避免了平台集群配置 & 逻辑变化对镜像的影响。屏蔽了不同容器平台的差异。平台原有 K8s 交互相关代码复用。

另外,为了兼容原有 Slot 分配策略 (按 slot 分散),在提交任务时会预估出任务所需资源并一次性申请,同时按照一定的策略进行等待。等到有足够的资源,能满足任务运行的需求时,再进行 slot 的分配。这样很大程度上可以兼容原有的 slot 分散分配策略。

三、Flink 优化改进

下面介绍一下 Flink 的优化改进。

1、预览拓扑

在业务使用平台的过程中,我们发现有几个业务痛点:

第一,任务调优繁琐。在平台提交任务、运行之后如果要调整任务并行度、Slot 分组、Chaining 策略等,需要重新修改程序,或者通过命令行参数配置的方式进行调优,这是非常繁琐的。第二,SQL 任务无法灵活指定算子配置。第三,任务提交到集群之后,到底需要多少资源,任务所需 Slot 数预先不清楚。第四,并行度调整后网络 buffer 不足。

为了解决这些问题,我们开发了预览拓扑的功能:

第一,拓扑配置。用户提交任务到平台之后,我们会把拓扑给预览出来,允许它灵活的配置这些算子的并行度。第二,槽位分组预览。我们会清晰的显示出任务的槽位分组情况和需要多少个槽。第三,网络 Buffer 预估。这样可以最大限度的方便用户在平台进行业务的调整和调优。

下面简单介绍预览拓扑的工作流程。用户在平台提交 SQL 作业或 Jar 作业,这个作业提交之后,会生成一个算子的配置信息,再反馈到我们平台。我们平台会把整个拓扑图预览出来,然后用户就可以在线进行算子配置信息的调整。调整完之后,把调整完的配置信息重新提交到我们平台。并且,这个过程可以是连续调整的,用户调整完觉得 ok 了就可以提交任务。提交任务之后,整个在线调整的参数就生效了。

这里任务可以多次提交,如何保证前后两次提交生成算子稳定的对应关系呢?我们采用这样一个策略:如果你指定了 uidHash 或者 uid,我们就可以拿 uidHash 和 uid 作为这样一个对应关系的 Key。如果没有,我们会遍历整个拓扑图,按照广度优先的顺序,根据算子在拓扑图中的位置生成确定的唯一的 ID。拿到唯一的 ID 之后,就可以得到一个确定的关系了。

2、背压量化

下面介绍一下我们的第二个改进,背压量化。目前观测背压有两种方式:

第一种方式是通过 Flink UI 的背压面板,可以非常直观的查看当前的背压情况。但是它也有些问题:第一,有的场景下采集不到背压。第二,无法跟踪历史背压情况。第三,背压影响不直观。第四,在大并行度的时候背压采集会有一定的压力。另外一种观测背压的方式是基于 Flink Task Metrics 指标。比如说,它会上报 inPoolUsage、outPoolUsage 这些指标,然后把它采集到 Prometheus 进行一个查询,这种方式可以解决背压历史跟踪的问题。不过它有其他一些问题:第一,不同 Flink 版本的背压指标含义有一定差异。第二,分析背压有一定门槛,你需要对整个背压相关的指标有比较深的认识,联合进行分析。第三,背压的影响不是那么直观,很难衡量它对业务的影响。

针对这个问题,我们的解决方案是采集背压发生的位置、时间和次数指标,然后上报上去。将量化的背压监控指标与运行时拓扑结合起来,就可以很直观的看到背压产生的影响 (影响任务的位置、时长和次数)。

3、文件系统支持多配置

下面介绍下文件系统支持多配置的功能。

目前在 Flink 中使用文件系统时,会使用 FileSystem.get 传入 URI,FileSystem 会将 shceme+authority 作为 key 去查找缓存的文件系统,如果不存在,根据 scheme 查找到 FileSystemFactory 调用 create 创建文件系统,返回之后就可以对文件进行操作了。不过,在平台实践过程中,经常会遇到这样的问题:

第一, 如何把 checkpoint 写入公共 HDFS,把业务数据写入另外的 HDFS?比如在平台统一管理状态,用户不关注状态的存储,只关注自己业务数据读写 HDFS 这样的场景,会有这样的需求。怎么满足这样的一个业务场景呢?一个方案是可以把多个 HDFS 集群的配置进行融合,但是它会有个问题。就是如果多个 HDFS 集群配置有冲突的话,合并会带来一定的问题。另外,可以考虑一些联邦的机制,比如 ViewFs,但这种机制可能又有点重。是否有其它更好的方案呢?第二, 如何将数据从一个 OSS 存储读出、处理后写到另外一个 OSS 存储?

这两个问题都涉及到如何让 Flink 的同一个文件系统支持多套配置。我们的解决方案是通过使用不同的scheme指定和隔离不同的配置。以 HDFS 支持多配置为例,如下图所示:

第一步,在配置中设置自定义 scheme (aaHDFS) 的绑定的 scheme (HDFS) 及对应 HDFS 配置路径。第二步,在调用 FileSystem.get 时,从 aaHDFS 对应的路径加载 Hadoop 配置。第三步,在读写 HDFS 时,使用 HadoopFileSystemWrapper 将用户自定义 scheme 的路径 (aaHDFS://) 转换为真实的 hadoop 路径 (HDFS://)。

我们也做了许多其它的优化和扩展,主要分为三大块。

第一块是性能的优化,包括 HDFS 优化 (合并小文件、降低 RPC 调用)、基于负载的动态 rebalance、Slot 分配策略扩展 (顺序、随机、按槽分散) 等等。第二块是稳定性的优化,包括 ZK 防抖、JM Failover 优化、最后一次 checkpoint 作为 savepoint 等等。第三块是易用性的优化,包括日志增强 (日志分离、日志级别动态配置)、SQL 扩展 (窗口支持增量计算,支持offset)、智能诊断等等。

四、未来规划

最后是未来规划。归纳为 4 点:

第一,持续完善 SQL 平台。持续增强完善 SQL 平台,推动用户更多地使用 SQL 开发作业。第二,智能诊断和自动调整。全自动智能诊断,自适应调整运行参数,作业自治。第三,批流一体。SQL 层面批流一体,兼具低延迟的流处理和高稳定的批处理能力。第四,AI 探索实践。批流统一和 AI 实时化,人工智能场景探索与实践。

原文链接:http://click.aliyun.com/m/1000293113/

本文为阿里云原创内容,未经允许不得转载。


推荐阅读
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • Java 点餐系统源代码附带管理后台(免费提供)
    本项目提供了一套基于 Java 的点餐系统,包括前端小程序和后端管理平台。采用 Spring Boot 和 SSM 框架,结合 MySQL 和 Redis 数据库技术,适用于学习和二次开发。有需要源代码的开发者可以通过私信联系,免费获取下载链接。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 人人租机作为国内领先的信用免押租赁平台,为企业和个人提供全方位的新租赁服务。通过接入支付宝小程序功能,该平台实现了从零到百的迅猛增长,成为全国首家推出“新租赁小程序”开发服务的阿里巴巴小程序服务商(ISV)。这一创新举措不仅提升了用户体验,还显著增强了平台的市场竞争力。 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 在处理MySQL递归查询父子节点时,若遇到“此函数未声明为DETERMINISTIC、NOSQL或READS SQL DATA”的错误,可以通过以下方法解决:首先,确保表结构正确设计,包含必要的字段用于存储节点关系。接着,创建两个函数,一个用于根据输入ID查询所有子节点及其ID,另一个用于根据输入ID查询所有父节点及其ID。在创建函数时,需明确声明函数的特性,如是否确定性、是否访问SQL数据等,以避免上述错误。调用这些函数时,确保传递正确的参数,并检查返回结果的完整性。 ... [详细]
author-avatar
拍友2602939213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有