`
kavy
  • 浏览: 864442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从Hadoop到Spark的架构实践

 
阅读更多

当下,Spark已经在国内得到了广泛的认可和支持:2014年,Spark Summit China在北京召开,场面火爆;同年,Spark Meetup在北京、上海、深圳和杭州四个城市举办,其中仅北京就成功举办了5次,内容更涵盖Spark Core、Spark Streaming、Spark MLlib、Spark SQL等众多领域。而作为较早关注和引入Spark的移动互联网大数据综合服务公司,TalkingData也积极地参与到国内Spark社区的各种活动,并多次在Meetup中分享公司的Spark使用经验。本文则主要介绍TalkingData在大数据平台建设过程中,逐渐引入Spark,并且以Hadoop YARN和Spark为基础来构建移动大数据平台的过程。

初识Spark

作为一家在移动互联网大数据领域创业的公司,时刻关注大数据技术领域的发展和进步是公司技术团队必做的功课。而在整理Strata 2013公开的讲义时,一篇主题为《An Introduction on the Berkeley Data Analytics Stack_BDAS_Featuring Spark,Spark Streaming,and Shark》的教程引起了整个技术团队的关注和讨论,其中Spark基于内存的RDD模型、对机器学习算法的支持、整个技术栈中实时处理和离线处理的统一模型以及Shark都让人眼前一亮。同时期我们关注的还有Impala,但对比Spark,Impala可以理解为对Hive的升级,而Spark则尝试围绕RDD建立一个用于大数据处理的生态系统。对于一家数据量高速增长,业务又是以大数据处理为核心并且在不断变化的创业公司而言,后者无疑更值得进一步关注和研究。

Spark初探

2013年中期,随着业务高速发展,越来越多的移动设备侧数据被各个不同的业务平台收集。那么这些数据除了提供不同业务所需要的业务指标,是否还蕴藏着更多的价值?为了更好地挖掘数据潜在价值,我们决定建造自己的数据中心,将各业务平台的数据汇集到一起,对覆盖设备的相关数据进行加工、分析和挖掘,从而探索数据的价值。初期数据中心主要功能设置如下所示:

1. 跨市场聚合的安卓应用排名;

2. 基于用户兴趣的应用推荐。

基于当时的技术掌握程度和功能需求,数据中心所采用的技术架构如图1。

 

图1  基于Hadoop 2.0的数据中心技术架构

 

整个系统构建基于Hadoop 2.0(Cloudera CDH4.3),采用了最原始的大数据计算架构。通过日志汇集程序,将不同业务平台的日志汇集到数据中心,并通过ETL将数据进行格式化处理,储存到HDFS。其中,排名和推荐算法的实现都采用了MapReduce,系统中只存在离线批量计算,并通过基于Azkaban的调度系统进行离线任务的调度。

第一个版本的数据中心架构基本上是以满足“最基本的数据利用”这一目的进行设计的。然而,随着对数据价值探索得逐渐加深,越来越多的实时分析需求被提出。与此同时,更多的机器学习算法也亟需添加,以便支持不同的数据挖掘需求。对于实时数据分析,显然不能通过“对每个分析需求单独开发MapReduce任务”来完成,因此引入Hive 是一个简单而直接的选择。鉴于传统的MapReduce模型并不能很好地支持迭代计算,我们需要一个更好的并行计算框架来支持机器学习算法。而这些正是我们一直在密切关注的Spark所擅长的领域——凭借其对迭代计算的友好支持,Spark理所当然地成为了不二之选。2013年9月底,随着Spark 0.8.0发布,我们决定对最初的架构进行演进,引入Hive作为即时查询的基础,同时引入Spark计算框架来支持机器学习类型的计算,并且验证Spark这个新的计算框架是否能够全面替代传统的以MapReduce为基础的计算框架。图2为整个系统的架构演变。

 

图2  在原始架构中测试Spark

 

在这个架构中,我们将Spark 0.8.1部署在YARN上,通过分Queue,来隔离基于Spark的机器学习任务,计算排名的日常MapReduce任务和基于Hive的即时分析任务。

想要引入Spark,第一步需要做的就是要取得支持我们Hadoop环境的Spark包。我们的Hadoop环境是Cloudera发布的CDH 4.3,默认的Spark发布包并不包含支持CDH 4.3的版本,因此只能自己编译。Spark官方文档推荐用Maven进行编译,可是编译却不如想象中顺利。各种包依赖由于众所周知的原因,不能顺利地从某些依赖中心库下载。于是我们采取了最简单直接的绕开办法,利用AWS云主机进行编译。需要注意的是,编译前一定要遵循文档的建议,设置:

 

否则,编译过程中就会遇到内存溢出的问题。针对CDH 4.3,mvn build的参数为:

在编译成功所需要的Spark包后,部署和在Hadoop环境中运行Spark则是非常简单的事情。将编译好的Spark目录打包压缩后,在可以运行Hadoop Client的机器上解压缩,就可以运行Spark了。想要验证Spark是否能够正常在目标Hadoop环境上运行,可以参照Spark的官方文档,运行example中的SparkPi来验证:

完成Spark部署之后,剩下的就是开发基于Spark的程序了。虽然Spark支持Java、Python,但最合适开发Spark程序的语言还是Scala。经过一段时间的摸索实践,我们掌握了Scala语言的函数式编程语言特点后,终于体会了利用Scala开发Spark应用的巨大好处。同样的功能,用MapReduce几百行才能实现的计算,在Spark中,Scala通过短短的数十行代码就能完成。而在运行时,同样的计算功能,Spark上执行则比MapReduce有数十倍的提高。对于需要迭代的机器学习算法来讲,Spark的RDD模型相比MapReduce的优势则更是明显,更何况还有基本的MLlib的支持。经过几个月的实践,数据挖掘相关工作被完全迁移到Spark,并且在Spark上实现了适合我们数据集的更高效的LR等等算法。

全面拥抱Spark

进入2014年,公司的业务有了长足的发展,对比数据中心平台建立时,每日处理的数据量亦翻了几番。每日的排名计算所花的时间越来越长,而基于Hive的即时计算只能支持日尺度的计算,如果到周这个尺度,计算所花的时间已经很难忍受,到月这个尺度则基本上没办法完成计算。基于在Spark上的认知和积累,是时候将整个数据中心迁移到Spark上了。

2014年4月,Spark Summit China在北京举行。抱着学习的目的,我们技术团队也参加了在中国举行的这一次Spark盛会。通过这次盛会,我们了解到国内的很多同行已经开始采用Spark来建造自己的大数据平台,而Spark也变成了在ASF中最为活跃的项目之一。另外,越来越多的大数据相关的产品也逐渐在和Spark相融合或者在向Spark迁移。Spark无疑将会变为一个相比Hadoop MapReduce更好的生态系统。通过这次大会,我们更加坚定了全面拥抱Spark的决心。

基于YARN和Spark,我们开始重新架构数据中心依赖的大数据平台。整个新的数据平台应该能够承载:

1. 准实时的数据汇集和ETL;

2. 支持流式的数据加工;

3. 更高效的离线计算能力;

4. 高速的多维分析能力;

5. 更高效的即时分析能力;

6. 高效的机器学习能力;

7. 统一的数据访问接口;

8. 统一的数据视图;

9. 灵活的任务调度.

整个新的架构充分地利用YARN和Spark,并且融合公司的一些技术积累,架构如图3所示。

在新的架构中,引入了Kafka作为日志汇集的通道。几个业务系统收集的移动设备侧的日志,实时地写入到Kafka 中,从而方便后续的数据消费。

利用Spark Streaming,可以方便地对Kafka中的数据进行消费处理。在整个架构中,Spark Streaming主要完成了以下工作。

1. 原始日志的保存。将Kafka中的原始日志以JSON格式无损的保存在HDFS中。

2. 数据清洗和转换,清洗和标准化之后,转变为Parquet格式,存储在HDFS中,方便后续的各种数据计算任务。

3. 定义好的流式计算任务,比如基于频次规则的标签加工等等,计算结果直接存储在MongoDB中。

图3  合了YARN和Spark的最新数据中心架构

排名计算任务则在Spark上做了重新实现,借力Spark带来的性能提高,以及Parquet列式存储带来的高效数据访问。同样的计算任务,在数据量提高到原来3倍的情况下,时间开销只有原来的1/6。

同时,在利用Spark和Parquet列式存储带来的性能提升之外,曾经很难满足业务需求的即时多维度数据分析终于成为了可能。曾经利用Hive需要小时级别才能完成日尺度的多维度即时分析,在新架构上,只需要2分钟就能够顺利完成。而周尺度上也不过十分钟就能够算出结果。曾经在Hive上无法完成的月尺度多维度分析计算,则在两个小时内也可以算出结果。另外Spark SQL的逐渐完善也降低了开发的难度。

利用YARN提供的资源管理能力,用于多维度分析,自主研发的Bitmap引擎也被迁移到了YARN上。对于已经确定好的维度,可以预先创建Bitmap索引。而多维度的分析,如果所需要的维度已经预先建立了Bitmap索引,则通过Bitmap引擎由Bitmap计算来实现,从而可以提供实时的多维度的分析能力。

在新的架构中,为了更方便地管理数据,我们引入了基于HCatalog的元数据管理系统,数据的定义、存储、访问都通过元数据管理系统,从而实现了数据的统一视图,方便了数据资产的管理。

YARN只提供了资源的调度能力,在一个大数据平台,分布式的任务调度系统同样不可或缺。在新的架构中,我们自行开发了一个支持DAG的分布式任务调度系统,结合YARN提供的资源调度能力,从而实现定时任务、即时任务以及不同任务构成的pipeline。

基于围绕YARN和Spark的新的架构,一个针对数据业务部门的自服务大数据平台得以实现,数据业务部门可以方便地利用这个平台对进行多维度的分析、数据的抽取,以及进行自定义的标签加工。自服务系统提高了数据利用的能力,同时也大大提高了数据利用的效率。

使用Spark遇到的一些坑

任何新技术的引入都会历经陌生到熟悉,从最初新技术带来的惊喜,到后来遇到困难时的一筹莫展和惆怅,再到问题解决后的愉悦,大数据新贵Spark同样不能免俗。下面就列举一些我们遇到的坑。

【坑一:跑很大的数据集的时候,会遇到org.apache.spark.SparkException: Error communicating with MapOutputTracker】

这个错误报得很隐晦,从错误日志看,是Spark集群partition了,但如果观察物理机器的运行情况,会发现磁盘I/O非常高。进一步分析会发现原因是Spark在处理大数据集时的shuffle过程中生成了太多的临时文件,造成了操作系统磁盘I/O负载过大。找到原因后,解决起来就很简单了,设置spark.shuffle.consolidateFiles为true。这个参数在默认的设置中是false的,对于linux的ext4文件系统,建议大家还是默认设置为true吧。Spark官方文档的描述也建议ext4文件系统设置为true来提高性能。

【坑二:运行时报Fetch failure错】

在大数据集上,运行Spark程序,在很多情况下会遇到Fetch failure的错。由于Spark本身设计是容错的,大部分的Fetch failure会经过重试后通过,因此整个Spark任务会正常跑完,不过由于重试的影响,执行时间会显著增长。造成Fetch failure的根本原因则不尽相同。从错误本身看,是由于任务不能从远程的节点读取shuffle的数据,具体原因则需要利用:

查看Spark的运行日志,从而找到造成Fetch failure的根本原因。其中大部分的问题都可以通过合理的参数配置以及对程序进行优化来解决。2014年Spark Summit China上陈超的那个专题,对于如何对Spark性能进行优化,有非常好的建议。

当然,在使用Spark过程中还遇到过其他不同的问题,不过由于Spark本身是开源的,通过源代码的阅读,以及借助开源社区的帮助,大部分问题都可以顺利解决。

下一步的计划

Spark在2014年取得了长足的发展,围绕Spark的大数据生态系统也逐渐的完善。Spark 1.3引入了一个新的DataFrame API,这个新的DataFrame API将会使得Spark对于数据的处理更加友好。同样出自于AMPLab的分布式缓存系统Tachyon因为其与Spark的良好集成也逐渐引起了人们的注意。鉴于在业务场景中,很多基础数据是需要被多个不同的Spark任务重复使用,下一步,我们将会在架构中引入Tachyon来作为缓存层。另外,随着SSD的日益普及,我们后续的计划是在集群中每台机器都引入SSD存储,配置Spark的shuffle的输出到SSD,利用SSD的高速随机读写能力,进一步提高大数据处理效率。

在机器学习方面,H2O机器学习引擎也和Spark有了良好的集成从而产生了Sparkling-water。相信利用Sparking-water,作为一家创业公司,我们也可以利用深度学习的力量来进一步挖掘数据的价值。

结语

2004年,Google的MapReduce论文揭开了大数据处理的时代,Hadoop的MapReduce在过去接近10年的时间成了大数据处理的代名词。而Matei Zaharia 2012年关于RDD的一篇论文“Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing”则揭示了大数据处理技术一个新时代的到来。伴随着新的硬件技术的发展、低延迟大数据处理的广泛需求以及数据挖掘在大数据领域的日益普及,Spark作为一个崭新的大数据生态系统,逐渐取代传统的MapReduce而成为新一代大数据处理技术的热门。我们过去两年从MapReduce到Spark架构的演变过程,也基本上代表了相当一部分大数据领域从业者的技术演进的历程。相信随着Spark生态的日益完善,会有越来越多的企业将自己的数据处理迁移到Spark上来。而伴随着越来越多的大数据工程师熟悉和了解Spark,国内的Spark社区也会越来越活跃,Spark作为一个开源的平台,相信也会有越来越多的华人变成Spark相关项目的Contributor,Spark也会变得越来越成熟和强大。

 

http://www.csdn.net/article/2015-06-08/2824889

 

分享到:
评论

相关推荐

    数据算法 hadoop spark大数据处理技巧

     Mahmoud Parsian,计算机科学博士,是一位热衷于实践的软件专家,作为开发人员、设计人员、架构师和作者,他有30多年的软件开发经验。目前领导着Illumina的大数据团队,在过去15年间,他主要从事Java (服务器端)、...

    《数据算法Hadoop Spark大数据处理技巧》PDF 带目录!!

    适读人群 :这本书面向了解Java基础知识并且想使用Hadoop和Spark 开发MapReduce 算法(数据挖掘、机器学习、生物信息技术、基因组和统计领域)和解决方案的软件工程师、软件架构师、数据科学家和应用开发人员。...

    Spark 入门实战系列

    4.Spark运行架构.pdf 5.Hive(上)--Hive介绍及部署.pdf 5.Hive(下)--Hive实战.pdf 6.SparkSQL(上)--SparkSQL简介.pdf 6.SparkSQL(下)--Spark实战应用.pdf 6.SparkSQL(中)--深入了解运行计划及调优.pdf 7....

    《Hadoop与大数据挖掘》配套资源【完整版】.txt

    在每个模块的最后,会有一到两个企业案例,对这些企业案例的介绍只限于部分介绍,主要还是使用当前模块的技术来解决其中的一到两个问题,这样读者不仅对技术的原理、架构有了较深入的了解,同时,对于如何应用该技术...

    GC调优在Spark应用中的实践

    与此同时,它也兼容批处理和流式处理,对于程序吞吐量和延迟都有较高要求,因此GC参数的调优在Spark应用实践中显得尤为重要。Spark是时下非常热门的大数据计算框架,以其卓越的性能优势、独特的架构、易用的用户接口...

    第16章 Spark

    内容提要:本章首先简单介绍Spark与Scala编程语言,接着分析Spark与Hadoop的区别,认识Hadoop MapReduce计算模型的缺陷与Spark的优势;然后讲解了Spark的生态系统和架构设计,并介绍了Spark SQL以及Spark的部署和...

    hadoop自动化运维工具Ambari应用实践

    本课程主要讲解Ambari工具的使用,主要涉及Ambari的安装部署、在Ambari下自动化部署一套hadoop3.x集群、在Ambari下扩容hadoop集群节点、在Ambari下添加Hive、hbase、spark等服务,以及如何实现hadoop集群中服务的...

    大数据必看经典书籍:大数据从入门到深入书籍推荐.pdf

    《Hadoop权威指南》 《Hadoop权威指南》,作为Hadoop的经典⼊门书籍,从Hadoop的缘起,由浅⼊深,结合理论和实践,全⽅位地介绍Hadoop框架体系 结构。 《Hive编程指南》 《Hive编程指南》是⼀本Apache Hive的编程...

    云计算大会演示PPT资料.zip

    Cloudera韩军-Hadoop架构在云上的应用实践 02-CCTC2016—云之讯张雯-ICT融合通讯技术探秘 百度王耀-百度的分布式文件系统之路 京东杨海明-京东云构建行业数据的连通 微软申元庆-构建智能云 精灵云晏东-负载均衡与...

    大数据开发入门指南:从概念到实践.docx

    3. 数据处理:利用大数据处理框架,如Hadoop、Spark等,对数据进行清洗、转换和整合,为分析提供高质量的数据集。 4. 数据分析:通过数据挖掘、机器学习等技术,对数据进行深入分析,发现数据中的规律和价值

    2014年中国数据库技术大会(DTCC)PPT合集,专场1:Hadoop技术实战和应用

    专场1:Hadoop技术实战和应用,包括:某视频网站在Hadoop生态中大数据平台架构与实践、Hadoop生态技术在阿里全网商品搜索实战、spark runtime internals、大云Hadoop平台及应用、非结构化大数据管理系统的设计及其...

    大数据面试常见问题(会这些就不用怕了!)

    内容从技术概述到实际应用场景,提供了大数据技术方面的全面信息。 适用人群: 该文档适合大数据领域的初学者和中级专业人士,特别是那些希望加深对大数据技术、工具和最佳实践理解的工程师、数据科学家和IT架构师。...

    Spark生态系统解析及基于Redis的开源分布式服务Codis

    1月24日,一场基于Spark和Redis组成的分布式系统实践分享由Spark资深布道者陈超和豌豆荚资深系统架构师刘奇联手打造。在分享中,陈超首先简短的介绍了Spark社区在2014年的发展:目前Spark的发布版本是1.2,整个2014...

    大数据架构师的岗位职责.docx

    2、参与规划从数据源到数据应用的整体流程,并参与相关产品的决策; 3、负责解决核心技术问题,对技术方案进行决策; 4、负责大数据研发团队建设、人才梯队培养和技术团队管理; 5、积极了解业界发展,研究与跟踪...

    云计算与大数据PPT详解

    全书分为基础篇、技术与应用篇和实践篇,主要内容包括:绪论、大数据环境下的云计算架构、大数据关键技术与应用、云存储、云服务与云安全、云计算应用、虚拟化技术、Hadoop和Spark平台、分布式文件系统及并行计算...

    阿里云大规模结构化云存储HBase架构特性解析

    阿里云技术专家、架构师 专注在大数据领域,有6年分布式引擎研发经验 先后研发上万台Hadoop、ODPS集群 先后负责阿里YARN、spark及自主研发内存计算引擎 目前为广大公共云用户提供专业的云Hadoop服务及 云HBase服务. ...

    滴滴出行实时计算系统架构及实践

    我们选用Druid/Samza/Kafka/Spark/Hadoop等开源技术栈,开发了符合Lambda architecture的OLAP系统。本次演讲我们以滴滴大数据实时监控系统为例,介绍滴滴实时计算系统架构所面临的挑战及相应解决方案。 滴滴大数据...

Global site tag (gtag.js) - Google Analytics