天天看点

《Spark与Hadoop大数据分析》一一

本节书摘来自华章计算机《spark与hadoop大数据分析》一书中的第2章,第2.2节,作者:文卡特·安卡姆(venkat ankam) 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

hadoop和mr已有10年历史,已经被证明是高性能处理海量数据的最佳解决方案。然而,mr在迭代计算中性能不足,在这种情况下,多个mr作业之间的输出必须被写入 hdfs。在单个mr作业中,它的性能不足则是因为mr框架存在的一些缺点所致。

让我们来看看计算趋势的发展历史,以便了解计算的格局在过去20年中的变化。

这个趋势是当网络成本更低时(1990年代)对uri索引(reference),当存储成本更低时(2000 年代)进行复制(replicate),以及当内存成本更低时(2010 年代)进行再计算(recompute),如图2-5 所示:

《Spark与Hadoop大数据分析》一一

图2-5 计算的趋势

那么,在一段时间里有哪些东西真正改变了?

磁带已经消亡,磁盘已成为磁带,ssd 几乎成为磁盘。现在,当前的趋势是把数据缓存在内存中。

让我们来了解一下,为什么基于内存的计算很重要,以及它如何能产生显著的性能优势。

图2-6显示了从各种介质到cpu的数据传输速率。磁盘到cpu的传输速率为100 mb/s,ssd到cpu为600 mb/s,通过网络到cpu为1 mb到1 gb/s。然而,ram到cpu的传输速度惊人地快,达到了10 gb/s。所以,理想的思路是把所有或部分数据缓存到内存里,以便实现更高的性能:

2.2.1 spark 的发展历史

spark 始于 2009 年,起初是作为加州大学伯克利分校 rad 实验室的一个研究项目,该实验室就是 amplab 的前身。该实验室的研究人员以前一直在使用 hadoop mapreduce,并观察到 mr 对于迭代和交互式计算工作是低效率的。因此,从一开始,spark 被设计为快速进行交互式查询和迭代的算法,采用了支持内存存储和高效故障恢复等一些思路。

《Spark与Hadoop大数据分析》一一

图2-6 为什么采用基于内存的计算

在2011年,amplab开始在spark上开发更高级的组件,如shark和spark streaming。这些组件有时被称为berkeley数据分析框架(berkeley data analytics stack,bdas)。

spark于2010年3月首次开源,并于2013年6月被转移到apache软件基金会。

到2014年2月,它成为了apache软件基金会的一个顶级项目。spark已经成为大数据领域最大的开源社区之一。现在,有超过50个组织里的超过250位贡献者正在为spark开发做出贡献。它的用户群增长迅猛,包括了从小型公司到财富500强公司。图2-7显示了 apache spark的发展历史:

《Spark与Hadoop大数据分析》一一

图2-7 apache spark 的发展历史

2.2.2 apache spark 是什么

让我们来了解一下apache spark 是什么,以及是什么使之成为大数据分析的利器:

apache spark 是一个快速的企业级大规模数据处理引擎,它可以与apache hadoop 进行互操作。

它是用 scala 编写的。scala 是一种兼顾了面向对象和函数式的编程语言,它在 jvm 中运行。

spark 让应用程序在处理过程中能够可靠地在内存中分发数据。这是 spark 性能的关键,因为它让应用程序能够避免低效率的磁盘访问,并以内存速度进行计算。

通过让每次迭代都通过内存访问数据,它能够适用于迭代算法。

通过 scala、python 和 r 的交互式 shell,它为 java、scala、python 和 r 语言提供了本地支持。开发它的应用程序是比较容易的,并且需要的代码量通常可以减少 2 到 10 倍。

spark 提供了一系列的库,包括用于交互式分析的 spark sql 和 dataframe、用于机器学习的 mllib、用于图形处理的 graphx 和用于实时分析的 spark streaming。你可以在同一个应用程序中无缝地组合这些功能。

spark 可以运行在 hadoop、mesos、 standalone 集群管理器,内部硬件系统或云计算平台上。

2.2.3 apache spark 不是什么

hadoop 提供了用于存储的 hdfs 和用于计算的 mr。但是,spark 不提供任何特定的存储介质。spark 主要是一个计算引擎,但你可以把数据存储在内存里或 tachyon 上进行处理。

spark 具有从存储在 hdfs 或 hadoop api 支持的其他存储系统(包括你的本地文件系统、amazon s3、cassandra、hive、hbase、elasticsearch 等)中的任何文件创建分布式数据集的能力。

重要的是要注意 spark 不是 hadoop,也不需要 hadoop 来运行它。它只是为那些实现了 hadoop api 的存储系统提供支持而已。spark 支持文本文件、序列文件、avro、parquet 和其他任何 hadoop 输入格式。

spark是否会替代hadoop?

spark旨在与hadoop互操作。它不是hadoop的替代品,但它替代了hadoop 上的mr框架。把mr作为引擎的所有hadoop处理框架(sqoop、hive、pig、mahout、cascading和crunch),现在都把spark作为附加的处理引擎。

2.2.4 mapreduce 的问题

在性能和把业务问题转换为 mr 问题方面,mr 开发人员都面临着一些挑战。让我们来了解这些与 mr 相关的问题。以及如何在 apache spark 中解决这些问题:

mr为每个映射器和化简器创建单独的 jvm。启动 jvm 需要相当长的时间。

mr 代码需要大量的样板代码。程序员需要从映射(map)和化简(reduce)的角度来考虑并设计每个业务问题,这使得它成为一种非常难以开发的程序。光靠一个 mr 作业很少能进行完整的计算。你需要多个 mr 作业来完成整个任务,并且需要在所有层次都设计并跟踪优化情况。hive 和 pig 解决了这个问题。但是,它们不一定适合所有的用例。

mr 作业会在每个作业之间将数据写入磁盘,因此不适合迭代处理。

更高级别的抽象(如 cascading 和 scalding)能为 mr 作业提供更好的编程手段。但是,这样并不会产生任何额外的性能优势。

mr 也没有提供理想的 api。

mr速度缓慢是因为 mr 作业中的每个作业都把数据存储在磁盘上。对同一数据集的多个查询会分别读取数据,产生大量的磁盘读写,如图2-8 所示:

《Spark与Hadoop大数据分析》一一

图2-8 mapreduce对比apache spark

spark 将 mr 的概念提升到更高水平,将中间数据存储在内存中,并根据需要多次重复使用。这样就在内存速度下提供了高性能,如图2-8 所示。

如果我只有一个mr作业,它的表现会与spark一样吗?

《Spark与Hadoop大数据分析》一一

继续阅读