Introduction To Apache Spark(1)

来源:互联网 发布:电脑群发短信软件 免费 编辑:程序博客网 时间:2024/06/08 09:55

spark入门

一、简介

Apache spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势。

首先,Spark为我们提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。

Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍,甚至能够将应用在磁盘上的运行速度提升10倍。

Spark让开发者可以快速的用Java、Scala或Python编写程序。它本身自带了一个超过80个高阶操作符集合。而且还可以用它在shell中以交互式地查询数据。

除了Map和Reduce操作之外,它还支持SQL查询,流数据,机器学习和图表数据处理。开发者可以在一个数据管道用例中单独使用某一能力或者将这些能力结合在一起使用。

在这个Apache Spark文章系列的第一部分中,我们将了解到什么是Spark,它与典型的MapReduce解决方案的比较以及它如何为大数据处理提供了一套完整的工具。

Hadoop和Spark

这里写图片描述

Hadoop这项大数据处理技术大概已有十年历史,而且被看做是首选的大数据集合处理的解决方案。MapReduce是一路计算的优秀解决方案,不过对于需要多路计算和算法的用例来说,并非十分高效。数据处理流程中的每一步都需要一个Map阶段和一个Reduce阶段,而且如果要利用这一解决方案,需要将所有用例都转换成MapReduce模式。

在下一步开始之前,上一步的作业输出数据必须要存储到分布式文件系统中。因此,复制和磁盘存储会导致这种方式速度变慢。另外Hadoop解决方案中通常会包含难以安装和管理的集群。而且为了处理不同的大数据用例,还需要集成多种不同的工具(如用于机器学习的Mahout和流数据处理的Storm)。

如果想要完成比较复杂的工作,就必须将一系列的MapReduce作业串联起来然后顺序执行这些作业。每一个作业都是高时延的,而且只有在前一个作业完成之后下一个作业才能开始启动。

而Spark则允许程序开发者使用有向无环图(DAG)开发复杂的多步数据管道。而且还支持跨有向无环图的内存数据共享,以便不同的作业可以共同处理同一个数据。

Spark运行在现有的Hadoop分布式文件系统基础之上(HDFS)提供额外的增强功能。它支持将Spark应用部署到现存的Hadoop v1集群(with SIMR – Spark-Inside-MapReduce)或Hadoop v2 YARN集群甚至是Apache Mesos之中。
这里写图片描述

我们应该将Spark看作是Hadoop MapReduce的一个替代品而不是Hadoop的替代品。其意图并非是替代Hadoop,而是为了提供一个管理不同的大数据用例和需求的全面且统一的解决方案。

Spark特性

Spark通过在数据处理过程中成本更低的洗牌(Shuffle)方式,将MapReduce提升到一个更高的层次。利用内存数据存储和接近实时的处理能力,Spark比其他的大数据处理技术的性能要快很多倍。

Spark还支持大数据查询的延迟计算,这可以帮助优化大数据处理流程中的处理步骤。Spark还提供高级的API以提升开发者的生产力,除此之外还为大数据解决方案提供一致的体系架构模型。

Spark**将中间结果保存在内存中而不是将其写入磁盘**,当需要多次处理同一数据集时,这一点特别实用。Spark的设计初衷就是既可以在内存中又可以在磁盘上工作的执行引擎。当内存中的数据不适用时,Spark操作符就会执行外部操作。Spark可以用于处理大于集群内存容量总和的数据集。

Spark会尝试在内存中存储尽可能多的数据然后将其写入磁盘。它可以将某个数据集的一部分存入内存而剩余部分存入磁盘。开发者需要根据数据和用例评估对内存的需求。Spark的性能优势得益于这种内存中的数据存储。

Spark的其他特性包括:

**支持比Map和Reduce更多的函数。优化任意操作算子图(operator graphs)。可以帮助优化整体数据处理流程的大数据查询的延迟计算。提供简明、一致的Scala,Java和Python API。提供交互式Scala和Python Shell。目前暂不支持Java。Spark是用Scala程序设计语言编写而成,运行于Java虚拟机(JVM)环境**之上。

目前支持如下程序设计语言编写Spark应用:
Scala
Java
Python
Clojure
R

Spark生态系统

除了Spark核心API之外,Spark生态系统中还包括其他附加库,可以在大数据分析和机器学习领域提供更多的能力。

这些库包括:

Spark Streaming:

Spark Streaming基于微批量方式的计算和处理,可以用于处理实时的流数据。它使用DStream,简单来说就是一个弹性分布式数据集(RDD)系列,处理实时数据。
Spark SQL:

Spark SQL可以通过JDBC API将Spark数据集暴露出去,而且还可以用传统的BI和可视化工具在Spark数据上执行类似SQL的查询。用户还可以用Spark SQL对不同格式的数据(如JSON,Parquet以及数据库等)执行ETL,将其转化,然后暴露给特定的查询。

Spark MLlib:

MLlib是一个可扩展的Spark机器学习库,由通用的学习算法和工具组成,包括二元分类、线性回归、聚类、协同过滤、梯度下降以及底层优化原语。

Spark GraphX:

GraphX是用于图计算和并行图计算的新的(alpha)Spark API。通过引入弹性分布式属性图(Resilient Distributed Property Graph),一种顶点和边都带有属性的有向多重图,扩展了Spark RDD。为了支持图计算,GraphX暴露了一个基础操作符集合(如subgraph,joinVertices和aggregateMessages)和一个经过优化的Pregel API变体。此外,GraphX还包括一个持续增长的用于简化图分析任务的图算法和构建器集合。
除了这些库以外,还有一些其他的库,如BlinkDB和Tachyon。

BlinkDB是一个近似查询引擎,用于在海量数据上执行交互式SQL查询。BlinkDB可以通过牺牲数据精度来提升查询响应时间。通过在数据样本上执行查询并展示包含有意义的错误线注解的结果,操作大数据集合。

Tachyon是一个以内存为中心的分布式文件系统,能够提供内存级别速度的跨集群框架(如Spark和MapReduce)的可信文件共享。它将工作集文件缓存在内存中,从而避免到磁盘中加载需要经常读取的数据集。通过这一机制,不同的作业/查询和框架可以以内存级的速度访问缓存的文件。
此外,还有一些用于与其他产品集成的适配器,如Cassandra(Spark Cassandra 连接器)和R(SparkR)。Cassandra Connector可用于访问存储在Cassandra数据库中的数据并在这些数据上执行数据分析。

二、lecture1

本节主要讲了课程目标,数据分析简史以及三个大数据的例子,最后重点说了一下大数据的数据来源。直接略过。
这里写图片描述

三、lecture2

这里写图片描述
本节主要讲什么是数据科学,和数据科学相关的几个概念,比如数据库、机器学习。然后介绍了一些大牛对如何开展数据科学的观点,以及云计算。最后介绍了数据科学的常见主题和数据科学所发挥的作用。
这里写图片描述

四、lecture3

The big data problem

大数据时代到来,之前用的处理数据的工具比如unix shell、R等只能在单机上跑,但是随着数据量越来越大,单机的计算和存储速度已经不能满足人们的需求,此时唯一的出路就是分布式计算。不过用廉价机器来组成集群的分布式,也存在这诸多问题,比如某台机器运行失败,网络传输慢以及各个机器性能不均匀等。这就需要我们从软件的层面来解决问题

Distributing Work
这里讲了一个分布式非常经典的例子word count。

对与在单机上统计的word count程序,我们只需要遍历一遍,把结果存储在一个哈希表里就行。而假如这个文件非常大时,我们可能需要利用分布式计算框架来计算了。当文件很大时,我们把文件分成很多小块到不同的机器,然后分别对每个小块进行统计和计算。当所有的计算结果结束时,我们把这些结果给到一台机器去合并。这里又有个问题就是,假如这个结果也非常大怎么办,那我们就把相同的单词合并到一个机器(其实就是reduced过程)。
这里写图片描述

这里写图片描述
word count是一般是入门分布式的第一个例子,类似于学一门语言的hello world程序。这里讲的很简单,有兴趣的同学可以搜搜看,例子满大街都是。

有了上面的结果,我们就能做出类似排序的操作了,我们可以知道哪个单词出现的频率最多等等。这里有存在两个问题。

  • 我们如何把数据分发到不同的机器
  • 如何处理某块数据处理失败的问题

先说后面一个问题。当数据处理失败时,最简单直接的方法就是重新开启一个任务处理这块数据。那假如数据处理慢怎么办,那就直接把这个任务kill掉,换太机器处理这块数据,因为这台机器可能不行了。

MapReduce and Spark

在MapReduce的过程中,每一个步骤都涉及到大量的I/O操作。map步骤要先从硬盘上读取数据,处理后,然后把结果存储在硬盘上;reduce操作就要把这些结果从硬盘读出来,处理后又写入硬盘。而这个MapReduce过程会一直重复这几个步骤,这就在I/O上消耗大量的操作,更坑的是I/O处理过程非常慢,所以MapReduce就因为I/O而显得很慢,特别是处理迭代多次的任务。由此诞生了Spark

随着内存的价格下降,这意味着,我们可以把更多的数据放到内存中处理,而不是硬盘上。Spark也就是基于这个思想。理论上来说,Spark要比MapReduce快10到100倍。

Spark会提供一种分布式的包装对象RDD,我们通过RDD来进行各种各样的操作。这里可以把RDD简单理解成一种分布式的数据集合。Spark把分布式背后的细节都隐藏了,我们不需要去处理失败的任务以及特别慢的任务。

Spark无论从功能还是速度上都要优于MapReduce,所以欢迎大家弃MapReduce坑,来Spark这个坑。