Spark随笔(一):Spark的综合认识

一、Spark与Hadoop的关系

  Spark和Hadoop只是共用了底层的MapReduce编程模型,即它们均是基于MapReduce思想所开发的分布式数据处理系统。

  Hadoop采用MapReduce和HDFS技术,其MapReduce计算模型核心即Map操作和Reduce操作,在这个计算模型的工作流程中还存在一些可以由用户自定义的Partition和Combine等操作;HDFS则是对Hadoop的输入文件、Map产生的结果文件、Shuffle产生的结果文件等等的一个文件管理系统,其IO操作都是基于磁盘的。Hive、HBase、Pig、Mathout和ZooKepper等都是基于Hadoop开发的系统。

  Hadoop处理的数据量本身很大时,经过N个Map操作会被划分为多个数据块,一般这些块都需要经过merg操作存放到磁盘中,IO量是很大的,尤其是小文件(文件大小要小于系统处理的block时)数量过多时,不仅IO操作增多而且还会拖累网络的流量负载。众所周知,对于迭代计算,Hadoop只能是鞭长莫及,因为许多处理的中间文件都被放置在磁盘中,要利用这些中间文件进行迭代计算对系统性能来说是不现实的。Hadoop本身的容错机制即冗余副本,占据了很多资源,当然,Hadoop2已经开始使用log的方法来强化容错机制。

  Spark对计算模型进行了细化,MapReduce的计算模型被分为transformations操作和actions操作,transformations操作包含了map、reduceByKey、union和join等许多对数据集RDD进行转换的操作,而actions则提供了对数据集中的数据操作的接口。数据集RDD是基于内存的,甚至可以将一个RDD视为一个静态变量类型,这样进行迭代计算就成为了可能,而且减少了磁盘IO操作。

二、粗粒度与细粒度的共享内存模式

  粗粒度的寻址模式相比细粒度的寻址模式,可以寻址的最小页的大小要大一些。这一点被Spark运用得非常灵活。

  首先,粗粒度寻址是RDDs所采取的寻址方式。尽管页面相比细粒度下比较大,但是由于许多应用都是执行相同的迭代操作,所以并不影响系统性能。粗粒度寻址来共享内存也是RDDs划分的重要依据,否者页面太小,导致数据集容量有限,对计算性能是不利的。

  其次,RDDs支持不同方式的寻址。RDDs在写操作时采用粗粒度寻址,而读方式下却可以采取粗粒度或者细粒度的寻址方式。同时,在进行故障恢复时,RDDs会通过细粒度方式寻址及lineage的低开销来实现。

三、RDDs与Spark

  RDDs的运用成就了Spark。Spark的工作单位是数据集RDDs,而对RDD的操作实际上是对其内部的Partitions的操作。

  RDDs之间的关系分为两类:narrow dependencies和wide dependencies,前者是指RDD的工作分区只允许一个child RDD共享,而后者则指RDD的工作分区允许多个child RDD共享。一般来说,map操作产生的都是narrow dependencies的RDD,而join操作产生的都是wide dependencies的RDD,总之不同的操作依靠其特性会产生不同的依赖关系。narrow dependencies的RDD由于资源利用呈流式,所以适合于以管道形式来并行执行操作。

  Spark在RDDs上执行任务时,RDDs是由parent RDD创建的,这个parent RDD即目标RDD,其所创建的RDD负责执行副本任务。执行阶段:首先,每个阶段都会尽可能多的安排一些narrow dependencies的transformations操作;然后,每个阶段相互交接的时间段即shuffle阶段,这一阶段需要wide dependencies的操作或者一部分Partitions已经执行完并且能够减缓parent RDD计算压力的RDD;最后,就是对执行失败的RDDs进行恢复重新执行,直到目标RDD(parent RDD)执行完成。

  transformations操作包括:

  1、map操作。map操作返回一个RDD,操作对象与parent RDD具有相同的分区表和优先级,可以返回parent RDD迭代计算所需的值。

  2、union操作。union操作返回一个RDD,操作对象为两个RDD,将这两个RDD的Partitions进行合并操作。

  3、simple操作。

  4、join操作。join操作可能产生narrow dependencies、wide dependencies或者混合的RDDs。当join的对象RDDs都具有相同的Partition函数时,产生narrow dependencies的RDDs;当RDDs的Partition函数不同时,产生wide dependencies;一个有Partition函数而一个没有时,产生混合RDDs。无论哪种情况,结果RDD都含有一个继承的或者默认的Partition函数。

  5、reduceByKey操作。

  action操作包括:

  1、count操作。对RDD的长度计数。

  2、collect操作。获取RDD中的一列数据。

  3、reduce操作。将RDD数据集中的数据返回给用户。

  此外,采用<K,V>的计算模式,Spark和RDDs交互是通过language-intergrated API接口实现的。

四、RDDs的容错机制

  容错机制是RDDs需要重点考虑的因素。首先,RDDs是不能容忍调度错误的。其次,数据的恢复速度是关乎系统性能的重要因素。

  RDD的创建由用户或者RDD执行,而Spark的驱动程序会将RDD从Parent RDD的创建到执行的各个阶段的每一步都记录在lineage中,所以,如果这个RDD任务失败时,Spark会根据相应的lineage在本地或者其他节点上恢复该RDD。上述容错机制需要lineage的记录,而lineage的方法只对narrow dependencies具有良好的效果,对于wide dependencies则效果欠佳。wide dependencies的容错方法一般推荐checkpoint机制。

时间: 2024-10-10 08:46:28

Spark随笔(一):Spark的综合认识的相关文章

[Spark] Scala、Spark史上最全面、最详细、最彻底的一整套视频全集(免费)

(1)<DT大数据梦工厂大数据spark蘑菇云Scala语言全集(持续更新中)> http://www.tudou.com/plcover/rd3LTMjBpZA (2)<Spark零基础视频:从零起步到调通第一个Wordcount> http://www.tudou.com/plcover/IB9YwzdU8f0/ (3)<大数据Spark内核core源码解密> http://www.tudou.com/plcover/JdpoUtqxmNs (4)<大数据sp

Spark学习笔记——Spark Streaming

许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用, 还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它允许用户使用一套和批处理非常接近的 API 来编写流式计算应用,这样就可以大量重用批处理应用的技术甚至代码. Spark Streaming 使用离散化流( discretized stream)作为抽象表示, 叫作 DStream. DStream 是随时间推移而收到的数据的序列.在内部,每个时间区间收到

一、spark入门之spark shell:wordcount

1.安装完spark,进入spark中bin目录: bin/spark-shell scala> val textFile = sc.textFile("/Users/admin/spark/spark-1.6.1-bin-hadoop2.6/README.md") scala> textFile.flatMap(_.split(" ")).filter(!_.isEmpty).map((_,1)).reduceByKey(_+_).collect().

spark配置(4)-----Spark Streaming

Spark Streaming Spark Streaming 使用 Spark API 进行流计算,这意味着在 Spark 上进行流处理与批处理的方式一样.因此,你可以复用批处理的代码,使用 Spark Streaming 构建强大的交互式应用程序,而不仅仅是用于分析数据. Spark Streaming 示例(基于流的单词统计)来演示一下 Spark Streaming:本地服务器通过 TCP 接收文本数据,实时输出单词统计结果. nc -l -p 9999 # 需要另外开启一个终端,记为终

Spark 教程:Spark的体系架构

最近看到一篇关于Spark架构的博文,作者是 Alexey Grishchenko.看过Alexey博文的同学应该都知道,他对Spark理解地非常深入,读完他的 “spark-architecture” 这篇博文,有种醍醐灌顶的感觉,从JVM内存分配到Spark集群的资源管理,步步深入,感触颇多(腾云科技ty300.com).因此,在周末的业余时间里,将此文的核心内容译成中文,并在这里与大家分享.如在翻译过程中有文字上的表达纰漏,还请大家指出. 首先来看一张Spark 1.3.0 官方给出的图片

[pySpark][笔记]spark tutorial from spark official site在ipython notebook 下学习pySpark

+ Spark Tutorial: Learning Apache Spark This tutorial will teach you how to use Apache Spark, a framework for large-scale data processing, within a notebook. Many traditional frameworks were designed to be run on a single computer. However, many data

Spark(十二) -- Spark On Yarn &amp; Spark as a Service &amp; Spark On Tachyon

Spark On Yarn: 从0.6.0版本其,就可以在在Yarn上运行Spark 通过Yarn进行统一的资源管理和调度 进而可以实现不止Spark,多种处理框架并存工作的场景 部署Spark On Yarn的方式其实和Standalone是差不多的,区别就是需要在spark-env.sh中添加一些yarn的环境配置,在提交作业的时候会根据这些配置加载yarn的信息,然后将作业提交到yarn上进行管理 首先请确保已经部署了Yarn,相关操作请参考: hadoop2.2.0集群安装和配置 部署完

Spark教程-构建Spark集群(1)

对于90%以上想学习Spark的人而言,如何构建Spark集群是其最大的难点之一,为了解决大家构建Spark集群的一切困难,家林把Spark集群的构建分为了四个步骤,从零起步,不需要任何前置知识,涵盖操作的每一个细节,构建完整的Spark集群. 从零起步,构建Spark集群经典四部曲: 第一步:搭建Hadoop单机和伪分布式环境: 第二步:构造分布式Hadoop集群: 第三步:构造分布式的Spark集群: 第四步:测试Spark集群: 本文内容为构建Spark集群经典四部曲的第一步,从零起步构建

Spark机器学习:Spark 编程模型及快速入门

http://blog.csdn.net/pipisorry/article/details/52366356 Spark编程模型 SparkContext类和SparkConf类 我们可通过如下方式调用 SparkContext 的简单构造函数,以默认的参数值来创建相应的对象.val sc = new SparkContext("local[4]", "Test Spark App") 这段代码会创建一个4线程的 SparkContext 对象,并将其相应的任务命

Spark 定制版~Spark Streaming(二)

本讲内容: a. 解密Spark Streaming运行机制 b. 解密Spark Streaming架构 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾: 上节课谈到技术界的寻龙点穴,Spark就是大数据的龙脉,而Spark Streaming就是Spark的穴位.假如要构建一个强大的Spark应用程序 ,Spark Streaming 是一个值得借鉴的参考,Spark Streaming涉及多个job交叉配合,几乎可以包括spark的所