Apache DolphinScheduler 与 AWS 的 EMR/Redshift 集成实践分享
引言
这篇文章将给大家讲解关于DolphinScheduler与AWS的EMR和Redshift的集成实践,通过本文希望大家能更深入地了解AWS智能湖仓架构,以及DolphinScheduler在实际应用中的重要性。
AWS智能湖仓架构
首先,我们来看一下AWS经典的智能湖仓架构图。
这张图展示了以S3为核心的数据湖,围绕数据湖的是各种组件,包括数据库、Hadoop的EMR、大数据处理、数据仓库、机器学习、日志查询和全文检索等。
这些组件形成一个完整的生态系统,确保数据能够在企业内部自由流动,无论是从外围到核心,还是从核心到外围。
智能湖仓架构的核心目标是实现数据在各个组件之间的自由移动,提升企业数据处理的灵活性和效率。
数据源与数据采集工具
为了让大家更直观地理解这张图,我们可以从左到右进行解读。左侧是各种数据源,包括数据库、应用程序以及数据采集和摄入工具。
这些工具包括Kinesis、MSK(托管的Kafka)和OpenSearch,都是用于高效数据摄入的优秀工具。
核心组件介绍
今天的主角是图中圈起来的几个关键组件:
- Redshift:用于数据仓库的解决方案。
- EMR:Hadoop生态圈的大数据处理组件。
- DolphinScheduler:任务调度工具。
在大数据处理的下游,还包括BI(商业智能)、传统机器学习和最新的生成式AI,再往下是企业中的人、应用和设备。这张图展示了整个数据处理和分析的流程,使得数据处理过程更加直观和流畅。
今天的分享主要围绕以下两个核心点展开:
- EMR与DolphinScheduler的实践
- Redshift与DolphinScheduler的实践
在此之前,我们先对EMR做一个简要介绍。
Amazon EMR 简介
Amazon EMR(Elastic MapReduce)是亚马逊云技术提供的一款云端服务,用于轻松运行Hadoop生态圈的各类组件,包括Spark、Hive、Flink、HBase等。
其主要特点包括:
- 及时更新:紧跟开源社区的最新版本,30天内提供最新的开源版本更新。
- 自动弹性扩容和缩容:根据工作负载自动调整集群规模。
- 多种计价模式:灵活组合使用不同的计价模式,实现极致性价比。
EMR与自建Hadoop集群的比较
相比于传统IDC机房自建Hadoop集群,EMR具有以下优势:
- 充分发挥原生特性
- 多种计价模式组合使用
- 自动弹性扩容和缩容
成本分析
在使用Hadoop进行数据分析和大数据处理时,企业越来越关注成本控制,而不仅仅是性能。
下图展示了企业在IDC机房自建Hadoop集群的成本构成,包括服务器成本、网络成本、人工维护成本以及其他额外费用。这些成本往往非常高。
迁移到EMR的优势
许多企业由于本地扩容困难、长周期采购流程以及升级困难等原因,逐渐将Hadoop工作负载迁移到云上的EMR。
通过支付订阅费用和额外支持费用,企业可以享受到以下优势:
- 灵活的计价模式组合
- 自动弹性伸缩
- 参数调优
进一步优化
在完成初步优化后,部分企业可能仍觉得不满足其性价比的要求,进而转向使用EMR Serverless和EMR on EKS。这两者本质上都是基于容器化技术,旨在实现更高的性价比。
EMR Serverless
EMR Serverless让企业摆脱了对硬件和基础设施的维护,更加关注上层应用和业务开发,用户只需设置应用程序代码和相关参数即可。
EMR on EKS
EMR on EKS通过在Kubernetes上构建Hadoop集群,包括Spark和Flink等组件,进一步优化性价比。
不仅能提高数据处理的效率和灵活性,也使得企业能够更好地控制成本,实现业务目标。
实践案例分享:从IDC迁移到AWS EMR
接下来通过一个真实案例,分享一个客户从IDC迁移到AWS EMR的优化过程。这将帮助大家了解在云上使用EMR和DolphinScheduler的具体实践,以及如何通过这些工具实现性能和成本的双重优化。
客户背景与挑战
该客户原本在IDC机房采用CDH(Cloudera Distribution Hadoop),自建了一个Hadoop集群,共有13个节点。某个任务在机房内需要13个小时才能完成。客户希望通过迁移到云上,降低成本并提升效率。
迁移与优化过程
初始迁移
客户将其工作负载迁移到AWS云上,采用EMR On EC2。在迁移后的初始阶段,使用Hive on EMR,仅用了6个节点,任务时间缩短至10小时。此时并未进行任何调优。
接着,客户将Hive切换为Spark,仍使用6个节点,任务时间进一步缩短至3.5小时。
通过开启EMR的弹性伸缩功能,并将数据格式转换为parquet,任务时间进一步缩减至2.4小时。
最终优化
客户实现了集群版EMR与EMR Serverless的混合使用,将部分工作负载迁移到EMR Serverless上,达到了极致的性价比,性能优化在很大程度上也代表了成本优化。
调度优化与实践
迁移后的调度方式
在迁移到云上的EMR On EC2后,客户的调度方式如下:
- 任务分布在24小时内,小任务每个大约需要20-30分钟。
- 较大的任务集中在一天的7小时内执行。
- 超级大的任务执行时间为3-5天,甚至一周,一次执行一个月可能只需要运行两三次。
优化调度
通过Apache DolphinScheduler,客户将工作负载分别调度到EMR On EC2和EMR Serverless上。
具体做法如下:
- 小任务:放到EMR Serverless上,因为这些任务不需要3-4台节点,10GB-20GB内存即可满足需求。
- 大任务:继续保留在EMR On EC2上,因为这些任务在云上运行时间相对集中,则可以集群定时开关,降低成本。
- 超级大任务:放到EMR Serverless上,通过监控每次运行的CPU和内存消耗,,将每次任务运行的成本可视化,便于针对性地、持续地进行成本优化。
统一元数据管理
使用AWS Glue作为统一的元数据管理工具,使得集群的创建、销毁、再创建过程无需恢复元数据或数据,同一份数据和元数据可以在EMR On EC2和EMR Serverless之间无缝使用。
挑战与解决方案
在此过程中,我们也遇到了一些挑战:
- 异步提交问题:EMR Serverless目前仅支持异步提交,而批处理任务需要同步执行。我们通过封装Python类库,实现了统一的API接口,解决了这个问题。
- 日志查看不一致:EMR和EMR Serverless的日志查看方式不同。通过DolphinScheduler,我们实现了统一的日志下载和查看,改善了客户体验。
- API接口差异:EMR和EMR Serverless的API接口不同。我们通过封装统一的API接口,减少了客户的维护成本。
- SQL提交限制:EMR Serverless暂时不支持直接提交SQL。我们通过Python脚本,间接实现了SQL提交。
解决方案实施
我们和客户一起封装了一个Python类库,通过这个类库,统一了EMR On EC2和EMR Serverless的任务提交、日志查询和状态查询接口。在DolphinScheduler中,客户可以通过统一的API无缝地的在EMR Serverless 和 EMR on EC2 之间切换工作负载。
例如,在DolphinScheduler上调度到EMR On EC2时,脚本如下:
from emr_common import Session
session_emr = Session(job_type=0)
session_emr.submit_sql("job_name","your_sql_query")
session_emr.submit_file("job_name","your_pyspark_script")
而调度到EMR Serverless时,脚本如下:
from emr_common import Session
session_emrserverless = Session(job_type=1)
session_emrserverless.submit_sql("your_sql_query")
session_emrserverless.submit_file("job_name","your_pyspark_script"
通过Apache DolphinScheduler的参数传递特性,整个代码可以在不同引擎之间自由切换,实现了无缝调度。除了基本的job type参数之外,还有许多其他参数可供配置。
为了简化用户操作,系统为大部分参数设置了默认值,因此用户通常不需要手动配置这些参数。
例如,用户可以指定任务执行的集群,如果不指定,系统将默认选择第一个活跃的应用或集群ID。
此外,用户还可以为每个Spark任务设置driver和executor的相关参数。如果不指定这些参数,系统也会使用默认值。
封装Session
为了实现简化操作,我们封装了一个session对象,这个session包含两个子类:EMRSession和EMRServerlessSession。
根据传入参数的不同,系统会创建相应的session对象,无论是提交SQL语句还是脚本文件,其接口从上到下都是一致的。
使用体验
下面通过一些DolphinScheduler的截图来展示其使用体验。
上图是DolphinScheduler上的一个Python Operator
示例,包含了EMR On EC2和EMR Serverless的代码:
from emr_common import Session
# EMR On EC2
session_emr = Session(job_type=0)
session_emr.submit_sql("job_name","your_sql_query")
session_emr.submit_file("job_name","your_pyspark_script")
# EMR Serverless
session_emrserverless = Session(job_type=1)
session_emrserverless.submit_sql("your_sql_query")
session_emrserverless.submit_file("job_name","your_pyspark_script"
实际效果
通过上述优化,客户不仅大幅缩短了任务运行时间,还实现了成本的大幅节约。
例如,在未调优情况下,任务时间从13小时缩短到10小时,而经过多次优化后,最终任务时间缩短到2.4小时,同时实现了集群版本EMR和Serverless版本的混合使用。
通过这个案例,我们可以看到,通过使用AWS EMR和DolphinScheduler,企业可以在保证性能的同时,大幅降低成本,实现更高的性价比。希望这个案例能为大家在云上进行大数据处理和优化提供一些借鉴和参考。
Redshift 实践分享
Redshift是AWS推出的云数据仓库,已经存在十多年,是业界最成熟的云数据仓库之一。通过Redshift,用户可以实现数据仓库、数据湖和数据库的无缝集成。
Redshift简介
Redshift是一款分布式数据仓库产品,支持以下功能:
- 联合查询与联邦查询:直接查询MySQL等关系数据库的数据,无需通过ETL导入Redshift。
- 与S3数据湖的集成:通过Redshift Spectrum,直接查询S3上的parquet等格式的数据,而无需将数据导入Redshift。
- 与机器学习的集成:在没有机器学习经验的情况下,通过写SQL就能快速且自动地完成特征工程与模型训练,然后进行趋势预测、销售预测、异常检测等应用。
Redshift不仅支持集群部署,还提供Serverless模式,在这种模式下,用户无需管理负载和资源扩展,只需关注SQL代码和数据开发应用,进一步地简化了数据开发的门槛,让大家更加专注业务层面的开发,而不要去关注过多的关注底层的运维。
自3.0版本起,DolphinScheduler支持Redshift数据源。通过DolphinScheduler的SQL Operator
,用户可以直接编写Redshift的SQL,进行大数据开发和应用。
用户可以通过拖拽界面操作,轻松定制DAG并监控各个任务和流程的执行情况。
并发控制
Redshift是一个OLAP数据库,具有高吞吐量和快速计算的特点,但其并发扩展通常不超过50。这对于调度大量并发任务的客户来说是一个挑战。
为了解决这一问题,有两个选项:
- 开启Redshift并发扩展:扩展到预置资源的10倍容量,但会增加额外成本。
- 使用DolphinScheduler的并发控制功能:创建任务组,设定资源容量,控制调度到Redshift的任务并发,避免集群过载。
Shell Operator实践
在使用DolphinScheduler进行Redshift开发时,推荐使用SQL Operator
,但也可以使用Shell Operator
,通过sql - fxxx.sql
命令执行SQL文件。
这种做法的好处在于可以与CICD流程集成。开发人员可以在个人电脑上通过GitLab开发代码,提交后自动上传到S3桶,DolphinScheduler支持从S3桶读取代码文件,并提交到Redshift中执行。
比如说通过Jenkins实现了代码推送到GitLab后,自动上传到S3存储桶。在DolphinScheduler的资源中心创建文件后,自动向S3写文件,并更新DolphinScheduler的元数据,实现了CICD的无缝集成。
总结
今天我们分享了EMR与EMR Serverless和DolphinScheduler的整合经验和实践,以及Redshift与DolphinScheduler的集成实践。以下是我个人对DolphinScheduler社区的期望和展望:
- SQL语法树解析生成血缘关系:希望DolphinScheduler能提供基于SQL语法树解析生成的数据血缘关系,尤其是字段级别的血缘关系。
- 引入AI agent编排流程:希望未来DolphinScheduler能考虑引入AI agent的编排流程,或引入AI agent的Operator。
感谢大家的观看,如果想了解更多详情,欢迎加小助手进群交流。
本文由 白鲸开源 提供发布支持!
Apache DolphinScheduler 与 AWS 的 EMR/Redshift 集成实践分享的更多相关文章
- 挑战海量数据:基于Apache DolphinScheduler对千亿级数据应用实践
点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 精彩回顾 近期,初灵科技的大数据开发工程师钟霈合在社区活动的线 ...
- 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖
1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好.更快的决策.Amazon Simple Storage Service(amaz ...
- 议题征集令 | Apache DolphinScheduler Meetup 2021 来啦,议题征集正式开启!
点击上方 蓝字关注我们 社区的小伙伴们,经过精心筹备,我们很高兴地宣布,Apache DolphinScheduler Meetup 2021 将于 2021 年 11 月 27 日到来! 在 Mee ...
- 从 Airflow 到 Apache DolphinScheduler,有赞大数据开发平台的调度系统演进
点击上方 蓝字关注我们 作者 | 宋哲琦 ✎ 编 者 按 在不久前的 Apache DolphinScheduler Meetup 2021 上,有赞大数据开发平台负责人 宋哲琦 带来了平台调度系统 ...
- 4 亿用户,7W+ 作业调度难题,Bigo 基于 Apache DolphinScheduler 巧化解
点击上方 蓝字关注我们 ✎ 编 者 按 成立于 2014 年的 Bigo,成立以来就聚焦于在全球范围内提供音视频服务.面对 4 亿多用户,Bigo 大数据团队打造的计算平台基于 Apache Dolp ...
- Apache DolphinScheduler 的持续集成方向实践
今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...
- Apache DolphinScheduler 3.0.0 正式版发布!
点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 版本发布 2022/8/10 2022 年 8 ...
- 日均 6000+ 实例,TB 级数据流量,Apache DolphinScheduler 如何做联通医疗大数据平台的“顶梁柱”?
作者 | 胡泽康 鄞乐炜 作者简介 胡泽康 联通(广东)产业互联网公司 大数据工程师,专注于开源大数据领域,从事大数据平台研发工作 鄞乐炜 联通(广东)产业互联网公司 大数据工程师,主要从事大数据平 ...
- 感谢有你!Apache DolphinScheduler 项目 GitHub star 突破 8k
本周伊始,Apache DolphinScheduler 项目在 GitHub 上的 Github Star 总数首次突破 8K.目前,Apache DolphinScheduler 社区已经拥有 C ...
- 大数据平台迁移实践 | Apache DolphinScheduler 在当贝大数据环境中的应用
大家下午好,我是来自当贝网络科技大数据平台的基础开发工程师 王昱翔,感谢社区的邀请来参与这次分享,关于 Apache DolphinScheduler 在当贝网络科技大数据环境中的应用. 本次演讲主要 ...
随机推荐
- 增补博客 第六篇 python 电子算盘
珠算测试器 题目描述]设计一个珠算测试器,要求能够完成珠算加减法的测试.具体的要求功能如下:(1)用户启动测试,输入用户名后系统随机生成特定数目的加减法测试题:(2) 要求测试使用表盘式或数字时秒表进 ...
- 订单推送设计思路-基于支付ID而不是订单号来推送
订单推送设计思路-基于支付ID而不是订单号来推送 方案:不是基于订单号来核销和分账的,抖音是基于每一笔抖音支付来做订单推送,核销和分账现象:这样会在抖音的订单中心中会出现很多条订单推送的记录. 抖音A ...
- Python使用.NET开发的类库来提高你的程序执行效率
Python由于本身的特性原因,执行程序期间可能效率并不是很理想.在某些需要自己提高一些代码的执行效率的时候,可以考虑使用C#.C++.Rust等语言开发的库来提高python本身的执行效率.接下来, ...
- kubernetes安装Prometheus
安装 在目标集群上,执行如下命令: kubectl apply -f https://github.com/512team/dhorse/raw/main/conf/kubernetes-promet ...
- WPF/C#:显示分组数据的两种方式
前言 本文介绍自己在遇到WPF对数据进行分组显示的需求时,可以选择的两种方案.一种方案基于ICollectionView,另一种方案基于IGrouping. 基于ICollectionView实现 相 ...
- Navicat 连接SQL Server LocalDB的方法
截止2021年11月,Sql Server LocalDB的资料网上并不多见,出来了其实也有一段年头了. SqlServerManagerStudio自带的工具进行查询使用体验并不好,Navicat是 ...
- 记录一次EF实体跟踪错误
记录一次EF实体跟踪错误 前言 在我写文章编辑接口的,出现了一个实体跟踪的错误,详情如下 System.InvalidOperationException: The instance of entit ...
- makedown 笔记
前言 记录一下自己经常忘的makedown指令,不断更新. makedown 添加空格
- Spring注解之参数校验@Validated和@Valid
@Validated和@Valid的区别 Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 的一个变 ...
- Mybatis 总结ResultMap的复杂对象查询
association:映射的是一个POJO类,处理一对一的关联关系 collection:映射的一个集合列表,处理的是一对多的关联关系 模版 <!--column不做限制,可以为任意表的字段, ...