炼数成金 门户 大数据 Spark 查看内容

Apache Spark强势崛起

2017-12-18 15:55| 发布者: 炼数成金_小数| 查看: 13608| 评论: 0|原作者: 肖力 译|来自: 云技术实践

摘要: Apache Spark是在2012年开源的,两年后又发布了第一个稳定版本,它很快就成为大数据领域的杰出工具。从那时起,大数据公司采用Spark就的增长速度引人注目。毫无疑问,内存的处理是Spark的一个关键特性,从技术上,处 ...

大数据 编程 Spark 分布式 Scala 函数

Apache Spark是在2012年开源的,两年后又发布了第一个稳定版本,它很快就成为大数据领域的杰出工具。从那时起,大数据公司采用Spark就的增长速度引人注目。

内存处理
毫无疑问,内存的处理是Spark的一个关键特性,从技术上,处理速度远远超过传统大数据处理的工具性能。但是内存中处理并不是一个新的概念,而且有一长串的数据库和数据处理产品,它们是基于内存处理设计的。Redis和VoltDB就是两个例子。另一个例子是Apache Ignite,它也具备内存处理能力,以增加WAL(前写日志)来处理大数据查询和ACID(原子性、一致性、隔离、持久性)事务的性能。

显然,单内存处理的功能不足以区分Spark和其他产品。那么,在竞争激烈的大数据处理领域,什么让Spark脱颖而出呢?

以速度见长的BI/ OLAP
首先,我相信Spark成功地捕捉到了其他产品很少的优势,从某种意义上说,对高要求的高速BI(商业智能)分析的需求开始模糊了OLAP(在线分析处理)和OLTP(在线事务处理)世界之间的界限。

一方面,除了流行的分布式文件系统(HDFS)之外,我们还有分布式计算平台,比如Hadoop提供MapReduce编程模型。虽然MapReduce是一个很好的数据处理工具,但它是一个不能及时交付结果的批处理过程。

另一方面,有大量的数据处理产品满足OLTP的需要。这类产品的例子包括HBase的Phoenix、Apache Drillhe Ignite。其中一些产品提供了查询引擎,它可以将标准SQL的事务性处理功能模拟到基于键值的或基于列的数据库中。

在大数据的需求中,缺失的是一种以速度进行批量OLAP的产品。确实有一些BI分析/ OLAP产品,比如Apache Kylin和Presto。这些产品中的一些设法填补了空白,在很大程度上取得了一些成功。但Spark已经证明了成功同时解决了速度和规模。

然而,Spark并不是“速度+规模”战斗中的赢家。与Apache Spark同时出现的,Impala(现在是一个Apache孵化器项目)在其最近发布的速度和规模上都表现出色。然而,它从未像Spark那样获得如此高的人气。因此,Spark中的其他东西一定使它更吸引当代软件工程师。

不可变数据的函数式编程
Apache Spark为三种类型的数据集提供了API:抽样(弹性分布式数据)是不可变的分布式数据集合运算使用功能转换(地图、减少、过滤等),DataFrames是不可变的分布式数据集合在一个类似于表的形式与命名列和JVM对象称为行,每一行一个通用的无类型和数据集是JVM强类型对象的集合。

不管选择使用哪种API,Spark中的数据都是不可变的,对数据的更改是通过组合功能转换来实现的。在分布式计算环境中,对并发访问和规模的性能来说,数据不变性是非常可取的。此外,这种方法在函数式编程风格的制定和解决数据处理问题上得到了许多软件工程师和数据科学家的青睐。

在MapReduce上,Spark提供了使用map()、flatMap()、groupBy()、reduce()等经典函数编程语言(如Scala)实现的API。这些方法可以作为数据转换序列应用于组合方式的数据集,绕过mappers和还原器的编码模块,就像传统的MapReduce算法一样。

Spark是“惰性的”
在Spark的操作性能中扮演关键角色的基本设计原则是“懒惰”,Spark是惰性的,因为它可以推迟实际执行的转换,直到它接收到将返回到驱动程序的结果数据的请求,即在活动执行上下文中服务的已提交应用程序。

这样的执行策略可以显著减少磁盘和网络I / O,使其能够在规模上表现良好。例如,在MapReduce过程中,不是返回通过映射生成的大量数据,而是通过reduce来消耗,Spark可以选择只返回从reduce到驱动程序的更小的结果数据。

集群和编程语言支持
作为一个分布式计算框架,健壮的集群管理功能对于水平扩展非常重要。Spark以有效地使用数千个服务器节点的CPU核心而闻名。除了默认的独立集群模式之外,Spark还支持其他集群管理器,包括Hadoop YARN和Apache Mesos。

在编程语言上,Spark支持Scala、Java、Python和R,Scala和R都是函数式编程语言,并且越来越多地被技术行业采用。在Scala中编程的Spark感觉就像在Scala里编写的home,而R则主要是为数据科学分析而定制的。

Python,其流行的数据“sicence库”,如NumPy,可能是增长最快的编程语言之一,部分原因是数据科学工作的需求不断增加。显然,Spark的Python API(PySpark)已经被大数据社区迅速采用。与NumPy互操作,Spark的机器学习库MLlib构建在其核心引擎之上,帮助了数据科学社区的热情。

另一方面,Java还没有实现Python在Spark上享受的那种成功。很明显,Spark的Java API感觉就像一个仓促的想法。我曾经看到过一些使用Scala的非常直接的东西,需要在Java的Spark上编写冗长的代码。

SQL和用户定义函数的功能
符合sql的查询能力是Spark的重要组成部分,最近发行的Spark API支持SQL 2003标准。更受欢迎的查询特性之一是窗口函数,它甚至在一些主要的基于sql的RDBMS(如MySQL)中都没有。窗口函数允许在一个滑动窗口中排列或聚合数据行,从而帮助最小化昂贵的操作,例如加入DataFrames。

Spark API的另一个重要特性是用户定义函数(UDF),它允许创建自定义函数,利用编程语言中可用的大量通用函数来应用于数据列。虽然有一些针对DataFrame API的特定功能,但是UDF可以扩展到使用几乎所有可用的方法,比如说,用Scala编程语言来组装自定义函数。

Spark流
数据流是构建OLAP系统之上的需求的场景中,必要的集成工作可能具有挑战性。这样的集成不仅需要涉及第三方流媒体库,而且还需要确保这两个完全不同的api能够合作并可靠地解决几乎实时和批处理之间的巨大差异。

Spark提供了一个提供容错分布式流媒体功能的流媒体库。它将小的连续数据块处理为一个RDD序列,这是Spark的核心数据结构。固有的流媒体功能无疑减轻了必须将高延迟批处理任务与低延迟流处理程序集成在一起的负担。

可视化和超越
最后,Spark的基于web的可视化工具揭示了与数据处理作业的执行有关的详细信息。这些工具不仅显示了集群中各个工作节点上的任务的分解,还提供了单个执行过程的生命周期的详细信息。此外,Spark以DAG(定向acyclic图)形式的复杂作业流程的可视化提供了深入了解如何执行作业的方法。它在故障诊断或性能调优应用程序方面特别有用。

Spark不只是擅长一个或两个事情,快速内存处理,可扩展的以速度见长的BI / OLAP,数据不变性的函数编程风格,惰性的执行策略,吸引新兴数据科学社区,健壮的SQL任务能力和可视化等,这些推动Apache Spark成为主要的大数据领域的领跑者。正是这些互补特征的共同力量,才真正使Spark脱颖而出。

欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708

Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967 

鲜花

握手

雷人

路过

鸡蛋

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2018-9-18 21:39 , Processed in 0.154137 second(s), 23 queries .