本文为您介绍几类 Apache 作业迁移至火山引擎 E-MapReduce(简称“EMR”)上的案例。
Apache Airflow 是一个提供了编程形式去进行编写、调度与监控工作流的开源组件。 在 Airflow 中,工作流由一个个具体的任务(task)组成的有向无环图(DAGs)构成。Airflow Scheduler 基于一系列的 Workers,以 DAG 规定的依赖关系进行具体任务的执行。其 Webserver,提供了丰富的用户界面,让用户可视化地查看当前工作流运行现状,进行历史回顾,监控执行过程,并且在必要的时候通过查看执行日志进行故障排除。 同时,Airflow 提供了丰富的命令行实用命令,在 DAG 文件编写完正式投入生产前,让您可以更简洁地对其执行复杂的调试。 以代码形式定义的工作流,使其具有更好的可维护性,结合 VCS 可进行更好的版本管理,更具可测试性与协同性。
火山引擎 EMR 集成了 Airflow,支持用户在创建集群时选择安装 Airflow 组件。详见创建集群。
若集群已创建完成,火山引擎 EMR 也支持您在集群创建后,以添加服务的方式安装 Airflow 组件。详见添加服务。
迁移 Apache Airflow 主要是 Airflow DAG 迁移。
对于同一大版本,即 2.x 版本的 Airflow,对应的 DAG 文件可以直接迁移到 EMR 中使用,如果代码中使用到一些特定的依赖,则需要您手动在对应的 Airflow venv 中进行依赖安装。
如果是从 1.x 版本的 Airflow 服务迁移过来,由于 1.x 版本的 Airflow 使用的是 python2,而 EMR 的 Airflow 2.x 使用的是 python 3,因此这样的迁移可能需要您对 DAG 进行代码改造。有需要协助的地方,请通过工单系统与我们联系。
火山引擎 EMR 支持您使用 Apache Spark 开发应用程序来进行作业数据的导入、查询以及分析处理。
借助火山引擎 EMR 的特定实例规格和弹性伸缩能力, Apache Spark 在性能和成本方面有效优化。您可以通过火山引擎大数据研发治理套件 Dataleap 对 Spark 作业进行开发、调试和部署, 详见 DataLeap + EMR 快速入门。也可以通过 EMR 集群内置的 Apache Hue 提交 Spark 作业,详见 HUE 最佳操作。
开启弹性伸缩可以减少 Spark 作业的成本。在使用 EMR 集群过程中,计算高峰时扩展一部分临时计算能力帮助渡过业务计算高峰,渡过业务高峰后进行缩容操作,降低计算资源使用成本。详见弹性伸缩。
排查常见的问题,可以通过:
Spark Web UI, 通过 EMR 集群 Master 节点的 8443 端口访问 Spark History Server UI。
Yarn Web UI, Yarn Application 包含 Spark Job,通过 EMR 集群 Master 节点的 8443 端口访问 Yarn Resource Manager UI。
详见访问链接。
登录EMR 控制台 > 日志中心 > 服务日志,EMR 管控的日志中心支持对 Spark 日志的搜索和查看。详见日志中心。
Apache Flink 是一个面向有限流和无限流有状态计算的分布式计算框架,它能够支持流处理和批处理两种应用类型。Flink 不仅能够提供同时支持高吞吐、低延迟和 Exactly-Once 语义的实时计算能力,同时 Flink 还提供了基于流式计算引擎处理批量数据的计算能力,真正意义上实现了流批统一 。您可以通过火山引擎大数据研发治理套件 Dataleap 对 Flink 作业进行开发、调试和部署。详见 DataLeap + EMR 快速入门。
双跑验证期间需要对数据正确性、业务性能和业务稳定性进行验证:
数据质量是实时计算数据产出对业务的重要保障,和实时计算任务日常变更一样,迁移工作也需要对新任务产出的数据质量进行验证。
对比作业的吞吐和延时情况来判断新作业性能是否符合需求。
业务稳定性和数据质量同样重要,任务的稳定性通常要求实现较长时间的平稳运行(建议至少7天)。
Yarn Web UI, Yarn Application 包含 Flink Job,通过 EMR 集群 Master 节点的 8443 端口访问 Yarn Resource Manager UI。
服务日志,EMR 管控的日志中心支持对 Flink 日志的搜索和查看。
服务监控,云监控和 EMR 集群详情中支持对 Flink 的监控和告警配置。
Apache DolphinScheduler 是一个分布式、易扩展的可视化 DAG 工作流任务调度系统,适用于企业级场景,提供了可视化的任务操作、工作流编排,以及全生命周期数据处理过程的解决方案。
DolphinScheduler 的迁移主要是原有负载的数据库表迁移,且不需要增量迁移,因而使用 Mysqldump 工具进行全量备份,再到火山引擎 EMR 中的 DolphinScheduler 对应数据库进行恢复,再通过官方 upgrade 脚本升级即可。
mysqldump -u [user name] –p [password] [database_name] > [dumpfilename.sql]
mysqldump 工具原生支持更多的选项,比如选中某些特定的表,或者决定是否备份结构而忽略数据等等。
在我们的场景中,只需要对整个库表的结构与数据进行备份,请您按照上述语句格式进行执行。
该步骤中,预设您持有一个 2.1.0 / 3.1.0 及以上版本的 Hadoop 类型集群,并且已经添加了 DolphinScheduler 服务。如有需要,请参阅创建集群与添加服务文档。
在进行库表恢复之前,请您通过控制台的服务操作功能,先关停集群内的 DolphinScheduler 服务。
关闭后,请您将 4.1 步骤中生成的 sql 文件,上传到火山引擎 EMR 集群的 master-1 机器上。该步骤可以通过对集群机器进行公网绑定,通过 scp 命令进行上传来完成。如果 sql 文件不大,也可以直接复制代码,粘贴保存在机器上。
接下来,请您根据数据库连接信息(假如您在 master-1 机器上,可从以下位置 /etc/emr/dolphinscheduler/api-server/conf/application.yaml
中的 datasource
配置中获取,包括数据库名与连接使用的账号密码等,我们假设数据库名称为 dolphin_scheduler
),通过 mysql 命令连接到数据库中,执行如下命令,将原有库表进行删除:
drop database `dolphin_scheduler`;
接下来,运行 create
语句,创建新的数据库以供恢复使用:
CREATE DATABASE `dolphin_scheduler` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
下一步,我们通过 4.2 步骤中上传的 sql 文件,把库表结构与数据恢复到新的数据库中。命令如下:
mysql -u [username] –p[password] [database_name] < [dumpfilename.sql]
在这里,username 、 password 与 database_name 同 4.2 步骤中获取到的连接信息一致,请留意 -p 选项后面不接空格,或者 -p 后不接内容,执行命令后根据提示再输入密码即可。
首先,请您执行命令 sudo dpkg-reconfigure dash
,提示输入时输入 no 即可,将系统默认的 sh 变更为 bash,dash 与 DolphinScheduler 原生升级脚本中的 source 命令不兼容。
接着,切换工作目录到 /usr/lib/emr/current/dolphinscheduler/
,修改 ./bin/env/dolphinscheduler_env.sh
,作如下对应修改
# emr JAVA_HOME export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-8-openjdk-velinux-amd64} ```shell export DATABASE=${DATABASE:-mysql} export SPRING_PROFILES_ACTIVE=${DATABASE} export SPRING_DATASOURCE_URL="{jdbc_url}" export SPRING_DATASOURCE_USERNAME={user} export SPRING_DATASOURCE_PASSWORD={password}
其中 DATASOURCE
的配置对齐 4.2 步骤中获取到的连接信息即可。
说明
假设您使用的是 2023/02/28 日期之前 3.1.1 版本的 DolphinScheduler,请您编辑 ./tools/sql/sql/upgrade/3.1.1_schema/mysql/dolphinscheduler_dml.sql
文件,修改其中 dml 语句的 qrtz_job_details 为 QRTZ_JOB_DETAILS。
接下来,通过 DolphinScheduler 的脚本进行一键升级即可。sh ./tools/bin/upgrade-schema.sh
升级完成后,便可以在 EMR 控制台,对 DolphinScheduler 服务进行启动使用,完成整个升级过程。
如果希望系统中默认的 sh 保持 dash,可以重新执行 sudo dpkg-reconfigure dash
,输入 yes 即可。