《Apache Spark的Lambda架构示例应用》要点:
本文介绍了Apache Spark的Lambda架构示例应用,希望对您有用。如果有疑问,可以联系我们。
【IT168 案例】目前,市场上很多玩家都已经成功构建了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标签的统计结果时,我们只必要将批量视图与实时视图合并起来. 所以输出应该如下所示:
场景
示例场景的简化步调如下:
1.通过Apache Spark创建批处置视图(.parquet)
2.在Apache Spark中缓存批处置视图
3.流应用法式连接到Twitter
4.实时监控#morningatlohika tweets
5.构建增量实时视图
6.查询,即合并批处置视图和实时视图
技术细节
源代码基于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,例如流处置系统:
编程之家PHP培训学院每天发布《Apache Spark的Lambda架构示例应用》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。