写点什么

大数据公司 LiveRamp 上云记(四):如何在迁移时处理数百万请求和 PB 级数据传输

  • 2020-02-22
  • 本文字数:3830 字

    阅读完需:约 13 分钟

大数据公司 LiveRamp 上云记(四):如何在迁移时处理数百万请求和 PB 级数据传输

复制数据到云

LiveRamp 正在大规模迁移其基础设施到 GCP。在之前的文章中,我们谈到了迁移以及使用谷歌作为云供应商的决定。在本文中,我想着重强调一个为完成本次迁移而必须解决的问题:复制我们的数据到云。


在大数据公司之中,LiveRamp 占据着一个相对小众的领域:我们所有的产品都与热数据类的大数据任务相关。我们确实有一些相对较大的历史数据集,但与我们在线生成和使用的大型数据集相比,这些只是次要问题,我们的数据集预计只能保留几天。并且由于我们的数据访问模式,大多数云数据迁移方案都不适合我们,尤其是像亚马逊的 Snowball 或谷歌的设备传输,这样数据传输方式对我们毫无用处。


更麻烦的是,保存这些热数据的托管设施的网络设备都相当陈旧,它们主要用于数据中心内部的数据传输。硬件升级可能会花费数十万甚至数百万美元,所以我们不得不利用现有资源,将硬件利用到极致,以获得 50Gbps 的 GCP(谷歌云计算平台)互连吞吐量。我们数据基础设施团队的任务是构建工具,从而让应用程序开发人员能够共享这些有限的资源,并在不中断客户服务的基础上将数据放入云中。

Data Replicator

我们所构建的用于满足这些需求的应用程序称为 Data Replicator(数据复制器)。本质上,Data Replicator 是目前大多数 Hadoop 版本都支持的 DistCp 任务的载体,但围绕它的却是一些非常复杂的问题,如分布式作业调度、监控和遵循最小惊喜原则等,我们将在后面详细讨论。

架构

我们使用 LiveRamp 的daemon_lib项目来编排一组 Kubernetes 的 pod,这些 pod 来自于一个数据复制请求的提交队列,每个请求都包含一个源文件路径和一个目标文件路径。我们检查数据源的大小:对于小数据集,我们直接使用本地进程将数据复制到其目的地,而对于大数据集,我们向 Hadoop 集群提交一个 Hadoop DistCp 任务,进而执行高度分布式的复制(稍后将详细介绍)。

数据库作为优先队列

像很多应用程序一样,Data Replicator 可以被抽象为 worker 从队列中获取任务并执行它们。然而,我们并没有使用现有的一些典型的分布式队列解决方案,比如 Google 的 Pub Sub 或 Apache 的 Kafka。相反,我们只是使用一些普通的 SQL(结构查询语言)来处理请求。这给了我们一些优势:


Data Replicator 任务可以在任何地方运行 30 秒到 24 小时,我们希望尽可能地避免向用户返回任何类型的失败(或者请求被删除等更糟糕的信息)。这意味着我们需要更显著的持久性和确认特性:只有在工作完成时执行删除操作,而不是在处理开始时。一个请求的生命周期如下:



大多数分布式队列都不能很好地支持一些处理,例如处理可能需要很长时间,或者 worker 在工作中死亡。如果一个执行者在工作中死亡,请求将被标记为失败,并被放到“挂起”队列或者被手动取消。


同样,原始请求队列对长时间请求的状态的可见性也非常有限。我们希望为人和软件客户端提供一个清晰的系统状态视图。因为这只是 SQL,我们可以任意索引从而为外部应用程序、用户界面或执行器来提供这种可见性:



具体来说,执行器希望选择优先级最高的挂起请求。大多数队列不支持从多达数千计的候选里获取一个更高优先级的请求。我们的索引如同一个优先队列,查询非常简洁:



这种细致的索引可以让应用程序团队提交数十万个低优先级请求,而且不会降级系统的健康状况:



最后也很重要的是,我们的 devops 团队和开发人员对 SQL 和 MySQL 都非常了解,学习一项新技术并构建与之相关的功能,这也意味着巨大的机会成本。选择使用 SQL,我们能最好地利用开发团队中现有的人才。


我们使用 LiveRamp 的daemon_lib项目来编排数据库检查流程、将个体标记为选中、处理它们,然后将它们标记为完成或失败。我们利用 Apache Curator 和 Apache ZooKeeper 的内置锁来协调读取和更新数据库的进程。我们还使用 Curator 的临时锁来注册正在完成的工作,这样,如果数据复制任务由于某种方式死亡,这将会被检测到,而其它 worker 会把这项任务返回到队列中。所有这一切给了我们一个非常有弹性的系统,可以确保我们在正确的时间做正确的事,并且不会有任何损失。


需要澄清的是,我们并没有为 Data Replicator 而构建一个守护服务的基础设施。daemon_lib 和数据库后端的队列在 LiveRamp 内部被广泛使用,我们也借助现有的工具快速构建了一个开箱即用的容错系统。

监控

系统健康的可视化是我们设计服务的驱动目标之一。通过使用 LiveRamp 的内部服务处理框架,我们得到了一个非常好的用户界面,该界面显示了所有 Data Replicator 请求的汇总:



虽然这提供了系统健康的真实信息,但在 LiveRamp 我们更喜欢使用DataDog的控制面板来构建时间序列界面,因此我们决定将尽可能多的监控指标推送给 DataDog,并在那里构建一个全面的监控。我们从不同来源获取数据:


  • 我们以前介绍过MapReduce计数器在调试 MapReduce 作业时非常有用。Distcp 是一个 MapReduce 任务,因此我们将 Distcp 的计数器推送给 DataDog。

  • 因为我们的工作队列很容易查询,所以我们将挂起的工作队列也推送给 DataDog。

  • 执行者自己推送关于他们正在复制的文件的指标。

  • 我们依靠 GCP API 来提取云互连利用率指标


如下是我们构建的一些更常见的参考图表:



这是一个关于系统健康的最基本的度量标准,显示了我们工作队列的大小。如果我们没有挂起或失败的请求,那么就表示我们的状态非常好。


当然,原始计数只是一个粗略的度量标准。我们支持请求优先级,这样团队就可以在不影响高优先级流量的情况下提交大量低优先级冷数据的复制任务。通过跟踪每个优先级的请求时间,我们可以确认对时间敏感的请求实际上得到了快速处理:



我们最重要的系统限制是带宽。我们跟踪了互连带宽的历史使用情况:



这提供了聚合利用率,但没有按应用程序分解。由于单个请求被客户端应用程序标记,我们实际上可以将带宽利用率归于服务消费者:



通过这些工具,我们可以很直观地了解数据复制服务的健康状况。

DistCp 问题

我们在使用 DistCp 时遇到了一个有趣的接口问题:DistCp 的覆写选项。覆写标志位决定了当 DistCp 检测到其试图复制的文件已经在目标文件系统时所发生的情况:如果标志位为假,DistCp 不复制文件;如果标志位为真,它将删除已经存在的文件并复制源文件。


Distcp 不会检查文件的内容,因此用户必须知道他们的数据是不是最新的,以及是否需要覆写。我们希望使用者能够自己设置这个标志位,这样他们就可以在不知道数据集复制情况的前提下仍能够执行最有效的操作,尤其是在他们被要求去重复复制一些并未改变的数据的时候。


但是我们遇到了一个阻碍,正如DistCp文档中所描述的,覆写标志位实际上改变了被复制数据的目录结构!我们开始只是打算简单地把这个信息通知给用户,并让他们为自己的请求负责,但我们认为这严重违背了最小惊喜原则,最终只会给我们的用户和团队带来更多的痛苦,因此我们决定由自己负责,编写代码让 Data Replicator 的复制行为表现一致。


这些封装 DistCp 不一致的代码牵扯到了一些分支逻辑,但最终并没有像我们起初担心的那样复杂。真正困难的是如何证实我们想要覆盖的测试的确表现出了一致的行为。为了测试新代码,我们使用 LiveRamp 的generative库编写了一个单独的、可扩展的测试,创建了 100 多个潜在输入的组合,并确认创建的文件和目录结构符合我们的预期。我会在以后介绍更多关于使用 generative 以及基于属性的测试经验。

不同规模的任务

为保持用户界面的简洁性,即便是复制不同大小的文件,Data Replicator 都必须为用户提供相同的 API。所以,不论是复制 5TB 的冷数据还是复制 5MB 的导入,用户最终都会使用相同的服务调用。


虽然 MapReduce 和 DistCP 非常乐意启动一个 YARN 应用程序来处理一个哪怕只是复制 5MB 数据的请求,但启动一个 YARN 应用程序会产生相当高的开销:如果向 ResourceManager(资源管理器)提交一个 5MB 的复制任务,那么就会启动一个 ApplicationMaster(程序调度器),以及一个 Map 任务来执行实际的复制:



为避免这种不必要的开销,当请求的输入文件为 1GB 时,我们将任务降低到“本地模式”。在这种模式下,worker 直接将数据从源文件系统复制到 GCS,而不需要启动 DistCP 应用程序:



本地模式在减少系统开销方面非常成功;事实上,我们有 75%的请求完全跳过了 DistCP,直接通过这些 worker 进行复制:



我们遇到的最后一个瓶颈实际上与我们快速启动任务的能力有关。当从队列中拖出任务时,worker 会在构建请求时将队列“锁定”几秒钟。在请求数量极大但请求的工作量又很小的情况下,这会成为吞吐量的瓶颈。我们通过将[状态,优先级]队列中执行器的任务分片以及独立锁定分片的方式解决了这个问题:



有了这些,我们就能够处理尽可能多的请求。

Data Replicator 的未来

在 LiveRamp,我们喜欢编写代码,但我们更喜欢在不使用时将它们删除。虽然我们为 Data Replicator 服务感到骄傲,但我们不会永久性的安装它。我们正在全面迁移到GCP,一旦迁移完成,我们就不会受任何带宽限制,也就没有了使用这个服务的必要。


前三篇文章主要讨论了如何将我们现有的基础设施过渡到 GCP。在下一篇文章中,我们将讨论使用 GCP 最有趣的部分,即使用云原生技术重构我们的本地系统。


原文链接:


https://liveramp.com/engineering/migrating-a-big-data-environment-to-the-cloud-part-4%ef%bb%bf/


相关阅读:


大数据公司 LiveRamp 上云记(一):为什么选择 GCP?


大数据公司 LiveRamp 上云记(二):哪些功能可以直接迁移,哪些需要重新设计?


大数据公司 LiveRamp 上云记(三):如何在吞吐量有限的情况下处理数据复制


2020-02-22 09:001532

评论

发布
暂无评论
发现更多内容

inBuilder今日分享丨开源许可协议简介

inBuilder低代码平台

如何充分利用制作游戏原型的免费资产,加速游戏开发

龙智—DevSecOps解决方案

游戏开发 游戏引擎

国内高校最大的云上科研智算平台在复旦大学正式上线

新云力量

智能 计算 复旦大学 云上科研智算平台

龙蜥白皮书精选:面向芯片研发和验证的操作系统 SiliconFastOS

OpenAnolis小助手

开源 操作系统 芯片 龙蜥社区 SiliconFastOS

RocketMQ on openEuler 提供高性能消息队列的稳定性解决方案

openEuler

Linux cpu 操作系统 openEuler 内核

华为云Classroom一站式教学实践平台,开启云端教学新征程

华为云PaaS服务小智

云计算 华为云 线上教学 线上培训

开源之夏2023中选结果公示,504名高校生将投入开源项目贡献

openEuler

Linux 开源 操作系统 openEuler 实习

云原生时代,如何通过极狐GitLab x KubeSphere 构建安全应用?

极狐GitLab

DevOps 云原生 DevSecOps KubeSphere 安全左移

扫码登录认证技术原理介绍及实践

互联网工科生

程序员

浮点数-Float-Double转二进制在线工具

入门小站

《2023 信创软件品牌影响力报告》发布!融云入选「信创生态」代表厂商

融云 RongCloud

IT 品牌 信创 数字 融云

Bean生命周期的扩展点:Bean Post Processor

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 6 月 PK 榜

英特尔以领先产品,为AI领域客户提供高性能和高性价比

E科讯

免费沉浸式Twitter翻译工具 ZipZapAI用AI打破语言障碍

Ricky

ChatGPT GPT-4 ChatGPT4 chatgpt插件

OSPO才是企业拥抱开源的正确选项——适兕访谈录

开源雨林

开源 OSPO LFAPAC

金融科技领先者Broadridge选择CloudBees CI来加速软件交付

龙智—DevSecOps解决方案

ci 持续集成

软件测试 | 性能工具规划

测吧(北京)科技有限公司

测试

第十四届夏季达沃斯论坛|英特尔王锐:AI驱动工业元宇宙,释放数实融合无穷潜力

E科讯

华秋一文带你读懂eMMC芯片引脚定义和工作原理

华秋电子

Windows 系统下怎么获取 UDP 本机地址

高端章鱼哥

Vue3从入门到精通

EquatorCoco

vue.js Vue vue3.0

软件测试 | 性能测试范围

测吧(北京)科技有限公司

测试

一个斜杠引发的CDN资源回源请求量飙升

互联网工科生

CDN

基于OpenHarmony开发的玻璃拟态天气应用(3)构建天气组件并实现毛玻璃效果

路北路陈

前端 HarmonyOS OpenHarmony应用开发 6 月 优质更文活动

软件测试 | 性能测试整体规划

测吧(北京)科技有限公司

测试

AIGC+灵活用工|延长行业生命线、改写传统用工模式,还得看AI的!

TE智库

人工智能 人力资源 灵活用工 AIGC 生成式AI

科兴未来|中国•湖州海外青创大赛全面开启!

科兴未来News

环保 #双创赛事# 新能源行业 湖州

AIGC+客服|智能客服上岗即失业?AI对话背后的学问大着呢

TE智库

人工智能 智能客服 AIGC 生成式AI

需要转变ITSM策略的12个信号,您中了几个?

龙智—DevSecOps解决方案

什么是Buck电源?矽力杰SQ51201值得关注

华秋电子

大数据公司 LiveRamp 上云记(四):如何在迁移时处理数百万请求和 PB 级数据传输_大数据_Benjamin Podgursky_InfoQ精选文章