Spark for beginners 笔记 2.Spark 编程模型

Spark 编程模型 

随着数据量的增加,ETL (ExtractTransform, and Load )工具也随之激增。能够把数据从一个源移动到另一个目的地,并在移动过程中进行处理,是这个时代的需求。但当前大多数ETL工具只能支持少量的数据类型, 数据源和数据目的地,并且无法扩展。由于这些严格的限制,有时甚至一些只需要一个步骤的Transform需要做多步操作才能完成。这些错综复杂的方法造成了人力和计算资源不必要的浪费。2005前的ETL 工具也没有利用到计算机的多核体系架构,导致一些简单但冗长的数据处理工作需要运行很多个小时甚至几天。


Spark 依靠其处理大量数据类型,数据源和数据目的地的能力在市场中引起巨大反响。Spark提供的最重要和基本的数据抽象是RDD(resilient distributed dataset弹性分布式数据集)。Spark支持在集群的多个节点上运行分布式处理。当部分节点失效,Spark框架能处理这些失败,这就是RDD中resilient表示的意义。RDD中distributed表示Spark能够将大数据集拆分成多块,然后将它们分发到多个节点上执行。换句话说,Spark一开始就被设计为能将数据抽象切分为多个小块并分发到多个节点上并行处理,同时可以优雅的处理节点失败。


Spark函数式编程

程序逻辑的副作用可能导致运行时对象的突变,无法从程序得到一致的结果,这使很多应用程序非常复杂。如果编程语言的函数能像数学函数一样表现精准,比如函数输出仅仅依靠输入,这会让应用程序的结果更好预测。函数式编程范式强调构建这类函数的过程。基于JVM的编程语言中,Scala语言时是最重要的之一,它拥有强大的函数式编程能力并且没有失去面向对象特性。Spark主要由Scala编写,并采用了很多Scala的优秀理念。

理解SparkRDD

Spark从Scala中汲取的最重要的特征是能将函数作为参数应用到Spark Transformation 和 Spark Action。Spark的RDD经常表现得就像Scala的一个集合对象一样。因此,一些Scala集合的数据转化方法名也被SparkRDD采用,并表示同样的功能。这使得有Scala经验的人员能轻松的使用SparkRDD。

Spark RDD是不可变的

被创建的RDD有一些强制规则。一旦被创建,无论有意或者无意,它不能被改变。当处理某个RDD的一部分的节点失效时,驱动程序可以重新创建这些部分,并安排其他节点处理这些任务,最终完成整个数据的处理任务。

由于RDD是不可变的,在分割数据为多份小数据,分发到不同节点上处理和最终合并结果的过程都可以安全完成,而不用担心潜在的数据改变。

Spark RDD是可分发的

如果Spark运行在有多个节点可执行任务的集群上,所有节点有不同的执行上下文。这些任务是分布式的并运行在不同的JVM上。一个大的RDD活动会被划分为多个小块,分发到工作节点上处理,最后装配结果,这些对用户完全是透明的。

Spark有自己的错误恢复机制,因此数据抽象是高度弹性的。

Spark RDD 存活在内存中

Spark将尽可能多的RDD存放在内存中,只有当Spark内存溢出或数据增加超过容量时,才会写到磁盘上。大多数情况下,RDD处理都是在内存中,所以Spark处理速度非常快。

Spark RDD是强类型的

Spark RDD 能被任何支持的数据类型创建。这些数据类型可以是Scala/Java支持的自带的数据类型或者用户创建的类型,比如类。这样设计的最大优点是数据类型问题可以在编译时被检查出来。

用RDD进行数据变换和执行(Data transformation and actions)

Spark 用RDD进行数据处理。数据从数据源比如文本文件,MySql等被读取然后形成RDD。我们来看如下一个收集了零售银行事物的RDD,它的类型是RDD[(string,string,doule)]。
AccountNoTranNoTranAmount
SB001TR001250
SB002
TR004
450
SB003
TR010
120
SB001
TR012
-120
SB001
TR015
-10
SB003
TR020
100



现在想要从根据RDD计算每个账户的Amount:
1.转换形成key-value对(AccountNo,TranAmount)
2.对每个key,在TranAmount上执行加操作, 生成另一个RDD[(AccountNo,TotalAmount)],这里的TotalAmount是对应的AccountNo所有TranAmount的和。
3.根据AccountNo排序然后存储输出。

在上述描述的处理中,出了存储输出,都是Spark transformation。存储输出是Spark action。当transformation被应用时,Spark并不执行,真正的执行是在第一个action被调用时,然后依次按序应用transformation。这种方式是基于懒惰赋值( Lazy Evaluation)的概念。

除了存储输出,还有很多其他的Spark action:
  • 对RDD元素进行计数
  • 获取RDD的第一个元素
  • 遍历RDD的所有元素
等等。

在Spark中,有大量的transformation 可用,大部分将函数作为输入参数来执行transformation。换句话说,这些执行在RDD上的transformation基于用户定义的函数,这是非常有用的。

Spark 中action的数量没那么多, 但也非常有用。用户可以根据需求自己实现action。有许多用来从不同数据来源读取和写入数据的Spark 连接程序。这些连接程序由个人或者供应商开发,用于连接Spark。比如 Spark Cassandra Connector用于从Spark连接Cassandra ,它含有一个action :saveToCassandra。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值