1.5 Spark的企业级应用
随着企业数据量的增长,对大数据的处理和分析已经成为企业的迫切需求。Spark作为Hadoop的替代者,引起学术界和工业界的普遍兴趣,大量应用在工业界落地,许多科研院校开始了对Spark的研究。
在学术界,Spark得到各院校的关注。Spark源自学术界,最初是由加州大学伯克利分校的AMPLab设计开发。国内的中科院、中国人民大学、南京大学、华东师范大学等也开始对Spark展开相关研究。涉及Benchmark、SQL、并行算法、性能优化、高可用性等多个方面。
在工业界,Spark已经在互联网领域得到广泛应用。互联网用户群体庞大,需要存储大数据并进行数据分析,Spark能够支持多范式的数据分析,解决了大数据分析中迫在眉睫的问题。例如,国外Cloudera、MapR等大数据厂商全面支持Spark,微策略等老牌BI厂商也和Databricks达成合作关系,Yahoo!使用Spark进行日志分析并积极回馈社区,Amazon在云端使用Spark进行分析。国内同样得到很多公司的青睐,淘宝构建Spark on Yarn进行用户交易数据分析,使用GraphX进行图谱分析。网易用Spark和Shark对海量数据进行报表和查询。腾讯使用Spark进行精准广告推荐。
下面将选取代表性的Spark应用案例进行分析,以便于读者了解Spark在工业界的应用状况。
1.5.1 Spark在Amazon中的应用
亚马逊云计算服务AWS(Amazon Web Services)提供IaaS和PaaS服务。Heroku、Netflix等众多知名公司都将自己的服务托管其上。AWS以Web服务的形式向企业提供IT基础设施服务,现在通常称为云计算。云计算的主要优势是能够根据业务发展扩展的较低可变成本替代前期资本基础设施费用。利用云,企业无须提前数周或数月来计划和采购服务器及其他IT基础设施,即可在几分钟内即时运行成百上千台服务器,并更快达成结果。
1.亚马逊AWS云服务的内容
目前亚马逊在EMR中提供了弹性Spark服务,用户可以按需动态分配Spark集群计算节点,随着数据规模的增长,扩展自己的Spark数据分析集群,同时在云端的Spark集群可以无缝集成亚马逊云端的其他组件,一起构建数据分析流水线。
亚马逊云计算服务AWS提供的服务包括:亚马逊弹性计算云(Amazon EC2)、亚马逊简单存储服务(Amazon S3)、亚马逊弹性MapReduce(Amazon EMR)、亚马逊简单数据库(Amazon SimpleDB)、亚马逊简单队列服务(Amazon Simple Queue Service)、Amazon DynamoDB以及Amazon CloudFront等。基于以上的组件,亚马逊开始提供EMR上的弹性Spark服务。用户可以像之前使用EMR一样在亚马逊动态申请计算节点,可随着数据量和计算需求来动态扩展计算资源,将计算能力水平扩展,按需进行大数据分析。亚马逊提供的云服务中已经支持使用Spark集群进行大数据分析。数据可以存储在S3或者Hadoop存储层,通过Spark将数据加载进计算集群进行复杂的数据分析。
亚马逊AWS架构如图1-7所示。
图1-7 亚马逊AWS架构
2.亚马逊的EMR中提供的3种主要组件
□Master Node:主节点,负责整体的集群调度与元数据存储。
□Core Node:Hadoop节点,负责数据的持久化存储,可以动态扩展资源,如更多的CPU Core、更大的内存、更大的HDFS存储空间。为了防止HDFS损坏,不能移除Core Node。
□Task Node:Spark计算节点,负责执行数据分析任务,不提供HDFS,只负责提供计算资源(CPU和内存),可以动态扩展资源,可以增加和移除Task Node。
3.使用Spark on Amazon EMR的优势
□构建速度快:可以在几分钟内构建小规模或者大规模Spark集群,以进行数据分析。
□运维成本低:EMR负责整个集群的管理与控制,EMR也会负责失效节点的恢复。
□云生态系统数据处理组件丰富:Spark集群可以很好地与Amazon云服务上的其他组件无缝集成,利用其他组件构建数据分析管道。例如,Spark可以和EC2 Spot Market、Amazon Redshift、Amazon Data pipeline、Amazon CloudWatch等组合使用。
□方便调试:Spark集群的日志可以直接存储到Amazon S3中,方便用户进行日志分析。
综合以上优势,用户可以真正按需弹性使用与分配计算资源,实现节省计算成本、减轻运维压力,在几分钟内构建自己的大数据分析平台。
4.Spark on Amazon EMR架构解析
通过图1-8可以看到整个Spark on Amazon EMR的集群架构。下面以图1-8为例,分析用户如何在应用场景使用服务。
图1-8 Amazon Spark on EMR
构建集群,首先创建一个Master Node作为集群的主节点。之后创建两个Core Node存储数据,两个Core Node总共有32GB的内存。但是这些内存是不够Spark进行内存计算的。接下来动态申请16个Task Node,总共256GB内存作为计算节点,进行Spark的数据分析。
当用户开始分析数据时,Spark RDD的输入既可以来自Core Node中的HDFS,也可以来自Amazon S3,还可以通过输入数据创建RDD。用户在RDD上进行各种计算范式的数据分析,最终可以将分析结果输出到Core Node的HDFS中,也可以输出到Amazon S3中。
5.应用案例:构建1000个节点的Spark集群
读者可以通过下面的步骤,在Amazon EMR上构建自己的1000个节点的Spark数据分析平台。
1)启动1000个节点的集群,这个过程将会花费10~20分钟。
./elas2c-mapreduce --create –alive --name "Spark/Shark Cluster" \ --bootstrap-ac2on s3://elasBcmapreduce/samples/spark/0.8.1/install-spark-shark.sh --bootstrap-name "Spark/Shark" --instance-type m1.xlarge --instance-count 1000
2)如果希望继续动态增加计算资源,可以输入下面命令增加Task Node。
--add-instance-group TASK --instance-count INSTANCE_COUNT --instance-type INSTANCE_TYPE
执行完步骤1)或者1)、2)后,集群将会处于图1-9所示的等待状态。
图1-9 集群细节监控界面
进入管理界面http://localhost:9091可以查看集群资源使用状况;进入http://localhost:8080可以观察Spark集群的状况。Lynx界面如图1-10所示。
3)加载数据集。
示例数据集使用Wiki文章数据,总量为4.5TB,有1万亿左右记录。Wiki文章数据存储在S3中,下载地址为s3://bigdata-spark-demo/wikistats/。
下面创建wikistats表,将数据加载进表:
create external table wikistats ( projectcode string, pagename string, pageviews int, pagesize int ) ROW FORMAT DELIMITED FIELDS TERMINTED BY" LOCATION 's3n://bigdata-spark-demo/wikistats/'; ALTER TABLE wikistats add partition(dt='2007-12')location 's3n://bigdata-spark demo//wikistats/2007/2007-12'; ......
图1-10 Lynx界面
4)分析数据。
使用Shark获取2014年2月的Top 10页面。用户可以在Shark输入下面的SQL语句进行分析。
Select pagename,sum(pageviews)c from wikistats_cached where dt='2014-01' group by pagename order by c desc limit 10;
这个语句大致花费26s,扫描了250GB的数据。
云计算带来资源的按需分配,用户可以采用云端的虚机作为大数据分析平台的底层基础设施,在上端构建Spark集群,进行大数据分析。随着处理数据量的增加,按需扩展分析节点,增加集群的数据分析能力。
1.5.2 Spark在Yahoo!的应用
在Spark技术的研究与应用方面,Yahoo!始终处于领先地位,它将Spark应用于公司的各种产品之中。移动App、网站、广告服务、图片服务等服务的后端实时处理框架均采用了Spark+Shark的架构。
在2013年,Yahoo!拥有72656600个页面,有上百万的商品类别,上千个商品和用户特征,超过800万用户,每天需要处理海量数据。
通过图1-11可以看到Yahoo!使用Spark进行数据分析的整体架构。
图1-11 Yahoo!大数据分析栈
大数据分析平台架构解析如下。
整个数据分析栈构建在YARN之上,这是为了让Hadoop和Spark的任务共存。主要包含两个主要模块:
1)离线处理模块:使用MapReduce和Spark+Shark混合架构。由于MapReduce适合进行ETL处理,还保留Hadoop进行数据清洗和转换。数据在ETL之后加载进HDFS/HCat/Hive数据仓库存储,之后可以通过Spark、Shark进行OLAP数据分析。
2)实时处理模块:使用Spark Streaming+Spark+Shark架构进行处理。实时流数据源源不断经过Spark Steaming初步处理和分析之后,将数据追加进关系数据库或者NoSQL数据库。之后,结合历史数据,使用Spark进行实时数据分析。
之所以选择Spark,Yahoo!基于以下几点进行考虑。
1)进行交互式SQL分析的应用需求。
2)RAM和SSD价格不断下降,数据分析实时性的需求越来越多,大数据急需一个内存计算框架进行处理。
3)程序员熟悉Scala开发,接受Spark学习曲线不陡峭。
4)Spark的社区活跃度高,开源系统的Bug能够更快地解决。
5)传统Hadoop生态系统的分析组件在进行复杂数据分析和保证实时性方面表现得力不从心。Spark的全栈支持多范式数据分析能够应对多种多样的数据分析需求。
6)可以无缝将Spark集成进现有的Hadoop处理架构。
Yahoo!的Spark集群在2013年已经达到9.2TB持久存储、192GB RAM、112节点(每节点为SATA 1×500GB(7200转的硬盘))、400GB SSD(1×400GB SATA 300MB/s)的集群规模。
1.5.3 Spark在西班牙电信的应用
西班牙电信(Telefónica,S.A.)是西班牙的一家电信公司。这是全球第五大固网和移动通信运营商。
Telefónica成立于1924年。在1997年电信市场自由化之前,Telefónica是西班牙唯一的电信运营商,至今仍占据主要的市场份额(2004年超过75%)。
西班牙电信的数据与日俱增,随着数据的增长,网络安全成为一个不可忽视的问题而凸显。DDoS攻击、SQL注入攻击、网站置换、账号盗用等网络犯罪频繁发生。如何通过大数据分析,预防网络犯罪与正确检测诊断成为迫在眉睫的问题。
传统的应对方案是,采用中心化的数据存储,收集事件、日志和警告信息,对数据分析预警,并对用户行为进行审计。但是随着犯罪多样化与数据分析技术越来越复杂,架构已经演变为中心架构服务化,并提供早期预警、离线报告、趋势预测、决策支持和可视化的大数据网络安全分析预警策略。
西班牙电信采用Stratio公司提供的含有Spark的数据分析解决方案构建自身的网络安全数据分析栈,将使用的大数据系统缩减了一半,平台复杂性降低,同时处理性能成倍提升。
整体架构如图1-12所示。
在架构图中,最顶层通过Kafka不断收集事件、日志、预警等多数据源的信息,形成流数据,完成数据集成的功能。接下来Kafka将处理好的数据传输给Storm,Storm将数据混合与预处理。最后将数据存储进Cassandra、Mongo和HDFS进行持久化存储,使用Spark进行数据分析与预警。
在数据收集阶段:数据源是多样化的,可能来自DNS日志、用户访问IP、社交媒体数据、政府公共数据源等。Kafka到数据源拉取不同数据维度数据。
在数据预处理阶段:通过Storm进行数据预处理与规范化。在这个阶段为了能够实时预警,采用比Spark Streaming实时性更高的Storm进行处理。
在数据批处理阶段:数据经过预处理阶段之后将存储到Cassandra中持久化。开发人员通过Cassandra进行一些简单的查询和数据报表分析。对于复杂的数据分析,需要使用Spark来完成。Spark+Cassandra的架构结合了两个系统的优势。Cassandra的二级索引能够加速查询处理。
Spark对机器学习和图计算等复杂数据分析应对自如,二者组合能够应对常见和复杂的数据分析负载。
图1-12 西班牙电信数据分析平台
1.5.4 Spark在淘宝的应用
数据挖掘算法有时候需要迭代,每次迭代时间非常长,这是淘宝选择一个更高性能计算框架Spark的原因。Spark编程范式更加简洁也是一大原因。另外,GraphX提供图计算的能力也是很重要的。
1.Spark on YARN架构
Spark的计算调度方式从Mesos到Standalone,即自建Spark计算集群。虽然Standalone方式性能与稳定性都得到了提升,但自建集群资源少,需要从云梯集群复制数据,不能满足数据挖掘与计算团队业务需求。而Spark on YARN能让Spark计算模型在云梯YARN集群上运行,直接读取云梯上的数据,并充分享受云梯YARN集群丰富的计算资源。图1-13为Spark on YARN的架构。
图1-13 Spark on YARN架构
Spark on YARN架构解析如下。
基于YARN的Spark作业首先由客户端生成作业信息,提交给ResourceManager,ResourceManager在某一NodeManager汇报时把AppMaster分配给NodeManager,NodeManager启动SparkAppMaster,SparkAppMaster启动后初始化作业,然后向ResourceManager申请资源,申请到相应资源后,SparkAppMaster通过RPC让NodeManager启动相应的SparkExecutor,SparkExecutor向SparkAppMaster汇报并完成相应的任务。此外,SparkClient会通过AppMaster获取作业运行状态。目前,淘宝数据挖掘与计算团队通过Spark on YARN已实现MLR、PageRank和JMeans算法,其中MLR已作为生产作业运行。
2.协作系统
1)Spark Streaming:淘宝在云梯构建基于Spark Streaming的实时流处理框架。Spark Streaming适合处理历史数据和实时数据混合的应用需求,能够显著提高流数据处理的吞吐量。其对交易数据、用户浏览数据等流数据进行处理和分析,能够更加精准、快速地发现问题和进行预测。
2)GraphX:淘宝将交易记录中的物品和人组成大规模图。使用GraphX对这个大图进行处理(上亿个节点,几十亿条边)。GraphX能够和现有的Spark平台无缝集成,减少多平台的开发代价。
本节主要介绍了Spark在工业界的应用。Spark起源于学术界,发展于工业界,现在已经成为大数据分析不可或缺的计算框架。通过Amazon提供Spark云服务,可以看到Big Data on Cloud已经兴起。Yahoo!很早就开始使用Spark,将Spark用于自己的广告平台、商品交易数据分析和推荐系统等数据分析领域。同时Yahoo!也积极回馈社区,与社区形成良好的互动。Stratio公司为西班牙电信提供基于Spark+Cassandra+Storm架构的数据分析解决方案,实现流数据实时处理与离线数据分析兼顾,通过它们的案例可以看到多系统混合提供多数据计算范式分析平台是未来的一个趋势。最后介绍国内淘宝公司的Spark应用案例,淘宝是国内较早使用Spark的公司,通过Spark进行大规模机器学、图计算以及流数据分析,并积极参与社区,与社区形成良好互动,并乐于分享技术经验。希望读者通过企业案例能够全面了解Spark的广泛应用和适用场景。