Spark技术初探
作者:徐云鹏
来源:《智富时代》2015年第12期
【摘 要】Spark起源于美国加州大学AMPLab的大数据分析平台,它运用了内存计算方法,并包含数据仓库、流处理和图计算等多种计算范式。本文主要从运行机制和技术应用的角度初步探讨了Spark技术,并将其与Hadoop在关键技术上进行了对比分析,提出了Spark技术的不足及后续需解决的问题。
【关键词】Spark;HDFS;Hadoop;MapReduce 一、大数据技术简介
随着网络信息化时代的到来,我们无时无刻不在接收和处理数据。根据国际数据公司的研究结果,2008年全球产生的数据量为0.49ZB,2009年的数据量为0.8ZB,2011年增长为1.82ZB,到2013年则增长为4ZB。由此可见数据规模成爆炸式上涨趋势。
面对如此巨大的数据,传统分析处理方式已经无法满足数据存储和处理时间的要求。在此情况下,大数据技术应运而生。从数据的生命周期看,大数据从数据源经过分析挖掘到最终获得价值一般需要经过5个主要环节,包括数据准备、数据存储与管理、计算处理、数据分析和知识展现。而数据分析、计算和存储环节是大数据的核心。 (一)Hadoop技术原理简介
Hadoop是Apache下的一个开源项目,由HDFS、MapReduce、HBase、Hive和ZooKeeper等成员组成。其中HDFS和MapReduce是两个最基础最重要的成员。主要完成数据的存储和数据的分布式计算,从而解决了大数据的可靠存储和处理者两大核心问题。
HDFS是Google GFS的开源版本,是高度容错的分布式文件系统,它能够提供极高吞吐量的数据访问,适合用于海量PB级数据存储,它采用Master/Slave结构。NameNode维护集群内的元数据,对外提供创建、打开、删除和重命名文件或目录的功能。DataNode存储数据,并提负责处理数据的读写请求。MapReduce是大规模数据(TB级)计算的利器,Map和Reduce是它的主要思想,来源于函数式编程语言,它的原理如下图一所示。
Map负责将数据打散,Reduce负责对数据进行聚集,用户只需要实现map和reduce两个接口,即可完成TB级数据的计算。Hadoop的MapReduce的实现也采用了Master/Slave结构。Master叫做JobTracker,而Slave叫做TaskTracker。用户提交的计算叫做Job(作业),每一个Job会被划分成若干个Tasks。JobTracker负责Job和Tasks的调度,而TaskTracker负责执行Tasks。
龙源期刊网 http://www.qikan.com.cn
(二)Spark技术原理简介
Spark是一个基于内存计算的开源运算系统,目的是更快速地进行数据分析。Spark提供了与MapReduce相似的分散式运算框架,但基于内存和优化设计,因此在交换式数据分析和挖掘中表现更好。由于Spark具有的高性能、高灵活性、与Hadoop生态系统完美融合等多方面的特点,2014年以后引起了广泛的关注,Spark开源码生态系统大幅增长,成为大数据范畴最活跃的开源码项目之一。
首先,Spark对分散的数据集进行抽样,提出RDD(Resilient Distributed Dataset)概念,所有的统计分析任务被翻译成对RDD的基本操作组成的有向无环图(DAG)。RDD可以被驻留在内存中,往后的任务可以直接读取内存中的数据;同时分析DAG中任务之间的依赖性可以把相邻的任务合并,从而减少了大量不准确的结果输出,极大降低了磁盘I/O,使复杂数据分析任务更高效。
其次,Spark是一个灵活的运算框架,适合做批次处理、工作流、交互式分析、流量处理等不同类型的应用,因此Spark也可以成为一个用途广泛的运算引擎,并不断在影响着MapReduce的地位。
最后,Spark可以与Hadoop生态系统的很多组件互相操作。Spark可以运行在新一代资源管理框架YARN上,它还可以读取已有并存放在Hadoop上的数据,这是个非常大的优势。在Spark运行框架中,有集群资源管理服务(Cluster Manager)、运行作业任务的结点(Worker Node),每个应用的任务控制结点Driver和每个机器节点上有具体任务的执行进程(Executor)。
与MapReduce框架相比,Executor有二个优点:一个是多线程来执行具体的任务,而不是像MapReduce那样采用进程模型,减少了任务的启动开稍。二个是Executor上的
BlockManager存储模块,相当于key-value系统,当需要多轮迭代时,可以将中间过程的数据先放到这个存储系统上,避免频繁访问文件系统里,提高读写IO性能。
由于Spark采用Scala编写,因此在表达复杂的机器学习算法能力比其他语言更强且简单易懂。提供各种操作函数来建立起RDD的DAG计算模型。把每一个操作都看成构建一个RDD来对待,而RDD则表示的是分布在多台机器上的数据集合,并且可以带上各种操作函数。
二、Spark同Hadoop的关系
Spark是一个通用的并行计算框架,无论对比内存或磁盘上的MapReduce都要更加高效,同时Spark有一个高级的DAG执行引擎,支持循环迭代的数据流和内存中的计算。Spark是MapReduce的替代方案,而且兼容HDFS、Hive等分布式存储层,可融入Hadoop的生态系统,以弥补缺失MapReduce的不足。Spark相比MapReduce有以下优势。
龙源期刊网 http://www.qikan.com.cn
(一)中间结果输出
基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任务管道承接的考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。
Spark将执行模型抽象为通用的有向无环图执行计划(DAG),这可以将多Stage的任务串联或者并行执行,而无须将Stage中间结果输出到HDFS中。 (二)数据格式和内存布局
由于MapReduce Schema on Read处理方式会引起较大的处理开销。Spark抽象出分布式内存存储结构弹性分布式数据集RDD,进行数据的存储。RDD能支持粗粒度写操作,但对于读取操作,RDD可以精确到每条记录,这使得RDD可以用来作为分布式索引。Spark的特性是能够控制数据在不同节点上的分区,用户可以自定义分区策略,如Hash分区等。Spark SQL在Spark的基础上实现了列存储和列存储压缩。 (三)执行策略
MapReduce在数据Shuffle之前花费了大量的时间来排序,Spark则可减轻上述问题带来的开销。因为Spark任务在Shuffle中不是所有情境都需要排序,所以支持基于Hash的分布式聚合,调度中采用更为通用的任务执行计划图(DAG),每一轮次的输出结果在内存缓存。 (四)任务调度的开销
传统的Hadoop系统是为了运行长达数小时的批量作业而设计的,在某些极端情况下,提交一个任务的延迟非常高。Spark采用了事件驱动的类库AKKA来启动任务,通过线程池来避免进程或线程启动和切换开销。 三、Spark技术的应用
目前大数据在互联网公司主要应用在广告、报表、推荐系统等业务上,这些应用场景的普遍特点是计算量大、效率要求高。Spark恰恰满足了这些要求,本章将列举一些Spark应用的成功案例。 (一)腾讯
广点通是最早使用Spark的应用之一。腾讯通过Spark快速迭代的优势,围绕“数据+算法+系统”这套技术方案,实现了在“数据实时采集、算法实时训练、系统实时预测”的全流程实时并行高维算法,最终成功应用于广点通pCTR投放系统上,支持每天上百亿的请求量。
龙源期刊网 http://www.qikan.com.cn
基于日志数据的快速查询系统业务构建于Spark之上的Shark,利用其快速查询以及内存表等优势,承担了日志数据的即席查询工作。在性能方面,普遍比Hive高2-10倍,如果使用内存表的功能,性能将会比Hive快百倍。 (二)淘宝
阿里搜索和广告业务,最初使用Mahout或者自己写的MapReduce来解决复杂的机器学习,导致效率低而且代码不易维护。淘宝技术团队使用了Spark来解决多次迭代的机器学习算法、高计算复杂度的算法等。将Spark运用于淘宝的推荐相关算法上,同时还利用Graphx解决了许多生产问题。 四、结束语
虽然Spark相比Hadoop具有很多优点,但从Spark的发展和应用现状来看,Spark也存在一些缺陷。在稳定性方面,由于代码质量问题,Spark长时间运行会经常出错,在架构方面,由于大量数据被缓存在内存中,Java回收垃圾缓慢的情况严重,导致Spark性能不稳定。其次,Spark支持的SQL语法完整程度不能应用在复杂数据分析中。目前Spark活跃在
Cloudera、MapR、等众多知名大数据公司,相信随着技术不断发展,Spark会逐步优化,以适应行业发展需要。
因篇幅问题不能全部显示,请点此查看更多更全内容