《Spark与Hadoop大数据分析》一一-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

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

简介:

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

2.2 Apache Spark概述

Hadoop和MR已有10年历史,已经被证明是高性能处理海量数据的最佳解决方案。然而,MR在迭代计算中性能不足,在这种情况下,多个MR作业之间的输出必须被写入 HDFS。在单个MR作业中,它的性能不足则是因为MR框架存在的一些缺点所致。
让我们来看看计算趋势的发展历史,以便了解计算的格局在过去20年中的变化。
这个趋势是当网络成本更低时(1990年代)对URI索引(Reference),当存储成本更低时(2000 年代)进行复制(Replicate),以及当内存成本更低时(2010 年代)进行再计算(Recompute),如图2-5 所示:
image

图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 被设计为快速进行交互式查询和迭代的算法,采用了支持内存存储和高效故障恢复等一些思路。
image

图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的发展历史:
image

图2-7 Apache Spark 的发展历史
2.2.2 Apache Spark 是什么
让我们来了解一下Apache Spark 是什么,以及是什么使之成为大数据分析的利器:
Apache Spark 是一个快速的企业级大规模数据处理引擎,它可以与Apache Hadoop 进行互操作。
它是用 Scala 编写的。Scala 是一种兼顾了面向对象和函数式的编程语言,它在 JVM 中运行。
Spark 让应用程序在处理过程中能够可靠地在内存中分发数据。这是 Spark 性能的关键,因为它让应用程序能够避免低效率的磁盘访问,并以内存速度进行计算。
通过让每次迭代都通过内存访问数据,它能够适用于迭代算法。
相比 MR ,Spark 程序在内存存储模式下执行的速度快 100 倍,在磁盘存储模式下的速度快 10 倍(来源 http://spark.apache.org/ )。
通过 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 所示:
image

图2-8 MapReduce对比Apache Spark
Spark 将 MR 的概念提升到更高水平,将中间数据存储在内存中,并根据需要多次重复使用。这样就在内存速度下提供了高性能,如图2-8 所示。
如果我只有一个MR作业,它的表现会与Spark一样吗?
不,由于在内存中计算和混排(shuffle)的改进,Spark作业的性能是优于MR作业的。即使禁用内存缓存,Spark的性能也优于MR。它新的混排实现方法(基于排序的混排而不是基于散列的混排)、新的网络模块(基于 netty 而不是使用block manager发送混排数据)和新的外部混排服务,让Spark能执行最快的PB级排序(在190个节点上,用46 TB RAM)和TB级排序。Spark使用206个EC2 i2.8xlarge机器在23分钟内排序了100 TB的数据。以前的世界纪录是72分钟,由一个2100节点的Hadoop MR集群完成。这意味着Spark使用少10倍的机器将相同数据排序的速度快了3倍。所有的排序都在磁盘(HDFS)上进行,没有使用 Spark的内存缓存(来源:https://databricks.com/blog/2014/10/10/spark-petabyte-sort.html)。
image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: