使用Apache Spark和MySQL打造强大的数据分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

借助真实案例和代码样本,本文作者展示了如何将Sparke和MySQL结合起来,创造数据分析上的强大工具。

Apache Spark是一个类似Apache Hadoop的集群计算框架,在Wikipedia上有大量描述:Apache Spark是一个开源集群计算框架,出自加州大学伯克利分校的AMPLab,后被捐赠给了Apache软件基金会。

相对于Hadoop基于磁盘的两段式MapReduce规范,Spark基于内存的多段式基元在特定应用上表现要优出100倍。Spark允许用户程序将数据加载到集群内存中反复查询,非常适合机器学习算法。

Apache Spark

与流行的看法相反,Spark不需要将所有数据存入内存,但会使用缓存来加速操作(就像MySQL那样)。Spark也能独立运行而无需Hadoop,并可以运行在单独一台服务器上(甚至笔记本或台式机上),并充分利用所有CPU内核。开启它并使用分布式模式真的很简单。先打开master,在同一个节点上运行slave:

然后在任何额外的节点上运行Spark worker(确定向/etc/hosts 添加了hostname或者使用DNS):

为什么用Spark而不是MySQL?

在很多任务中MySQL(开箱即用的)表现并不太好。MySQL的限制之一在于:1次查询=1个CPU内核。也就是说,即便你有48个速度飞快的内核,外加一个大型数据集可用,也无法充分利用所有的计算能力,相反Spark却能充分使用CPU内核。

MySQL与Spark的另一差异在于:

l MySQL使用所谓的“写时模式(schema on write)”——需要将数据转化到MySQL中,如果未包含在MySQL里,就无法使用sql来查询。

l Spark(还有Hadoop/Hive)使用“读时模式(schema on read)”——比如在一个压缩txt文件顶部使用表格结构(或者其他支持的输入格式),将其看作表格;然后我们可以用SQL来查询这个“表格”。

也就是说,MySQL负责存储+处理,而Spark只负责处理,并可直接贯通数据与外部数据集(Hadoop、Amazon S3,本地文件、JDBC MySQL或其他数据集)的通道。Spark支持txt文件(压缩的)、SequenceFile、其他Hadoop输入格式和Parquet列式存储。相对Hadoop来说,Spark在这方面更为灵活:例如Spark可以直接从MySQL中读取数据。

向MySQL加载外部数据的典型管道(pipeline)是:

1、 解压缩(尤其是压缩成txt文件的外部数据);

2、用“LOAD DATA INFILE”命令将其加载到MySQL的存储表格中;

3、只有这样,我们才能筛选/进行分组,并将结果保存到另一张表格中。

这会导致额外的开销;在很多情况下,我们不需要“原始”数据,但仍需将其载入MySQL中。

为什么将Spark与MySQL用在一起:

相反,我们的分析结果(比如聚合数据)应当存在MySQL中。将分析结果存在MySQL中并非必要,不过更为方便。假设你想要分析一个大数据集(即每年的销售额对比),需要使用表格或图表的形式展现出来。由于会进行聚合,结果集将会小很多,将其存在MySQL中与很多标准程序一同协作处理将会容易许多。

真实案例

一个有趣的免费数据集是Wikipedia的页数(从2008年启用后到现在,压缩后大于1TB)。这个数据可以下载(压缩空间确定txt文件),在AWS上也是可用的(有限数据集)。数据以小时聚合,包括以下字段:

l项目(比如en,fr等,通常是一种语言)

l页头(uri),采用urlencode编码

l请求数

l返回内容的大小

(数据字段编译到了文件名中,每小时1个文件)

我们的目标是:找出英文版wiki中每日请求数位居前10的页面,不过还要支持对任意词的搜索,方便阐释分析原理。例如,将2008到2015年间关于“Myspace”和“Facebook”的文章请求数进行对比。使用MySQL的话,需要将其原封不动的载入MySQL。所有文件按内置的日期编码分布。解压的总大小大于10TB。下面是可选的步骤方案(典型的MySQL方式):

1、解压文件并运行“LOAD DATA INFILE”命令,将其录入临时表格:

2、“插入到”最终的表格,进行聚合:

3、通过url解码标题(可能用到UDF)。

开销很大:解压并将数据转化为MySQL格式,绝大部分都会被丢弃,作为损耗。

根据我的统计,整理6年来的数据需耗时超过1个月,还不包括解压时间,随着表格逐渐变大、索引需要更新所带来的加载时间折损。当然,有很多办法可以加速这一过程,比如载入不同的MySQL实例、首先载入内存表格再集合成InnoDB等。

不过最简单的办法是使用Apache Spark和Python脚本(pyspark)。Pyspark可以读出原始的压缩txt文件,用SQL进行查询,使用筛选、类似urldecode函数等,按日期分组,然后将结果集保存到MySQL中。

下面是执行操作的Python脚本:

在脚本中用到了Spark来读取原始压缩文件(每次一天)。我们可以使用目录作为“输入”或者文件列表。然后用弹性分布式数据集(RDD)转化格式;Python包含lambda函数映射和筛选,允许我们将“输入文件”分离并进行筛选。

下一步是应用模式(declare fields);我们还能使用其他函数,比如用urllib.unquote来解码标题(urldecode)。最终,我们可以注册临时表格,然后使用熟悉的SQL来完成分组。

该脚本可以充分利用CPU内核。此外,即便不使用Hadoop,在分布式环境中运行也非常简易:只要将文件复制到SparkNFS/外部存储。

该脚本花了1个小时,使用了三个box,来处理一个月的数据,并将聚合数据加载到MySQL上(单一实例)。我们可以估出:加载全部6年的(聚合)数据到MySQL上需要大约3天左右。

你可能会问,为什么现在要快得多(而且实现了同样的实例)。答案是:管道不同了,而且更为有效。在我们起初的MySQL管道中,载入的是原始数据,需要大约数月时间完成。而在本案例中,我们在读取时筛选、分组,然后只将需要的内容写入MySQL。

这里还有一个问题:我们真的需要整个“管道”吗?是否可以简单地在“原始”数据之上运行分析查询?答案是:确实有可能,但是也许会需要1000个节点的Spark集群才能奏效,因为需要扫描的数据量高达5TB(参见下文中的“补充”)。

MySQL Inserts的多线程表现

通过使用group_res.write.jdbc(url=mysql_url, table=”wikistats.wikistats_by_day_spark”, mode=”append”) ,Spark会启动多线程插入。

监控你的工作

Spark提供了web接口,方便对工作进行监控管理。样例如下:运行wikistats.py application:

结果:使用Parquet分列格式与MySQL InnoDB表格

Spark支持Apache Parquet分列格式,因此我们可以将RDD存储为parquet文件(存入HDFS时可以保存到目录中):

我们将管道结果(聚合数据)存入Spark。这次使用了按天分区(“mydate=20080101”),Spark可以在这种格式中自动发现分区。得到结果后要进行查询。假设我们想要找到2018年1月查询最频繁的10大wiki页面。可以用MySQL进行查询(需要去掉主页和搜索页):

请注意,我们已经使用了聚合(数据汇总)表格,而不是“原始”数据。我们可以看到,查询花了1小时22分钟。由于将同样的结果存入了Parquet(见脚本)中,现在可以在Spark-SQL中使用它了:

这将用到spark-sql的本地版本,而且只用到1个主机。


耗时大约20分钟,比之前更快。

结论

Apache Spark是分析和聚合数据的好办法,而且非常简便。我喜欢Spark与其他大数据还有分析框架的原因在于:

l开源与积极开发

l不依赖工具,例如输入数据与输出数据不一定非要借助Hadoop

l独立模式,启动迅速,易于部署

l大规模并行,易于添加节点

l支持多种输入与输出格式;比如可以读取/写入MySQL(Java数据库连接驱动)与Parquet分列格式

但是,也有很多缺点:

l技术太新,会有一些bug和非法行为。很多错误难以解释。

l需要Java;Spark 1.5仅支持Java 7及以上版本。这也意味着需要额外内存——合情合理。

l你需要通过“spark-submit”来运行任务。

我认为作为工具,Apache Spark十分不错,补足了MySQL在数据分析与商业智能方面的短板。


本文作者:佚名

来源:51CTO

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
52 3
|
1月前
|
SQL DataWorks 关系型数据库
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
|
2月前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
51 1
|
4月前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
57 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
4月前
|
前端开发 数据挖掘 关系型数据库
基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui
本文介绍了一个基于Python的哔哩哔哩数据分析系统,该系统使用Flask框架、MySQL数据库、echarts数据可视化技术和Layui前端框架,旨在提取和分析哔哩哔哩用户行为数据,为平台运营和内容生产提供科学依据。
260 9
|
4月前
|
存储 数据采集 数据可视化
基于Python flask+MySQL+echart的电影数据分析可视化系统
该博客文章介绍了一个基于Python Flask框架、MySQL数据库和ECharts库构建的电影数据分析可视化系统,系统功能包括猫眼电影数据的爬取、存储、展示以及电影评价词云图的生成。
156 1
|
4月前
|
分布式计算 Hadoop 大数据
大数据处理框架在零售业的应用:Apache Hadoop与Apache Spark
【8月更文挑战第20天】Apache Hadoop和Apache Spark为处理海量零售户数据提供了强大的支持
66 0
|
4月前
|
分布式计算 Serverless 数据处理
EMR Serverless Spark 实践教程 | 通过 Apache Airflow 使用 Livy Operator 提交任务
Apache Airflow 是一个强大的工作流程自动化和调度工具,它允许开发者编排、计划和监控数据管道的执行。EMR Serverless Spark 为处理大规模数据处理任务提供了一个无服务器计算环境。本文为您介绍如何通过 Apache Airflow 的 Livy Operator 实现自动化地向 EMR Serverless Spark 提交任务,以实现任务调度和执行的自动化,帮助您更有效地管理数据处理任务。
219 0
|
5月前
|
分布式计算 Apache Spark
|
6月前
|
分布式计算 大数据 数据处理
Apache Spark在大数据处理中的应用
Apache Spark是大数据处理的热门工具,由AMPLab开发并捐赠给Apache软件基金会。它以内存计算和优化的执行引擎著称,提供比Hadoop更快的处理速度,支持批处理、交互式查询、流处理和机器学习。Spark架构包括Driver、Master、Worker Node和Executor,核心组件有RDD、DataFrame、Dataset、Spark SQL、Spark Streaming、MLlib和GraphX。文章通过代码示例展示了Spark在批处理、交互式查询和实时数据处理中的应用,并讨论了其优势(高性能、易用性、通用性和集成性)和挑战。【6月更文挑战第11天】
174 6

热门文章

最新文章

推荐镜像

更多