什么是Spark

Apache Spark是一个开源集群运算框架, 相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中,Spark使用了存储器内运算技术,能在数据尚未写入硬盘时即在存储器内分析运算。Spark在存储器内运行程序的运算速度能做到比Hadoop MapReduce的运算速度快上100倍,即便是运行程序于硬盘时,Spark也能快上10倍速度。Spark允许用户将数据加载至集群存储器,并多次对其进行查询,非常适合用于机器学习算法。

为什么需要Spark

在Spark 之前,我们已经有了Hadoop,Hadoop 作为大数据时代企业首选技术,方兴未艾,我们为什么还需要Spark 呢?

Hadoop 对某些工作并不是最优的选择:

中间输出到磁盘,会产生较高的延迟。

缺少对迭代运算的支持。

Spark项目构成要素

Spark核心和弹性分布式数据集(RDDs)

Spark核心是整个项目的基础,提供了分布式任务调度,调度和基本的I/O功能。而其基础的程序抽象则称为弹性分布式数据集(RDDs),是一个可以并型操作、有容错机制的数据集合。 RDDs可以通过引用外部存储系统的数据集创建(例如:共享文件系统、HDFS、HBase或其他 Hadoop 数据格式的数据源)。或者是通过在现有RDDs的转换而创建(比如:map、filter、reduce、join等等)。

RDD抽象化是经由一个以Scala, Java, Python的语言集成API所呈现,简化了编程复杂性,应用程序操纵RDDs的方法类似于操纵本地端的数据集合。

Spark SQL

Spark SQL在Spark核心上带出一种名为SchemaRDD的数据抽象化概念,提供结构化和半结构化数据相关的支持。Spark SQL提供了领域特定语言,可使用Scala、Java或Python来操纵SchemaRDDs。它还支持使用使用命令行界面和ODBC/JDBC服务器操作SQL语言。在Spark 1.3版本,SchemaRDD被重命名为DataFrame

MLlib

MLlib是Spark上分布式机器学习框架。Spark分布式存储器式的架构比Hadoop磁盘式的Apache Mahout快上10倍,扩充性甚至比Vowpal Wabbit要好。 MLlib可使用许多常见的机器学习和统计算法,简化大规模机器学习时间,其中包括:

汇总统计、相关性、分层抽样、假设检定、随机数据生成

分类与回归:支持向量机、回归、线性回归、决策树、朴素贝叶斯

协同过滤:ALS

分群:k-平均算法

维度缩减:奇异值分解(SVD),主成分分析(PCA)

特征提取和转换:TF-IDF、Word2Vec、StandardScaler

最优化:随机梯度下降法(SGD)、L-BFGS

Spark是MapReduce的替代方案,而且兼容HDFS、Hive等分布式存储层,可融入Hadoop的生态系统,以弥补缺失MapReduce的不足

Spark相比Hadoop MapReduce的优势如下:

  1. 中间结果输出

    基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任务管道承接的考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而

    这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。

    Spark将执行模型抽象为通用的有向无环图执行计划(DAG),这可以将多Stage的任务串联或者并行执行,而无须将Stage中间结果输出到HDFS中。类似的引擎包括Dr yad、Tez。
  2. 数据格式和内存布局

    Spark抽象出分布式内存存储结构弹性分布式数据集RDD,进行数据的存储。RDD能支持粗粒度写操作,但对于读取操作,RDD可以精确到每条记录,这使得RDD可以用来作为分布式索引

    Spark的特性是能够控制数据在不同节点上的分区,用户可以自定义分区策略,如Hash分区等.Shark和Spark SQL在Spark的基础上实现了列存储和列存储压缩
  3. 执行策略

    Spark任务在shuffle中不是所有情景都需要排序,所以支持基于Hash的分布式聚合,调度中采用更为通用的任务执行计划图(DAG),每一轮次的输出结果在内存缓存
  4. 任务调度的开销

    传统的MapReduce系统,是为了运行长达数小时的批量作业而设计的,在某些极端的情况下,提交一个任务的延迟非常高

    Spark采用了事件驱动的类库AKKA来启动任务,通过线程池复用线程来避免进程或线程启动和切换开销

Spark的"HelloWorld"

Spark 提出了一种分布式的数据抽象,称为 RDDs(resilient distributed datasets,弹性分布式数据集),是一个可并行处理且支持容错的数据集,同时,也是一个受限的数据集,RDDs是一个只读的、记录分区的数据集,仅支持transformationaction两种操作,这些受限,使得RDDs可以以较小的成本实现高容错性、可靠性。

RDDs有两种创建方式,一种是从外部数据源创建,另一种是从其它RDDs transform而来。transformation 是对RDDs进行确定性的操作,输入是RDDs,输出RDDs。action 是向应用程序返回值或者将结果写到外部存储。

最后,transformation具有 LAZY 的特点,当在RDDs上进行一次transformation时,并不会立即执行,只会在进行action时,前面的transformation才会真正执行。这个特点,被 Spark 用来优化整个工作链路,可以有效减少网络沟通、传输时间(大数据处理过程中,网络传输可以说是最大的性能杀手),从而大幅提高运行速度。

举个例子,我们具有如下代码:

lines = spark.textFile("hdfs://...")                                  // 第一行,读取外部数据源,生成一个RDDs;
errors = lines.filter(_.startsWith("ERROR")) // 第二行,在RDDs lines上做了一次transformation运算 filter,取出以”ERROR” 开头的所有行,得到一个新的RDDs errors;
errors.cache() // 第三行,缓存RDDs;
errors.count() // 第四行,在errors 上执行action,得到errors的行数。

整个过程中,只有在执行count()时,才会真正开始读取数据、过滤、缓存、计算行数。

上述整个过程,称为lineage,根据lineage,可以从具体的物理数据,计算出相应的结果。在Spark中,实现容错就是根据 lineage,当某个分区失败后,重新进行一次计算即可,而不是采用检查点、回滚等代价高昂的方式。同时,lineage 是Spark用来优化计算流程的依据。

可以参考此处

什么是Spark的更多相关文章

  1. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  2. Spark RDD 核心总结

    摘要: 1.RDD的五大属性 1.1 partitions(分区) 1.2 partitioner(分区方法) 1.3 dependencies(依赖关系) 1.4 compute(获取分区迭代列表) ...

  3. spark处理大规模语料库统计词汇

    最近迷上了spark,写一个专门处理语料库生成词库的项目拿来练练手, github地址:https://github.com/LiuRoy/spark_splitter.代码实现参考wordmaker ...

  4. Hive on Spark安装配置详解(都是坑啊)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/p/a7f75b868568 简介 本文主要记录如何安装配置Hive on Sp ...

  5. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  6. Spark踩坑记——初试

    [TOC] Spark简介 整体认识 Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apach ...

  7. Spark读写Hbase的二种方式对比

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...

  8. (资源整理)带你入门Spark

    一.Spark简介: 以下是百度百科对Spark的介绍: Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方 ...

  9. Spark的StandAlone模式原理和安装、Spark-on-YARN的理解

    Spark是一个内存迭代式运算框架,通过RDD来描述数据从哪里来,数据用那个算子计算,计算完的数据保存到哪里,RDD之间的依赖关系.他只是一个运算框架,和storm一样只做运算,不做存储. Spark ...

  10. (一)Spark简介-Java&Python版Spark

    Spark简介 视频教程: 1.优酷 2.YouTube 简介: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月 ...

随机推荐

  1. java 编写小工具 尝试 学习(四)

    1.在新建 的窗口上 ,添加了一个按钮后 ,给 按钮添加一个事件 ,意思就是  点击按钮后 发生什么事情!不废话 贴图 贴 代码! package jFrameDemo; import java.aw ...

  2. JS n秒后自动跳转实例

    <p><a href="<?php echo base_url();?>usercenter/index" id="message" ...

  3. 确认框,confirm工具封装

    用bootstrap封装了个确认框工具 效果如下 代码如下: /** * 以模态窗做确认框的函数,title为标题栏内容,body为消息体,yesFun为点击确认按钮后执行的函数,执行后会执行关闭并删 ...

  4. JS中的“==”与强制类型转换

    JavaScript中有“==”与“===”,那么他们有何区别呢? 对于基本数据类型, ===  (!==)只有当两个变量的类型和值都相等时,才返回true:而 == (!=)则会对变量进行强制类型转 ...

  5. C++ 内存、new与malloc分配内存区别?

    一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建. ...

  6. 关于gitbash一直报:sh: __git_ps1: command not found的解决办法

    curl -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-pro ...

  7. 解决微信小程序用 SpringMVC 处理http post时请求报415错误

    解决微信小程序用 SpringMVC 处理http post时请求返回415错误 写微信小程序时遇到的问题,这个坑硬是让我整了半天 wx.request请求跟ajax类似处理方法一致 小程序端请求代码 ...

  8. Java中常见的比较

    一.StringBuffer.StringBuilder.String 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBu ...

  9. 【Keil】Keil5添加源程序和头文件

    xxx.c就是源程序 xxx.h就是头文件 [源程序添加方法] 双击文件夹,例如图片上的Source,跳出弹窗,选择需要添加的源程序即可 [添加头文件的方法] 1.首先点击图片红框处,或是在文件夹te ...

  10. 第8天 Java基础语法

    第8天 Java基础语法 今日内容介绍 Eclipse开发工具 超市库存管理系统 Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动编译,检 ...