产品概述
EMR Serverless Spark产品其实最通俗的理解就是它是一款完全可替代开源Spark的大数据服务产品。
EMR是E-MapReduce的简写,全称是Elastic MapReduce,是一种构建在云平台上的大数据处理系统解决方案,它基于开源的Apache Hadoop和Apache Spark等大数据技术,运行在云平台上,用户可以方便地使用Hadoop和Spark生态系统中的其他周边系统(如Apache Hive、Apache Pig、HBase等)来分析和处理自己的数据。
Serverless是一种云计算模型,或者称作无服务架构。它允许开发人员构建和运行应用程序,而无需关心服务器的管理、配置和维护。
Spark是一个实现快速通用的集群计算平台,是一个通用内存并行计算框架,用于构建大型的、低延迟的数据分析应用程序。
综上,EMR Serverless Spark是一款云原生、全托管的产品,专为大规模数据处理和分析而设计。是阿里云提供的基于E-MapReduce平台的全托管Serverless Spark服务。它的架构是如下这样的。
从架构图我们可以非常直观清晰地了解到产品具备如下优势:
云原生极速计算引擎
- 内置Fusion Engine (Spark Native Engine),相对开源版本性能提升200%。
- 内置Celeborn(Remote Shuffle Service),支持PB级Shuffle数据,计算资源总成本最高下降30%。
开放化的数据湖架构
- 支持计算存储分离,计算可弹性伸缩,存储可按量付费。
- 对接OSS-HDFS,完全兼容HDFS的云上存储,无缝平滑迁移上云。
- 中心化的DLF元数据,全面打通湖仓元数据。
一站式的开发体验
- 提供作业开发、调试、发布、调度等一站式数据开发体验。
- 内置版本管理、开发与生产隔离,满足企业级开发与发布标准。
Serverless的资源平台
- 开箱即用,无需手动管理和运维云基础设施。
- 弹性伸缩,秒级资源弹性与供给。
- 按量付费,按实际计算资源量付费,进一步降低计算总成本。
开通试用
在正式开通试用前,我们先看一则官网的通告。
EMR Serverless Spark免费公测已于2024年04月25日开启,预计于2024年07月25日结束。公测阶段面向所有用户开放,您可以免费试用。免费试用结束后,产品将正常计费。公测期间,产品有如下的限制,这里我们有必要先了解一下:
- 工作空间的资源配额上限为100计算单元(CU)。
- 单个Spark任务所能处理的Shuffle数据量最大限制为5 TB。
- 工作空间内所有并行运行的任务共写入Shuffle数据的总量上限为10 TB。
- 同一工作空间内允许并发执行的任务数量上限为100个。
- 不保障服务等级协议(SLA),但服务不降级。
- 公测期间包年包月的工作空间仅支持续费一个月。
距离公测结束时间很近了,还没来得及体验的小伙伴可不要错过了,我也是想赶在公测结束前好好体验一把。接下来就正式开启产品体验。
点击链接即可开通试用。如下:
首次开通,需要相关授权,这里点击同意授权和去授权即可。如下:
完成如上授权后,我们就来到了产品的管理控制台。如下:
可能细心的小伙伴会发现,这里明明显示免费公测到6月25日啊,为啥上面说是7月25日呢,这里我们可以忽略这个差异,以产品文档的7月25日截止为准。
到此,整个产品的开通试用就完成了,是不是相对于其他产品的试用要简单非常多。
快速入门
创建工作空间
要正式开始体验服务之前,需要先创建一个工作空间。在控制台首页点击“创建工作空间”,如下:
要完成工作空间的创建需要先开通DLF以及创建OSS的Bucket。这里有必要了解一下什么是DLF数据目录。DLF数据目录是数据湖构建(Data Lake Formation)的元数据最上层实体,可以包含多个数据库。它主要适用于需要实现元数据隔离的场景,比如多个E-MapReduce集群,每个集群可以绑定不同的数据目录(Catalog),确保每个EMR集群间的元数据互不可见。点击开通DLF,如下:
开通DLF服务后,还需要前往RAM开通相关权限,点击下图的开通。如下:
点击同意授权。如下:
完成上述后,我们就开通了DLF服务了。如下:
开通DLF后,系统会为您选择默认的DLF数据目录,默认为UID。如果针对不同集群您期望使用不同的数据目录,则可以单击创建数据目录,在弹出的对话框中输入目录ID,选择目录路径,然后单击确定。如下:
由于之前我开通过OSS服务,所以这里就不涉及OSS服务的开通,但需要创建OSS-Bucket,在ERM控制台点击链接前往,如下:
点击创建,如下:
这里为了方便,我选择“快速创建”,地域这里要注意,如果选择了“有地域限制”,那就需要选择和EMR同一个地域的。比如我这里的“杭州”。如下:
完成创建后,可以在Bucket列表查看到。如下:
完成上述配置后,回到EMR创建工作空间页面,确认相关信息,点击“创建工作空间”。如下:
在工作空间类型的选择上,有基础版和专业版区分,它们之间的主要差异点如下表格:
对比项 | 基础版 | 专业版 |
---|---|---|
主要特点 | 100%兼容开源Spark。支持阿里云Fusion Engine(Spark Native Engine)。 | 100%兼容开源Spark。支持阿里云Fusion Engine(Spark Native Engine)。内置Celeborn来增强Spark在计算过程中的Shuffle效率。支持Executor动态分配策略。 |
适用场景 | 适用于对Spark有基本需求且对需求要求不是特别高的场景,提供了标准的分布式数据处理能力。 | 兼容基础版,适用于需要特定优化或扩展功能的复杂应用场景,可以满足用户对性能和功能全面提升的需求。 |
计费项 | 按任务实际消耗的CU数计费。 | 按任务实际消耗的CU数计费,单价有一定上浮。 |
为了体验更全面以及获得更优的性能,这里我选择专业版。
稍等片刻,待状态为运行中,一个工作空间就完成了创建。如下:
有了工作空间后,接下来将针对四个任务进行体验,分别时SQL任务、PySpark任务、JAR任务和Spark Submit任务。
SQL任务
我们首先需要创建并发布一个任务,进入EMR控制台,在EMR Serverless Spark页面,单击左侧导航栏中的任务开发。如下:
在任务目录页签下,单击新建。如下:
在新建任务对话框中,输入名称,类型使用默认的SparkSQL,然后单击确定。如下:
接下来需要创建一个表并插入数据。SQL如下:
CREATE TABLE IF NOT EXISTS students (
name VARCHAR(64),
address VARCHAR(64)
)
USING PARQUET
PARTITIONED BY (data_date STRING);
INSERT OVERWRITE TABLE students PARTITION (data_date = '${ds}') VALUES
('Ashua Hill', '456 Erica Ct, Cupertino'),
('Brian Reed', '723 Kern Ave, Palo Alto');
运行SQL需要用到SQL Compute,这里我们只需在下拉列表中选择连接SQL compute,直接创建一个新的SQL Compute。如下:
完成后,直接点击运行。完成后在数据目录这里可以看到执行结果。如下:
接下来就可以发布任务了。只需要点击“发布”,如下:
紧接著我们需要再创建一个查询统计任务,如下:
执行如下SQL语句。如下:
SELECT COUNT(1) FROM students;
接着点击发布,发布此任务。接下来我们需要创建一个工作流,在左侧导航栏中,单击任务编排。在任务编排页面,单击创建工作流。如下:
这里需要将刚才发布的两个任务当作节点添加进来。在新建的节点画布中,单击添加节点。如下:
完成节点添加后,在新建的节点画布中,单击发布工作流。如下:
在任务编排页面,单击新建工作流的工作流名称。在工作流实例列表页面,单击手动运行。如下:
在工作流实例列表页面,我们可以非常直观清晰地查看对应的所有工作流实例,以及各工作流实例的运行时间、运行状态等。如下:
单击工作流实例列表区域的工作流运行ID,或单击上方的工作流实例图页签,可以查看对应的工作流实例图。如下:
在此页面,单击目标节点实例,在弹出的节点信息框中,还可以根据需要操作或查看信息。如下:
比如单击Spark UI跳转至Spark Jobs页面,可以查看Spark任务的实时信息。如下:
单击任务运行ID,进入任务列表页面,还可以查看指标、诊断和日志信息。如下:
当然我们还可以创建一个查询数据的任务,单击任务开发,新建任务,输入并执行以下命令以查看表的详细信息。如下:
PySpark任务
PySpark是Apache Spark的Python API,它允许Python开发者利用Spark的强大功能进行大规模数据处理。因此创建PySpark任务,需要提前准备Python的开发环境并基此完成Python文件的开发。这里为了快速体验,直接下载官网提供的测试文件。单击DataFrame.py和employee.csv,直接下载测试文件。
- DataFrame.py文件是一段使用Apache Spark框架进行OSS上数据处理的代码。
- employee.csv文件中定义了一个包含员工姓名、部门和薪水的数据列表。
有了上述文件后,在EMR Serverless Spark页面,单击左侧导航栏中的资源上传。在资源上传页面,单击上传文件。如下:
在上传文件对话框中,单击待上传文件区域选择Python文件,或直接拖拽Python文件到待上传文件区域。如下:
employee.csv文件需要上传到OSS,上传的方式有如下几种,这里为了方便,只体验OSS控制台。需要了解其他上传方式,可点击前往。
使用OSS控制台
使用图形化管理工具ossbrowser
使用阿里云SDK
使用命令行工具ossutil
使用REST API
利用OSS控制台上传文件,先登录OSS管理控制台,单击Bucket 列表,然后单击目标Bucket名称。在左侧导航栏,选择*文件管理 > 文件列表。在文件列表页面,单击上传文件。如下:
先单击扫描文件选择需要上传的文件,再单击上传文件。如下:
完成上传有如下提示:
完成上述准备后,在EMR Serverless Spark页面,单击左侧的任务开发。单击新建。新建一个Application(批任务) > PySpark类型的任务,单击确定。如下:
配置以下信息,其余参数无需配置,然后单击运行。主Python资源选择前一个步骤中在资源上传页面上传的Python文件DataFrame.py;运行参数填写数据文件(employee.csv)上传到OSS的路径。如下:
运行任务后,在下方的运行记录区域,单击任务操作列的详情。在任务历史中的开发任务页面,您可以查看相关的日志信息。如下:
待任务运行完成后,单击右侧的发布,即可完成PySpark任务的发布。如下:
任务正常运行后,可以在Spark UI上查看任务的运行情况。在任务总览页签,单击Spark UI。如下:
在Spark Jobs页面,可以查看任务详情。如下:
任务发布完成后,我们就可以在工作流调度中使用了,在左侧导航栏中,单击任务编排。在任务编排页面,单击创建工作流。完成如下:
在任务编排页面,单击新建工作流的工作流名称。在工作流实例列表页面,单击手动运行。运行结果如下:
JAR任务
创建JAR任务的前提是已经有打包好的程序JAR文件,这里同样为了快速体验,直接使用官网提供的JAR文件。单击spark-examples_2.12-3.3.1.jar,直接下载测试JAR包。该JAR包是Spark自带的一个简单示例,用于计算圆周率π的值。
在EMR Serverless Spark页面,单击左侧导航栏中的资源上传。在资源上传页面,单击上传文件。如下:
新建一个Application(批任务) > JAR*类型的任务,然后单击确定。如下:
主jar资源选择前一个步骤中上传的JAR包;Main Class填写提交Spark任务时所指定的主类,这里填写org.apache.spark.examples.SparkPi。如下:
在任务历史中的开发任务页面,可以查看相关的日志信息。如下:
在Spark Jobs页面,同样可以查看任务详情。如下:
任务发布完成后,就可以进行任务调度了,在左侧导航栏中,单击任务编排。在任务编排页面,单击创建工作流。完成如下:
在任务编排页面,单击新建工作流的工作流名称。在工作流实例列表页面,单击手动运行。运行结果如下:
Spark Submit任务
相较于JAR任务,Spark Submit任务在资源上传这里存在差异,其他步骤一致。这里同样使用OSS控制台来上传JAR文件,如下:
完成JAR文件上传后,新建一个Application(批处理) > Spark Submit类型的任务,然后单击确定**。如下:
脚本这里填写Spark Submit脚本,语句如下:
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.memory=2g \
oss://emr-free/spark-examples_2.12-3.3.1.jar
在任务历史中的开发任务页面,可以查看相关的日志信息。如下:
在Spark Jobs页面,同样可以查看任务详情。如下:
任务发布完成后,就可以进行任务调度了,在左侧导航栏中,单击任务编排。在任务编排页面,单击创建工作流。完成如下:
在任务编排页面,单击新建工作流的工作流名称。在工作流实例列表页面,单击手动运行。运行结果如下:
经典实践
通过Serverless Spark提交PySpark流任务
首先需要在EMR on ECS上创建集群,首次使用需要先完成RAM授权。如下:
点击同意授权。如下:
单击创建集群。如下:
创建一个包含Kafka服务的实时数据流集群。如下:
接下来进行硬件配置,这里选择按量付费。如下:
填写集群名称并设置主机密码。如下:
确认信息,勾选协议,提交订单。如下:
当集群状态显示为运行中时,表明完成集群创建。如下:
从节点管理里可以看到每个节点的分布情况,如下:
集群创建完成后,登录EMR集群的Master节点104,执行如下命令:
#切换目录
cd /var/log/emr/taihao_exporter
#创建topic
#创建名为taihaometrics的Topic,分区数10,副本因子2。
kafka-topics.sh --partitions 10 --replication-factor 2 --bootstrap-server core-1-1:9092 --topic taihaometrics --create
#发送消息
# 使用kafka-console-producer发送消息到taihaometrics Topic。
tail -f metrics.log | kafka-console-producer.sh --broker-list core-1-1:9092 --topic taihaometrics
在EMR Serverless Spark页面,单击左侧导航栏中的网络连接。单击新增网络连接。如下:
输入新增连接的名称,选择与EMR集群相同的专有网络,选择与EMR集群部署在同一专有网络下的相同交换机。如下:
当状态显示为已成功时,表示新增网络连接成功。如下:
接下来需要为EMR集群添加安全组规则,在集群管理页面,单击目标集群的集群ID,在基础信息页面,单击集群安全组后面的链接,如下:
在安全组规则页面,单击手动添加,填写端口9092和EMR集群同属一个交换机的网段,然后单击保存。
接着需要上传kafka.zip中的所有JAR包至OSS,这里同样采用OSS控制台上传,如下:
完成上传,如下:
在EMR Serverless Spark页面,单击左侧导航栏中的资源上传,在上传文件对话框中,单击待上传文件区域选择pyspark_ss_demo.py文件。如下:
新建一个\Application(流任务)\ > *PySpark**类型的任务,然后单击确定。如下:
主Python资源选择前一个步骤中在资源上传页面上传的pyspark_ss_demo.py文件;运行参数填写EMR集群core-1-1节点的内网IP地址,这个信息可以在EMR集群的节点管理页面的Core节点组下查看。如下:
Spark配置*填写用于指定Spark任务运行时需要加载的外部JAR包路径,如下:
spark.jars oss://emr-free/kafka-lib/commons-pool2-2.11.1.jar,oss://emr-free/kafka-lib/kafka-clients-2.8.1.jar,oss://emr-free/kafka-lib/spark-sql-kafka-0-10_2.12-3.3.1.jar,oss://emr-free/kafka-lib/spark-token-provider-kafka-0-10_2.12-3.3.1.jar
spark.emr.serverless.network.service.name connection_to_emr_kafka
完成如上配置后,单击发布任务,如下:
点击前往运维,在任务编排,流式任务,点击启动。如下:
整个运行过程还是非常耗时的,在此期间,你可以通过集群监控查看节点的状态,如下:
由于流任务运行耗时会很长,对于按量付费的话花费就会较高,如果需要长期使用建议还是选用包年包月的计费方式。我这里采用按量付费方式完成任务共花费了30元,主要消耗在ECS。如下:
运行完成后,在Driver日志列表中,单击stdOut.log,可以看到应用程序执行的相关信息以及返回的结果。如下:
到这实践已完成。此外,官网还提供了其他实践,感兴趣的小伙伴可以点击前往进行了解并学习。如下:
通过Apache Airflow使用Livy Operator提交任务
通过Apache Airflow向EMR Serverless Spark提交任务
通过Jupyter Notebook的sparkmagic插件与Serverless Spark进行交互
在EMR Serverless Spark中实现MaxCompute读写操作
对比分析
OLAP(On-line Analytical Processing,联机分析处理)引擎是用于分析和查询大规模数据集的计算机处理技术,主要用于多维数据分析和数据挖掘。在市场上,存在多种OLAP引擎,如Apache Kylin、Apache Druid、ClickHouse、Presto、Spark SQL等,每种引擎都有其独特的特点和适用场景。如下我将从几个方面对比下Spark SQL与其他OLAP引擎有何优劣:
优点
功能强大
- Spark SQL:提供了丰富的SQL接口,支持复杂的查询和数据转换操作。同时,Spark SQL可以与其他Spark组件(如Spark Streaming、Spark MLlib)无缝集成,实现流处理、机器学习等多种功能。
- OLAP引擎集成:Spark SQL可以与多种OLAP引擎集成,如通过JDBC/ODBC连接Kylin、Druid等,实现数据的快速分析和查询。
性能优越
- 内存计算:Spark SQL利用内存计算的优势,可以显著提高查询性能。对于大数据集,Spark SQL可以比传统的磁盘I/O操作更快地完成数据分析和查询。
- 优化器:Spark SQL内置了先进的查询优化器,可以自动优化查询计划,提高查询效率。
可扩展性
- 分布式处理:Spark SQL支持分布式处理,可以通过增加节点来扩展计算能力,满足大规模数据分析和查询的需求。
- 资源隔离:在EMR Serverless Spark等环境中,可以实现资源的动态分配和隔离,提高资源利用率和系统的稳定性。
多协议支持
- JDBC/ODBC:Spark SQL支持JDBC/ODBC协议,方便与其他系统和应用集成。
- REST API:一些OLAP引擎提供了REST API接口,可以通过HTTP请求与这些引擎交互,实现数据的远程分析和查询。
高效并行
- 快速响应:由于Spark SQL采用内存计算和分布式处理,可以快速响应用户的查询请求。
- 并行处理:Spark SQL支持并行处理,可以充分利用多核CPU的计算能力,提高处理效率。
不足
虽然EMR Serverless Spark等环境提供了资源动态分配的功能,但在实际使用中,如何更精确地预测和管理资源需求仍然是一个挑战。
当下对于简单的插入和查询效率并不是很理想,对于一些复杂的查询操作,Spark SQL的查询优化器可能无法完全优化查询计划。此时,需要用户根据具体情况手动调整查询语句或优化查询计划。
虽然Spark SQL支持多种协议和接口与其他系统集成,但在实际部署和配置过程中可能会遇到一些兼容性和配置问题。需要用户具备相应的技术能力和经验来解决这些问题。
对于大规模分布式系统来说,监控和诊断是保障系统稳定性和性能的重要手段。然而,在EMR Serverless Spark等环境中,如何实现对Spark SQL作业和OLAP引擎的实时监控和诊断仍然是一个需要改进的地方。
体验总结
产品体验
在体验EMR Serverless Spark服务的过程中,非常明显的一点感受就是,拥有较为完善的产品内引导和文档帮助体系。官网不仅提供了详尽的入门指南、操作手册和API文档,其文档内容还非常清晰、结构合理,涵盖了从环境搭建、数据接入、任务开发到性能调优的各个环节。这些对于初次接触EMR Serverless Spark的用户来说非常友好。然而,尽管文档已经相当全面,但在某些高级功能和最佳实践方面,我认为还可以进一步加强引导。比如可以通过增加实战案例、视频教程或专家博客等形式,提供更加直观和深入的指导。
EMR Serverless Spark在功能方面表现较为出色,基本满足了我的预期。从接入便捷性来看,EMR Serverless Spark支持多种数据源接入,包括云上存储(如OSS、MaxCompute)和本地文件系统,用户只需简单配置即可实现数据的快速导入和导出。在数据开发体验方面,EMR Serverless Spark支持标准的Spark SQL和DataFrame API,开发者可以轻松上手并高效完成数据处理任务。同时,EMR Serverless Spark还提供了丰富的内置函数和UDF(用户自定义函数),进一步增强了数据处理能力。此外,在弹性伸缩方面,EMR Serverless Spark能够根据业务需求自动调整计算资源,实现按需付费和成本优化。当处理任务较重时,EMR Serverless Spark能够自动增加计算节点和内存资源,以确保任务顺利完成;当处理任务较少时,则会自动释放多余资源,以节省成本。
针对业务场景,我认为EMR Serverless Spark在以下几个方面还有改进空间或可以新增更多功能:
- 增强实时监控与预警功能:虽然EMR Serverless Spark已经提供了基本的监控功能,但建议增加更详细的性能指标监控和实时预警机制,以便用户能够及时发现并处理潜在的性能问题。
- 优化资源调度算法:在高并发场景下,资源调度算法的优化将直接影响任务的执行效率和响应时间。建议EMR Serverless Spark进一步优化其资源调度算法,确保在高负载情况下仍能保持稳定的性能表现。
- 增加更多内置数据分析工具:除了基本的数据处理功能外,还可以考虑增加更多内置的数据分析工具,如机器学习算法库、图计算引擎等,以满足用户多样化的数据分析需求。
EMR Serverless Spark与阿里云生态内的其他产品存在广泛的联动组合可能性。以下是我比较期待的几个具体的例子:
- 与MaxCompute联动:EMR Serverless Spark可以无缝接入MaxCompute数据源,实现冷热数据的分离存储和高效处理。用户可以在EMR Serverless Spark中进行实时或离线的数据处理任务,并将处理结果存储回MaxCompute中,以便后续的分析和挖掘。
- 与DataWorks联动:EMR Serverless Spark可以与DataWorks数据开发平台进行深度集成。用户可以在DataWorks中设计数据开发流程,并将部分处理任务交由EMR Serverless Spark执行。这种组合方式可以充分发挥DataWorks的流程管理和EMR Serverless Spark的数据处理能力优势,提升整体数据处理效率。
- 与Quick BI联动:EMR Serverless Spark处理后的数据可以通过Quick BI进行数据可视化展示。Quick BI提供了丰富的图表类型和交互功能,可以帮助用户更好地理解和分析数据。这种组合方式可以使得数据分析结果更加直观和易于理解。
将EMR Serverless Spark与其他服务连接起来,实现数据的快速流动和共享。这种集成能力不仅提高了数据处理效率,还降低了数据孤岛的风险。
在产品体检阶段,唯一让我感到不是很理想的就是,即使是一个很简单的建表和插入数据也是需要花费较长时间的。
实践体验
相较于自建Spark集群,EMR Serverless Spark产品有如下优势:
EMR Serverless Spark作为全托管服务,在稳定性方面表现出色。在实际测试中,即使在高并发查询场景下,EMR Serverless Spark依然能够保持良好的性能,响应时间稳定且波动较小。相比之下,自建Spark集群需要额外的硬件购买和维护成本,且在高并发场景下容易出现性能瓶颈和稳定性问题。
EMR Serverless Spark的计算性能强大,支持复杂的商业智能查询和大规模数据处理。与自建Spark集群相比,EMR Serverless Spark的响应时间更短,数据查询效率更高。这得益于其高效的资源调度和并行处理能力,能够充分利用云资源,提升数据处理速度。
EMR Serverless Spark作为全托管、一站式的数据计算产品,极大地降低了运维成本。企业无需自行购买硬件、建设数据中心和维护集群,只需关注数据分析本身即可。同时,EMR Serverless Spark提供了丰富的运维工具和功能,如任务调度、监控报警等,帮助用户更好地管理和优化数据处理流程。
EMR Serverless Spark采用按需付费模式,用户只需支付实际使用的资源费用。这种灵活的定价模型使得EMR Serverless Spark在成本方面具有明显优势。特别是对于那些需要处理大规模数据集但无法准确预测当前和未来工作负载的企业来说,EMR Serverless Spark能够显著降低IT成本。
如果从企业角度来谈,我觉得EMR Serverless Spark能带来的效益和成本主要体现如下:
使用EMR Serverless Spark服务可以给企业带来比较显著的收益。
首先,通过高效的数据分析和业务指标计算,企业能够更准确地了解用户需求和市场动态,从而优化产品功能和提升用户体验。
其次,EMR Serverless Spark降低了IT运维成本,使企业能够将更多资源投入到核心业务的发展中。
最后,EMR Serverless Spark的灵活性和可扩展性使得企业能够轻松应对业务增长和变化带来的挑战。