Apache Spark的承诺及所面临的挑战

Spark并非完美无瑕,目前发展到了什么程度呢?我们来一起看看Spark的优劣之处吧。

可以读一读Panopoly带来的The Evolution of the Data Warehouse,也就是目前这些系统所面临的主要挑战。

如果你要寻求一种处理海量数据的解决方案,就会有很多可选项。选择哪一种取决于具体的用例和要对数据进行何种操作,可以从很多种数据处理框架中进行遴选。例如Apache的Samza、Storm和Spark等等。本文将重点介绍Spark的功能,Spark不但非常适合用来对数据进行批处理,也非常适合对时实的流数据进行处理。

Spark目前已经非常成熟,数据处理工具包可以对大体量数据集进行处理,不必担心底层架构。工具包可以进行数据采集、查询、处理,还可以进行机器学习,进而构建出分布式系统的数据抽象模型。

处理速度也是Spark的亮点,MapReduce在处理过程中将数据放到内存中,而不放在磁盘上进行持久化,这种改进使得Spark的处理速度获得了提升。Spark提供了三种语言环境下的类库,即Scala、Java和Python语言。

除了上述这些优点之外,Spark自身也存在一些问题。例如,部署过程过于复杂,可扩展性差。本文对此也会进行论述。

Spark的功能架构模型

图片源自http://spark.apache.org/

上图显示了Spark所包含的不同功能模块。虽然这些模块的主要功能是处理流式数据,但还包括一些帮助执行各种数据操作的组件。

  • Spark SQL:Spark自带SQL接口,也就是说,可以使用SQL语句进行数据查询。查询操作会被Spark的执行引擎执行。
  • Spark Streaming:该模块提供了一组API,用来在编写应用程序的时候调用,执行对时实数据流的处理操作。该模块将进入的数据流拆分成微型批处理流,让应用程序进行处理。
  • MLib:该模块提供了在海量数据集上运行机器学习算法的一组API。
  • GraphX:当处理由多个节点组成的图类型数据时,GraphX模块就派上用场了,主要的突出之处在于图形计算的内置算法。

除了用来对数据进行处理的类库之外,Spark还带有一个web图形用户接口。当运行Spark的应用时,通过4040端口会启动一个web界面,用来显示任务执行情况的统计数据和详细信息。我们还可以察看一个阶段任务执行的时间。如果想要获得最佳的性能,这样的信息是非常有帮助的。

用例

数据分析——对进入的数据流作实时分析是Spark很在行的事情。Spark能够高效处理来自各式各样数据源的大量数据,支持HDFS、Kafka、Flume、Twitter和ZeroMQ,也能对自定义的数据源进行处理。

趋势数据——Spark能够用来对进入的事件流进行处理,用于计算趋势数据。找到某个时间窗口的趋势,对于Spark来说变得异常简单。

物联网——物联网系统产生了大量的数据。这些数据会被推往后台进行处理。Spark能够构建出数据管线,在特定的时间间隔(分钟、小时、周、月等等)内进行转换。还可以基于一组事件触发一系列动作。

机器学习——由于Spark能够对线下数据进行批量处理,并且提供了机器学习类库(MLib),因而我们能够对数据集轻松地使用机器学习算法。另外,我们还可以在海量数据集中尝试各种不同的机器学习算法。把MLib与Streaming这两个库联合起来使用,就可以构建起机器学习系统。

Spark存在的一些问题

尽管Spark在较短的一段时间内就流行了起来,但是其自身也存在着一些问题。

  • 复杂的部署过程

应用程序开发完毕后需要部署,对吗?这个时候有可能会出现难以适从的情况。虽然部署应用有多个可选项,但是最简单和直接的方式就是进行单独部署。Spark支持Mesos和Yarn,但如果对这两者任何一个不熟悉的话,部署过程就会变得异常艰难。在绑定依赖关系的时候,也可能会遇到一些前期的坑坎儿。如果不能正确处理的话,Spark虽然会单独运行,但在cluster模式下,会遇到抛出Classpath异常的情况。

  • 内存问题

由于Spark被用来处理海量数据,对内存的使用情况进行监控和度量就非常关键。在常见的使用范围内Spark完全没有问题,但针对不同的用例,要做非常多的配置工作。我们时常会受到所做的配置与用例不相配这样的限制。使用默认配置运行Spark应用并不是最佳选择,所以我们强烈建议你去查看相应的配置文档,对Spark内存相关的设置进行调整。

  • 频繁的版本更新导致API发生变化

Spark以三个月为周期就要进行一次副版本(1.x.x)发布;每隔三到四个月,就要进行一次主版本(2.x.x)发布。尽管频繁的版本发布意味着较为迅速地推出了更多的功能特性,但这也意味着这些版本更迭的背后,某些情况下要求API也要发生变化。如果我们没有意识到新版本所带来的变化的话,就会由此陷入困境。而确保Spark应用不受这些变化影响,也会带来额外的开销。

  • 对Python的支持不甚完善

Spark支持Scala、Java和Python语言。支持自己喜欢的语言当然是再好不过的事情了。但是Spark的最新版本中,对Python语言API的支持不像对Java和Scala语言的支持那样完善。Python类库需要一定时间完善功能,向最新版本的功能特性及API靠拢。如果打算使用Spark最新版本的话,可能需要用Scala或Java语言来实现,至少需要检查是否已经有Python版本功能或API的实现。

  • 匮乏的文档

文档和指南,还有代码样例对新手成长来说至关重要。然而Spark的情况是,尽管在文档中有一些代码样例,但质量和深度都有待提高。文档中的样例都过于基础,无法给予程序员有效指导,完全发挥Spark应起的作用。

结语

Spark在构建数据处理应用方面可谓是了不起的框架。需要搞清楚的是在使用场景和数据规模方面不会出现“杀鸡焉用牛刀”的局面。如果你要处理小规模的数据,也许会有更简单的解决方案。对于Apache基金会的所有产品来说,了解其数据处理框架的所有细节和要点都是必需的,这样才能物尽其用。

原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)

原文发表时间:2017-02-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

2015 Bossie评选:最佳的10款开源大数据工具

364100
来自专栏蘑菇先生的技术笔记

浅谈分布式计算的开发与实现(一)

38770
来自专栏斑斓

Apache下流处理项目巡览

我们的产品需要对来自不同数据源的大数据进行采集,从数据源的多样化以及处理数据的低延迟与可伸缩角度考虑,需要选择适合项目的大数据流处理平台。 我最初列出的候选平台...

38960
来自专栏蘑菇先生的技术笔记

浅谈分布式计算的开发与实现(一)

分布式计算简单来说,是把一个大计算任务拆分成多个小计算任务分布到若干台机器上去计算,然后再进行结果汇总。 目的在于分析计算海量的数据,从雷达监测的海量历史信号中...

9620
来自专栏about云

学习Storm、Spark Streaming流式实时分布式计算系统的设计要点

阅读导读: 1.流式实时分布式计算系统有哪些共同特征,产生的背景是什么? 2.原语设计的有哪些要点? 3.元语设计中Spark、storm是如何设计的? 4.S...

641150
来自专栏美团技术团队

Spark Streaming + Elasticsearch构建App异常监控平台

如果在使用App时遇到闪退,你可能会选择卸载App、到应用商店怒斥开发者等方式来表达不满。但开发者也同样感到头疼,因为崩溃可能意味着用户流失、营收下滑。为了降低...

53450
来自专栏IT大咖说

大数据时代,如何根据业务选择合适的分布式框架

内容来源:2018 年 5 月 5 日,小米HBase研发工程师吴国泉在“ACMUG & CRUG 2018 成都站”进行《大数据时代系统体系架构和对比:存储与...

11430
来自专栏ThoughtWorks

2015.5 技术雷达 | 平台篇

(点击图片可查看大图) Apache Spark(spark.apache.org)作为一种快速和通用的大规模数据处理引擎已取得稳步进展。该引擎基于Scala实...

35350
来自专栏携程技术中心

干货 | 携程机票实时数据处理实践及应用

18250
来自专栏大数据-Hadoop、Spark

头条大数据实践

一、 除了日志数据,关系数据库中的数据也是数据分析的重要来源。在数据的采集方式上,用Spark实现类 Sqoop 的分布式抓取替代了早期定期用单机全量抓取 M...

15920

扫码关注云+社区

领取腾讯云代金券