[翻译]Apache Spark入门简介

原文地址:http://blog.jobbole.com/?p=89446

我是在2013年底第一次听说Spark,当时我对Scala很感兴趣,而Spark就是使用Scala编写的。一段时间之后,我做了一个有趣的数据科学项目,它试着去 预测在泰坦尼克号上幸存。对于进一步了解Spark内容和编程来说,这被证明是一个很好的方式。对于任何有追求的、正在思考如何着手的Spark开发人员,我都非常推荐这个项目。

今天,Spark已经被很多巨头使用,包括Amazon、eBay以及Yahoo!。很多组织都在拥有成千上万节点的集群上运行Spark。根据Spark FAQ,已知的最大的Spark集群拥有超过8000个节点。Spark确实是一个值得好好考虑和学习的技术。

这篇文章会向你介绍Spark,包括用例和示例。其中的信息来自于Apache Spark网站以及 学习Spark – 快如闪电的大数据分析 一书。

Apache Spark是什么?一个简单介绍

Spark是一个Apache项目,它被标榜为“快如闪电的集群计算”。它拥有一个繁荣的开源社区,并且是目前最活跃的Apache项目。

Spark提供了一个更快、更通用的数据处理平台。和Hadoop相比,Spark可以让你的程序在内存中运行时速度提升100倍,或者在磁盘上运行时速度提升10倍。去年,在100 TB Daytona GraySort比赛中,Spark战胜了Hadoop,它只使用了十分之一的机器,但运行速度提升了3倍。Spark也已经成为 针对PB级别数据排序的最快的开源引擎


1

2

3

4

sparkContext.textFile("hdfs://...")

            .flatMap(line => line.split(" "))

            .map(word => (word, 1)).reduceByKey(_ + _)

            .saveAsTextFile("hdfs://...")

Spark也让我们更快地编写代码变得可能,这就好像有80多个高水平的操作员在帮你处理。为了说明这一点,我们来看一下大数据中的“Hello World!”:单词个数统计示例。在MapReduce中,我们需要编写大概50行代码来实现这一功能,但对于Spark(以及Scala)来说,你可以像下面这样简单实现:


1

2

3

4

sparkContext.textFile("hdfs://...")

            .flatMap(line => line.split(" "))

            .map(word => (word, 1)).reduceByKey(_ + _)

            .saveAsTextFile("hdfs://...")

在学习如何使用Apache Spark时,另外一个重要的部分就是交互式shell(REPL),它是开箱即用的。通过使用REPL,我们可以测试每一行代码的输出,而无需首先编写和执行整个作业(job)。这样,你可以更快得到可工作的代码,并且点对点数据分析也变得可能。

Spark还提供了其它一些关键特性:

  • 目前提供了针对Scala、Java和Python的API,即将提供针对其它语言(例如R)的支持。
  • 可以很好地和Hadoop生态系统和数据源(HDFS、Amazon S3、Hive、HBase、Cassandra等)进行集成。
  • 可以运行在由Hadoop YARN或者Apache Mesos管理的集群上,也可以运行在单独的集群上。

Spark核心由一组功能强大的、高级别的库组成,这些库可以无缝的应用到同一个应用程序中。目前这些库包括SparkSQL、Spark Streaming、MLlib(用于机器学习)以及GraphX,我们会在稍后针对每一个库进行进一步描述。  其它一些Spark库和扩展也在陆续开发过程中。

Spark Core

Spark Core是一个基本引擎,用于大规模并行和分布式数据处理。它主要负责:

  • 内存管理和故障恢复
  • 在集群上安排、分布和监控作业
  • 和存储系统进行交互

Spark引入了一个称为弹性分布式数据集(RDD,Resilient Distributed Dataset)的概念,它是一个不可变的、容错的、分布式对象集合,我们可以并行的操作这个集合。RDD可以包含任何类型的对象,它在加载外部数据集或者从驱动应用程序分发集合时创建。

RDD支持两种操作类型:

  • 转换是一种操作(例如映射、过滤、联接、联合等等),它在一个RDD上执行操作,然后创建一个新的RDD来保存结果。
  • 行动是一种操作(例如归并、计数、第一等等),它在一个RDD上执行某种计算,然后将结果返回。

在Spark中,转换是“懒惰”的,也就是说它们不会立刻计算出结果。相反,它们只是“记住”要执行的操作以及要操作的数据集(例如文件)。只有当行为被调用时,转换才会真正的进行计算,并将结果返回给驱动器程序。这种设计让Spark运行得更有效率。例如,如果一个大文件要通过各种方式进行转换操作,并且文件被传递给第一个行为,那么Spark只会处理文件的第一行内容并将结果返回,而不会处理整个文件。

默认情况下,当你在经过转换的RDD上运行一个行为时,这个RDD有可能会被重新计算。然而,你也可以通过使用持久化或者缓存的方法,将一个RDD持久化从年初在内存中,这样,Spark就会在集群上保留这些元素,当你下一次查询它时,查询速度会快很多。

SparkSQL

SparkSQL是Spark的一个组件,它支持我们通过SQL或者Hive查询语言来查询数据。它最初来自于Apache Hive项目,用于运行在Spark上(来代替MapReduce),现在它已经被集成到Spark堆中。除了针对各种各样的数据源提供支持,它还让代码转换与SQL查询编织在一起变得可能,这最终会形成一个非常强大的工具。下面是一个兼容Hive的查询示例:


1

2

3

4

5

6

7

8

// sc is an existing SparkContext.

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")

sqlContext.sql("LOAD DATA LOCAL INPATH ‘examples/src/main/resources/kv1.txt‘ INTO TABLE src")

// Queries are expressed in HiveQL

sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

Spark Streaming

Spark Streaming支持对流数据的实时处理,例如产品环境web服务器的日志文件(例如Apache Flume和HDFS/S3)、诸如Twitter的社交媒体以及像Kafka那样的各种各样的消息队列。在这背后,Spark Streaming会接收输入数据,然后将其分为不同的批次,接下来Spark引擎来处理这些批次,并根据批次中的结果,生成最终的流。整个过程如下所示。

Spark Streaming API可以非常紧密匹配Spark核心API,这使得程序员可以很容易的工作在批处理数据和流数据的海洋中。

MLlib

MLlib是一个机器学习库,它提供了各种各样的算法,这些算法用来在集群上针对分类、回归、聚类、协同过滤等(可以在 machine learning 上查看Toptal的文章,来获取更过的信息)。其中一些算法也可以应用到流数据上,例如使用普通最小二乘法或者K均值聚类(还有更多)来计算线性回归。Apache Mahout(一个针对Hadoop的机器学习库)已经脱离MapReduce,转而加入Spark MLlib。

GraphX

GraphX是一个库,用来处理图,执行基于图的并行操作。它针对ETL、探索性分析和迭代图计算提供了统一的工具。除了针对图处理的内置操作,GraphX还提供了一个库,用于通用的图算法,例如PageRank。

如何使用Apache Spark:事件探测用例

既然我们已经回答了“Apache Spark是什么?”这个问题,接下来让我们思考一下,使用Spark来解决什么样的问题或者挑战最有效率。

最近,我偶然看到了一篇关于 通过分析Twitter流的方式来探测地震 的文章。它展示了这种技术可以比日本气象厅更快的通知你日本哪里发生了地震。虽然那篇文章使用了不同的技术,但我认为这是一个很好的示例,可以用来说明我们如何通过简单的代码片段,在不需要”胶水代码“的情况下应用Spark。

首先,我们需要处理tweet,将那些和”地震“或”震动“等相关的内容过滤出来。我们可以使用Spark Streaming的方式很容易实现这一目标,如下所示:


1

2

TwitterUtils.createStream(...)

            .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))

然后,我们需要在tweets上运行一些语义分析,来确定它们是否代表当前发生了地震。例如,像“地震!”或者“现在正在震动”这样的tweets,可能会被认为是正向匹配,而像“参加一个地震会议”或者“昨天的地震真可怕”这样的tweets,则不是。这篇文章的作者使用了一个支持向量机(support vector machine, SVM)来实现这一点。我们在这里使用同样的方式,但也可以试一下 流版本。一个使用了MLlib的代码示例如下所示:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// We would prepare some earthquake tweet data and load it in LIBSVM format.

val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt")

// Split data into training (60%) and test (40%).

val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)

val training = splits(0).cache()

val test = splits(1)

// Run training algorithm to build the model

val numIterations = 100

val model = SVMWithSGD.train(training, numIterations)

// Clear the default threshold.

model.clearThreshold()

// Compute raw scores on the test set.

val scoreAndLabels = test.map { point =>

  val score = model.predict(point.features)

  (score, point.label)

}

// Get evaluation metrics.

val metrics = new BinaryClassificationMetrics(scoreAndLabels)

val auROC = metrics.areaUnderROC()

println("Area under ROC = " + auROC)

如果对于这个模型的预测比例满意,我们可以继续往下走,无论何时发现地震,我们都要做出反应。为了检测一个地震,我们需要在一个指定的时间窗口内(如文章中所述)有一定数量(例如密度)的正向tweets。请注意,对于带有Twitter位置服务信息的tweets来说,我们还能够从中提取地震的位置信息。有了这个只是以后,我们可以使用SparkSQL来查询现有的Hive表(保存那些对接收地震通知感兴趣的用户)来获取用户的邮箱地址,并向他们发送一些个性化的警告邮件,如下所示:


1

2

3

4

5

// sc is an existing SparkContext.

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

// sendEmail is a custom function

sqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email")

          .collect().foreach(sendEmail)

其它Apache Spark用例

当然,Spark潜在的用例远远超出了地震预测。

下面是一个针对其它一些用例示例(当然远远没有列举全部),这些用例都需要快速处理各种各样的大数据,Spark也非常适合处理这些用例:

在游戏领域,如果能从实时游戏的事件的潜流中处理和发现模式,并能够快速做出响应,这种能力可以带来一门赚钱的生意,针对这种目的的例子包括玩家保留、定位广告、自动调整复杂度等等。

在电子商务领域,实时交易的信息可以被传到像K均值这样的流聚集算法或者像ALS这样的协同过滤的算法上。而产生的结果可能会组合其它一些非结构化的数据源,例如客户评论或者产品评审。随着时间的推移,我们可以用它来提升和改进系统的推荐功能。

在金融或者安全领域,Spark技术栈可以用于欺诈或者入侵检测系统或者基于风险的认证系统。通过分析大规模的压缩日志,并结合外部数据源,例如已经泄漏的数据以及泄漏的账户(可以参考https://haveibeenpwned.com/)、从连接/请求中得到的一些诸如IP地址或者时间等信息,我们可以实现一个非常好的结果。

结论

总之,Spark可以帮助我们简化处理那些需要处理大量实时或压缩数据的计算密集型任务和挑战。这些数据既包括结构化数据,也包括非结构化数据。Spark可以和其它一些复杂能力进行无缝集成,例如机器学习、图算法等。Spark将大数据处理变得“接地气”。赶快来试试吧。

时间: 2024-11-06 21:27:01

[翻译]Apache Spark入门简介的相关文章

Apache spark入门精品文章

本文聚焦 Apache Spark 入门,了解其在大数据领域的地位,覆盖 Apache Spark 的安装及应用程序的建立,并解释一些常见的行为和操作. 一. 为什么要使用 Apache Spark 时下,我们正处在一个“大数据”的时代,每时每刻,都有各种类型的数据被生产.而在此紫外,数据增幅的速度也在显著增加.从广义上看,这些数据包含交易数据.社交媒体内容(比如文本.图像和视频)以及传感器数据.那么,为什么要在这些内容上投入如此多精力,其原因无非就是从海量数据中提取洞见可以对生活和生产实践进行

新手福利:Apache Spark入门攻略

新手福利:Apache Spark入门攻略 作者Ashwini Kuntamukkala  出处:CSDN 本文聚焦Apache Spark入门,了解其在大数据领域的地位,覆盖Apache Spark的安装及应用程序的建立,并解释一些常见的行为和操作. 一. 为什么要使用Apache Spark 时下,我们正处在一个"大数据"的时代,每时每刻,都有各种类型的数据被生产.而在此紫外,数据增幅的速度也在显著增加.从广义上看,这些数据包含交易数据.社交媒体内容(比如文本.图像和视频)以及传感

Spark入门实战系列--1.Spark及其生态圈简介

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处,Spark以其先进的设计理念,迅速成为社区的热门项目,围绕着Spark推出了Spark SQL.Spark St

Spark入门实战系列--8.Spark MLlib(上)--机器学习及SparkMLlib简介

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.机器学习概念 1.1 机器学习的定义 在维基百科上对机器学习提出以下几种定义: l“机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能”. l“机器学习是对能通过经验自动改进的计算机算法的研究”. l“机器学习是用数据或以往的经验,以此优化计算机程序的性能标准.” 一种经常引用的英文定义是:A computer program is said

Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.SparkSQL的发展历程 1.1 Hive and Shark SparkSQL的前身是Shark,给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具,Hive应运而生,它是当时唯一运行在Hadoop上的SQL-on-Hadoop工具.但是MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,降低的运行效率,为了提高SQL-on-Hadoop的效率,大量的

Spark修炼之道(进阶篇)——Spark入门到精通:第二节 Hadoop、Spark生成圈简介

本节主要内容 Hadoop生态圈 Spark生态圈 1. Hadoop生态圈 原文地址:http://os.51cto.com/art/201508/487936_all.htm#rd?sukey=a805c0b270074a064cd1c1c9a73c1dcc953928bfe4a56cc94d6f67793fa02b3b983df6df92dc418df5a1083411b53325 下图给出了Hadoop生态圈中的重要产品: 图片来源:http://www.36dsj.com/archiv

【Spark1.3官方翻译】Spark快速入门

英文标题:Quick Start 英文原址:http://spark.apache.org/docs/latest/quick-start.html Spark Version:1.3.0 1,       使用Spark-Shell进行交互式分析 1.1   基本使用 Spark-shell为学习API提供了简单的方式,它是一个非常强大的进行交互式数据分析的工具,在Scala或Python中都有提供.在Spark目录中运行下面的命令: ./bin/spark-shell Spark的主要抽象是

Spark 入门(Python、Scala 版)

本文中,我们将首先讨论如何在本地机器上利用Spark进行简单分析.然后,将在入门级水平探索Spark,了解Spark是什么以及它如何工作(希望可以激发更多探索).最后两节将开始通过命令行与Spark进行交互,然后演示如何用Python写Spark应用,并作为Spark作业提交到集群上.同时也会提供相应的 Scala 版本. 1.设置Spark环境 在本机设置和运行Spark非常简单.你只需要下载一个预构建的包,只要你安装了Java 6+和Python 2.6+,就可以在Windows.Mac O

Apache Spark源码走读之13 -- hiveql on spark实现详解

欢迎转载,转载请注明出处,徽沪一郎 概要 在新近发布的spark 1.0中新加了sql的模块,更为引人注意的是对hive中的hiveql也提供了良好的支持,作为一个源码分析控,了解一下spark是如何完成对hql的支持是一件非常有趣的事情. Hive简介 Hive的由来 以下部分摘自Hadoop definite guide中的Hive一章 "Hive由Facebook出品,其设计之初目的是让精通SQL技能的分析师能够对Facebook存放在HDFS上的大规模数据集进行分析和查询. Hive大大