Apache Spark的Lambda架构示例应用
目前,市场上很多玩家都已经成功构建了MapReduce工作流程,每天可以处理TB级的历史数据,但是在MapReduce上跑数据分析真的太慢了。所以我们给大家介绍利用批处理和流处理方法的Lambda架构,本文中将利用Apache Spark(Core,SQL,Streaming),Apache Parquet,Twitter Stream等实时流数据快速访问历史数据。
Apache Hadoop简史
Apache Hadoop由 Apache Software Foundation 公司于 2005 年秋天作为Lucene的子项目Nutch的一部分正式引入。它受到最先由 Google Lab 开发的 Map/Reduce 和 Google File System(GFS) 的启发。它成为一个独立项目的时间已有10年。
目前已经有很多客户实施了基于Hadoop的M / R管道,并成功运行到现在:
Oozie的工作流每日运行处理150TB以上的数据并生成分析报告
Bash的工作流每日运行处理8TB以上的数据并生成分析报告
2016年来了!
2016年商业现实发生了变化,越快做出决策往往价值就会越大。另外,技术本身也在发展,Kafka,Storm,Trident,Samza,Spark,Flink,Parquet,Avro,云提供商等都成为了工程师们的流行语。
因此,现代基于Hadoop的M / R管道可能会是下图所示的这样:
图上的M/R通道看起来不错,但其实它本质上还是一个传统的批处理,有着传统批处理的缺点,当新的数据源源不断的进入系统中时,还是需要大量的时间来处理。
Lambda 架构
针对上面的问题,Nathan Marz提出了一个通用、可扩展和容错性强的数据处理架构即Lambda架构,它是通过利用批处理和流处理方法来处理大量数据的。Nathan Marz的书对从源码的角度对Lambda架构进行了详尽的介绍。
层结构
这是Lambda架构自上而下的层结构:
所有数据进入系统后都分派到批处理层和速度层进行处理。批处理层管理主数据集(一个不可变的,只可增加的原始数据集),并预先计算批处理视图。 服务层对批视图进行索引,以便可以进行低延迟的临时查询。 速度层仅处理最近的数据。所有的查询结果都必须合并批处理视图和实时视图的查询结果。
要点
许多工程师认为Lambda架构就只包含层结构和定义数据流程,但是Nathan Marz的书中为我们介绍了其它几个比较重要的点:
- 分布式思想
- 避免增量结构
- 数据的不变性
- 创建重新计算算法
- 数据的相关性
如前所述,任何查询结果都必须通过合并来自批处理视图和实时视图的结果,因此这些视图必须是可合并的。在这里要注意的一点是,实时视图是前一个实时视图和新数据增量的函数,因此这里使用增量算法,批处理视图是所有数据的函数,因此应该使用重新计算算法。
权衡
世间万物都是在不断妥协和权衡中发展的,Lambda结构也不例外。通常,我们需要解决几个主要的权衡:
完全重新计算 vs.部分重新计算
在有些情况下,可以使用Bloom过滤器来避免完全重新计算
重计算算法 vs. 增量算法
增量算法其实很具吸引力,但是有时根据指南,我们必须使用重计算算法,即便它很难得到相同的结果
加法算法 vs. 近似算法
虽然Lambda架构能够与加法算法很好地协同工作,但是在有些情况下更适合使用近似算法,例如使用HyperLogLog处理count-distinct问题。
实现
实现Lambda架构的方法有很多,因为每个层的底层解决方案是独立的。每个层需要底层实现的特定功能,有助于做出更好的选择并避免过度决策:
- 批量层:一次写入,批量读取多次
- 服务层:支持随机读取但不支持随机写入; 批量计算和批量写入
- 速度层:随机读写; 增量计算
例如,其中一个实现(使用Kafka,Apache Hadoop,Voldemort,Twitter Storm,Cassandra)可能如下所示:
Apache Spark
Apache Spark被视为在所有Lambda架构层上进行处理的集成解决方案。 其中Spark Core包含了高级API和支持常规执行图的优化引擎,SparkSQL用于SQL和结构化数据处理,Spark Streaming支持实时数据流的可扩展,高吞吐量,容错流处理。 当然,使用Spark进行批处理的价格可能比较高,而且也不是所有的场景和数据都适合。但是,总体来说Apache Spark是对Lambda架构的合理实现。
示例应用
我们创建一个示例应用程序来演示Lambda架构。这个示例的主要目的统计从某个时刻到现在此刻的#morningatlohika tweets哈希标签。
批处理视图
为了简单起见,假设我们的主数据集包含自时间开始以来的所有tweets。 此外,我们实现了一个批处理,创建了我们的业务目标所需的批处理视图,因此我们有一个预计算的批处理视图,其中包含与#morningatlohika一起使用的所有主题标记的统计信息:
因为数字方便记忆,所以我使用对应标签的英文单词的字母数目作为编号。
实时视图
当应用程序启动并运行时,有人发出了如下的tweet:
在这种情况下,正确的实时视图应包含以下标签及其统计信息(在我们的示例中为1,因为相应的hash标签只使用了一次):
查询
当终端用户查询hash标签的统计结果时,我们只需要将批量视图与实时视图合并起来。 所以输出应该如下所示:
场景
示例场景的简化步骤如下:
- 通过Apache Spark创建批处理视图(.parquet)
- 在Apache Spark中缓存批处理视图
- 流应用程序连接到Twitter
- 实时监控#morningatlohika tweets
- 构建增量实时视图
- 查询,即合并批处理视图和实时视图
技术细节
源代码基于Apache Spark 1.6.x,(在引入结构化流之前)。 Spark Streaming架构是纯微型批处理架构:
所以处理流应用程序时,我使用DStream连接使用TwitterUtils的Twitter:
在每个微批次(使用可配置的批处理间隔),对新的tweets中hashtags的统计信息的计算,并使用updateStateByKey()状态转换函数更新实时视图的状态。 为了简单起见,使用临时表将实时视图存储在存储器中。
查询服务反映批处理和实时视图的合并:
输出
文章开头提到的基于Hadoop的M/R管道使用Apache Spark来优化:
后记:
正如之前提到的Lambda Architecture有其优点和缺点,所以支持者和反对者都有。 有些人说批处理视图和实时视图有很多重复的逻辑,因为最终他们需要从查询角度创建可合并的视图。 所以他们创建了一个Kappa架构,并称其为Lambda架构的简化版。 Kappa架构系统是删除了批处理系统,取而代之的是通过流系统快速提供数据:
但即使在这种情况下,Kappa Architecture中也可以应用Apache Spark,例如流处理系统:
本文作者:佚名
来源:51CTO

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
网络架构之路(三) 单元测试
在带队的过程中,性能的问题还比较好解决,最消极的想法,“好啊,多一事不如少一事,你让我不管还不简单?”,但要求写测试代码,那就炸锅了!以我的经历,“测试驱动”是一个最具争议的话题,没有之一。吹捧者和反对者泾渭分明,而且都有大量的论据和证明。记得博客园曾经有一篇文章,大意是:“公司付钱给你不是让你写测试代码的”,下面一片狂赞。 在我自己的项目开始的时候,我是放弃了测试驱动的,里面总结得很准确,最大的原因是“懒”。但最后让我下定决心开始“测试驱动”实践的,是我一次花了两天一夜都没调出一个Bug,垂头丧气筋疲力尽之后,无可奈何的接受了这个现实:测试还是很有用的——即使是自己写的代码。我之前的系列博客,也已经反复的强调,架构是一种“无奈”,是现实是问题驱使你去做一些其实你本来不想做的事情。你无法理解一些看起来像“脱了裤子放屁”一样的行为,通常只是因为你没有遭遇过那些现实那些问题。(看看,大学能教你这些东西么?) 即使你没有多少开发经验,你也应该能够想象,单元测试最大的问题,就是它需要花时间花精力去写,那么这个花费是否值得呢?这还是由你架构的目标决定的,或者你的需求决定的。如果系统是一次成型交付...
- 下一篇
WOT博科聂小云:WLAN网络容量性能设计和优化
【51CTO.com原创稿件】就在上周,由51CTO主办的WOTA全球架构与运维技术峰会在北京富力万丽酒店隆重召开。本次WOTA设置了15大前沿热点技术论坛,60+来自Google、LinkedIn、Airbnb、百度、阿里巴巴、腾讯等海内外一线互联网公司的技术大咖将带来超过50个历经沉淀的架构实战心得与成功经验分享案例,携手打造历时2天的行业顶级技术盛会。 大会第二天下午在以“网络性能优化实践”为主题的D会场, 博科(Brocade)公司网络接入产品部门的技术经理聂小云进行了主题为《WLAN网络容量性能设计和优化》的精彩演讲。在会后,记者采访了他,请他分享了他在WLAN网络容量性能设计和优化方面的经验。 WiFi的演进之路 无线网络在中国发展这么多年,其网络性能、接入终端、用户需求都发生了天翻地覆的变化,聂小云将其变化归纳成三点: 一是无线网络的带宽越来越大,用户从最开始浏览网页、到收发邮件,再到现如今的视频传输,对无线网络带宽的需求越来越明显。 二是接入终端越来越多,WIFI本身承担的终端量密度越来越高。 三是对应用的安全性愈加重视,很多用户将安全看作是重点考虑方向。 如何规避Wi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS6,7,8上安装Nginx,支持https2.0的开启