1.1 什么是Spark
说起大数据,很多人会想起Doug Cutting以自己儿子玩具小象命名的开源项目Hadoop。Hadoop解决了大多数批处理工作负载问题,成为了大数据时代企业的首选技术。但随着大数据时代不可逆的演进,人们发现,由于一些限制,Hadoop对一些工作负载并不是最优选择,比如:
缺少对迭代的支持;
中间数据需输出到硬盘存储,产生了较高的延迟。
探其究竟,MapReduce设计上的约束比较适合处理离线数据,在实时查询和迭代计算上存在较大的不足,而随着具体业务的发展,业界对实时查询和迭代计算有更多的需求。
2009年,美国加州大学伯克利分校实验室小伙伴们基于AMPLab的集群计算平台,立足内存计算,从多迭代批量处理出发,兼顾数据仓库、流处理、机器学习和图计算等多种计算范式,正式将Spark作为研究项目,并于2010年进行了开源。
什么是Spark?Spark作为Apache顶级的开源项目,是一个快速、通用的大规模数据处理引擎,和Hadoop的MapReduce计算框架类似,但是相对于MapReduce,Spark凭借其可伸缩、基于内存计算等特点,以及可以直接读写Hadoop上任何格式数据的优势,进行批处理时更加高效,并有更低的延迟。相对于“one stack to rule them all”的目标,实际上,Spark已经成为轻量级大数据快速处理的统一平台,各种不同的应用,如实时流处理、机器学习、交互式查询等,都可以通过Spark建立在不同的存储和运行系统上,下面我们来具体认识一下Spark。
1.1.1 概述
随着互联网的高速发展,以大数据为核心的计算框架不断出现,从支持离线的MapReduce席卷全球,到支持在线处理的Storm异军突起,支持迭代计算的Spark攻城拔寨,支持高性能数据挖掘的MPI深耕细作。各种框架诞生于不同的实验室或者公司,各有所长,各自解决了某一类问题,而在一些互联网公司中,百家争鸣,各种框架同时被使用,比如作者所在公司的大数据团队,模型训练和数据处理采用MapReduce框架(包括基于Hive构建的数据仓库查询的底层实现),实时性要求较高的线上业务采取Storm,日志处理以及个性化推荐采取Spark,这些框架都部署在统一的数据平台上,共享集群存储资源和计算资源,形成统一的轻量级弹性计算平台。
1.1.2 Spark大数据处理框架
相较于国内外较多的大数据处理框架,Spark以其低延时的出色表现,正在成为继Hadoop的MapReduce之后,新的、最具影响的大数据框架之一,图1-1所示为以Spark为核心的整个生态圈,最底层为分布式存储系统HDFS、Amazon S3、Hypertable,或者其他格式的存储系统(如HBase);资源管理采用Mesos、YARN等集群资源管理模式,或者Spark自带的独立运行模式,以及本地运行模式。在Spark大数据处理框架中,Spark为上层多种应用提供服务。例如,Spark SQL提供SQL查询服务,性能比Hive快3~50倍;MLlib提供机器学习服务;GraphX提供图计算服务;Spark Streaming将流式计算分解成一系列短小的批处理计算,并且提供高可靠和吞吐量服务。值得说明的是,无论是Spark SQL、Spark Streaming、GraphX还是MLlib,都可以使用Spark核心API处理问题,它们的方法几乎是通用的,处理的数据也可以共享,不仅减少了学习成本,而且其数据无缝集成大大提高了灵活性。
基于Hadoop的资源管理器YARN实际上是一个弹性计算平台,作为统一的计算资源管理框架,不仅仅服务于MapReduce计算框架,而且已经实现了多种计算框架进行统一管理。这种共享集群资源的模式带来了很多好处。
资源利用率高。多种框架共享资源的模式有效解决了由于应用程序数量的不均衡性导致的高峰时段任务比较拥挤,空闲时段任务比较空闲的问题;同时均衡了内存和CPU等资源的利用。
实现了数据共享。随着数据量的增加,数据移动成本越来越高,网络带宽、磁盘空间、磁盘IO都会成为瓶颈,在分散数据的情况下,会造成任务执行的成本提高,获得结果的周期变长,而数据共享模式可以让多种框架共享数据和硬件资源,大幅度减少数据分散带来的成本。
有效降低运维和管理成本。相比较一种计算框架需要一批维护人员,而运维人员较多又会带来的管理成本的上升;共享模式只需要少数的运维人员和管理人员即可完成多个框架的统一运维管理,便于运维优化和运维管理策略统一执行。
总之,Spark凭借其良好的伸缩性、快速的在线处理速度、具有Hadoop基因等一系列优势,迅速成为大数据处理领域的佼佼者。Apache Spark已经成为整合以下大数据应用的标准平台:
交互式查询,包括SQL;
实时流处理;
复杂的分析,包括机器学习、图计算;
批处理。
1.1.3 Spark的特点
作为新一代轻量级大数据快速处理平台,Spark具有以下特点:
快速。Spark有先进的DAG执行引擎,支持循环数据流和内存计算;Spark程序在内存中的运行速度是Hadoop MapReduce运行速度的100倍,在磁盘上的运行速度是Hadoop MapReduce运行速度的10倍,如图1-2所示。
易用。Spark支持使用Java、Scala、Python语言快速编写应用,提供超过80个高级运算符,使得编写并行应用程序变得容易。
通用。Spark可以与SQL、Streaming以及复杂的分析良好结合。基于Spark,有一系列高级工具,包括Spark SQL、MLlib(机器学习库)、GraphX和Spark Streaming,支持在一个应用中同时使用这些架构,如图1-3所示。
Spark可以指定Hadoop,YARN的版本来编译出合适的发行版本,Spark也能够很容易地运行在EC2、Mesos上,或以Standalone模式运行,并从HDFS、HBase、Cassandra和其他Hadoop数据源读取数据。
1.1.4 Spark应用场景
Spark使用了内存分布式数据集,除了能够提供交互式查询外,还优化了迭代工作负载,在Spark SQL、Spark Streaming、MLlib、GraphX都有自己的子项目。在互联网领域,Spark在快速查询、实时日志采集处理、业务推荐、定制广告、用户图计算等方面都有相应的应用。国内的一些大公司,比如阿里巴巴、腾讯、Intel、网易、科大讯飞、百分点科技等都有实际业务运行在Spark平台上。下面简要说明Spark在各个领域中的用途。
快速查询系统,基于日志数据的快速查询系统业务构建于Spark之上,利用其快速查询以及内存表等优势,能够承担大部分日志数据的即时查询工作;在性能方面,普遍比Hive快2~10倍,如果使用内存表的功能,性能将会比Hive快百倍。
实时日志采集处理,通过Spark Streaming实时进行业务日志采集,快速迭代处理,并进行综合分析,能够满足线上系统分析要求。
业务推荐系统,使用Spark将业务推荐系统的小时和天级别的模型训练转变为分钟级别的模型训练,有效优化相关排名、个性化推荐以及热点点击分析等。
定制广告系统,在定制广告业务方面需要大数据做应用分析、效果分析、定向优化等,借助Spark快速迭代的优势,实现了在“数据实时采集、算法实时训练、系统实时预测”的全流程实时并行高维算法,支持上亿的请求量处理;模拟广告投放计算效率高、延迟小,同MapReduce相比延迟至少降低一个数量级。
用户图计算。利用GraphX解决了许多生产问题,包括以下计算场景:基于度分布的中枢节点发现、基于最大连通图的社区发现、基于三角形计数的关系衡量、基于随机游走的用户属性传播等。