Spark核心—RDD初探

本文目的

?

最近在使用Spark进行数据清理的相关工作,初次使用Spark时,遇到了一些挑(da)战(ken)。感觉需要记录点什么,才对得起自己。下面的内容主要是关于Spark核心—RDD的相关的使用经验和原理介绍,作为个人备忘,也希望对读者有用。

?

为什么选择Spark

?

原因如下

  1. 代码复用:使用Scala高级语言操作Spark,灵活方便,面向对象,函数编程的语言特性可以全部拿来。Scala基本上可以无缝集成java及其相关库。最重要的是,可以封装组件,沉淀工作,提高工作效率。之前用hive + python的方式处理数据,每个处理单元是python文件,数据处理单元之间的交互是基于数据仓库的表格,十分不灵活,很难沉淀常见的工作。
  2. 机器学习:Spark可以实现迭代逻辑,可以轻松实现一些常见的机器学习算法,而且spark自带机器学习库mllib和图算法包graphyx,为后面的数据挖掘应用提供了想象空间。

?

Spark计算性能虽然明显比Hadoop高效,但并不是我们技术选型的主要原因,因为现有基于Hadoop +hive的计算性能已经足够了。

?

?

基石哥—RDD

?

整个spark衍生出来的工具都是基于RDD(Resilient Distributed Datesets),如图:

RDD是一个抽象的数据集,提供对数据并行容错的处理。初次始使用RDD时,其接口有点类似Scala的Array,提供map,filter,reduce等操作。但是,不支持随机访问。刚开始不太习惯,但是逐渐熟悉函数编程和RDD 的原理后,发现随机访问数据的场景并不常见。

?

为什么RDD效率高

?

Spark官方提供的数据是RDD在某些场景下,计算效率是Hadoop的20X。这个数据是否有水分,我们先不追究,但是RDD效率高的由一定机制保证的:

  1. RDD数据只读,不可修改。如果需要修改数据,必须从父RDD转换(transformation)到子RDD。所以,在容错策略中,RDD没有数据冗余,而是通过RDD父子依赖(血缘)关系进行重算实现容错。
  2. 多个RDD操作之间,数据不用落地到磁盘上,避免不必要的I/O操作。
  3. RDD中存放的数据可以是java对象,所以避免的不必要的对象序列化和反序列化。

总而言之,RDD高效的主要因素是尽量避免不必要的操作和牺牲数据的操作精度,用来提高计算效率。

?

变量分享

?

RDD使用中,很重要的场景就是变量分享,举个例子:


var my_var = … // 外部变量

my_rdd.map(x => x + my_var)

在上面的例子中,my_rdd是一个RDD[Int]对象,在进行map操作时,RDD会将函数{x => x+my_var}打包成一个java对象,然后序列化,并且分发到my_rdd所在的节点上。但是,my_var是一个外部变量,这种变量是否也会传到其他节点上呢?这取决于实际情况。

?

比如这个例子,


var my_var = 5

my_rdd.map(x => x + my_var)

此时,my_var = 5是会被一起打包,并发送到其他节点上。

?

再看这个例子,


var my_var = read_user_input

my_rdd.map(x => x + my_var)

此时,编译没有问题,但是运行时会报错,声称找不到my_var。其解决方案如下,


var bc_ my_var = spark_context.broadcast(read_user_input)

my_rdd.map(x => x + bc_my_var.value)

显示的通过广播的方式,将变量送到其他节点,这样在运行时,外部变量就可以被正确访问。

?

原则:编译时可以找到外部变量的值,那么将会被打包到RDD函数中;否则,那些只有在运行时才能确定的外部变量,必须通过广播机制,显示的发送到其他节点。

?

参考资料

时间: 2024-08-06 15:15:59

Spark核心—RDD初探的相关文章

(1)spark核心RDD的概念解析、创建、以及相关操作

spark核心之RDD 什么是RDD RDD指的是弹性分布式数据集(Resilient Distributed Dataset),它是spark计算的核心.尽管后面我们会使用DataFrame.Dataset进行编程,但是它们的底层依旧是依赖于RDD的.我们来解释一下RDD(Resilient Distributed Dataset)的这几个单词含义. 弹性:在计算上具有容错性,spark是一个计算框架,如果某一个节点挂了,可以自动进行计算之间血缘关系的跟踪 分布式:很好理解,hdfs上数据是跨

Spark核心RDD:combineByKey函数详解

https://blog.csdn.net/jiangpeng59/article/details/52538254 为什么单独讲解combineByKey? 因为combineByKey是Spark中一个比较核心的高级函数,其他一些高阶键值对函数底层都是用它实现的.诸如 groupByKey,reduceByKey等等 如下给出combineByKey的定义,其他的细节暂时忽略(1.6.0版的函数名更新为combineByKeyWithClassTag) def combineByKey[C]

Spark RDD初探(一)

本文概要 本文主要从以下几点阐述RDD,了解RDD 什么是RDD? 两种RDD创建方式 向给spark传递函数Passing Functions to Spark 两种操作之转换Transformations 两种操作之行动Actions 惰性求值 RDD持久化Persistence 理解闭包Understanding closures 共享变量Shared Variables 总结 Working with Key-Value Pairs.Shuffle operations.patition

Spark的核心RDD(Resilient Distributed Datasets弹性分布式数据集)

Spark的核心RDD (Resilient Distributed Datasets弹性分布式数据集)  原文链接:http://www.cnblogs.com/yjd_hycf_space/p/7681585.html 铺垫 在hadoop中一个独立的计算,例如在一个迭代过程中,除可复制的文件系统(HDFS)外没有提供其他存储的概念,这就导致在网络上进行数据复制而增加了大量的消耗,而对于两个的MapReduce作业之间数据共享只有一个办法,就是将其写到一个稳定的外部存储系统,如分布式文件系统

Spark学习之路---Spark核心概念

Spark核心概念简介 一个Spark应用都由驱动器程序发起集群上的各种并发操作,一个驱动器程序一般包含多个执行器节点,驱动器程序通过一个SaprkContext对象访问saprk.RDD(弹性分布式数据集)----分布式的元素集合,RDD支持两种操作:转化操作.行动操作,如map.reduce函数.

Spark的RDD检查点实现分析

概述 在<深入理解Spark:核心思想与源码分析>一书中只是简单介绍了下RDD的checkpoint,对本书是个遗憾.所以此文的目的旨在查漏补缺,完善本书的内容. Spark的RDD执行完成之后会保存检查点,便于当整个作业运行失败重新运行时候,从检查点恢复之前已经运行成功的RDD结果,这样就会大大减少重新计算的成本,提高任务恢复效率和执行效率,节省Spark各个计算节点的资源.本文着重分析检查点的代码实现,更深入理解其原理.在<深入理解Spark:核心思想与源码分析>一书的第5章中

spark浅谈(2):SPARK核心编程

一.SPARK-CORE 1.spark核心模块是整个项目的基础.提供了分布式的任务分发,调度以及基本的IO功能,Spark使用基础的数据结构,叫做RDD(弹性分布式数据集),是一个逻辑的数据分区的集合,可以跨机器.RDD可以通过两种方式进行创建,一种是从外部的数据集引用数据,第二种方式是通过在现有的RDD上做数据转换.RDD抽象是通过语言集成的API来进行暴露,它简化了编程的复杂度,因为这种操纵RDD的方式类似于操纵本地数据集合 二.RDD变换(API阅读) ** * A Resilient

Spark之RDD的定义及五大特性

RDD是分布式内存的一个抽象概念,是一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,能横跨集群所有节点并行计算,是一种基于工作集的应用抽象. RDD底层存储原理:其数据分布存储于多台机器上,事实上,每个RDD的数据都以Block的形式存储于多台机器上,每个Executor会启动一个BlockManagerSlave,并管理一部分Block:而Block的元数据由Driver节点上的BlockManagerMaster保存,BlockManagerSlave生成Block后向Block

(3)spark核心概念以及运行架构

spark核心概念 我们之前介绍了spark的核心RDD,它是spark操作的基本单元.但是对于spark集群来说你还需要它的其它概念,比如我们操作RDD的时候,资源由谁来管理.任务由谁来执行等等. application:就是我们基于spark开发的应用程序,比如我们写的py文件,一个py文件就可以看成是一个基于spark的应用程序,它是由一个driver进程和多个executor组成.driver和executor是什么先不用管,总之记住一个基于spark的应用程序=1个driver+多个e