Spark调研笔记第5篇 - Spark API简介

由于Spark是用Scala实现的,所以Spark天生支持Scala API,此外,还支持Java和Python API。以Spark 1.3版本的Python API为例,其模块层级关系如下图所示:

从上图可知,pyspark是Python API的顶层package,它包含了几个重要的subpackages,其中:

1) pyspark.SparkContext

它抽象了指向spark集群的一条连接,可用来创建RDD对象,它是API的主入口。

2) pyspark.SparkConf

通过它可在提交的应用代码中动态创建spark app的配置并作为conf参数传给pyspark.SparkContext实例的构造函数。若未动态创建conf,则pyspark.SparkContext实例从conf/spark-defaults.conf读取默认的全局配置。

3) pyspark.RDD

RDDs can be stored in memory between queries without requiring replication. Instead, they rebuild lost data on failure using lineage: each RDD remembers how it was built from other datasets (by transformations like
map, join or groupBy) to rebuild itself.

RDD是Spark编程的核心抽象概念,它代表了一个抽象的弹性分布式数据集,Spark支持对RDD进行两类操作:transformations和actions,它们所包含的函数列表可以参考官方文档的"Transformations"和"Actions"部分。

根据Spark Programming Guide文档"RDD Operations"部分的说明,根据已经存在的数据集创建新数据集的操作被称作transformation;对数据集做计算并将结果返回driver
program的操作被称作action

例如,map是根据传入的函数参数对已有RDD做处理,其运行结果得到一个新的RDD,所以它是一个transformation操作;而reduce则是根据传入的函数参数对已有RDD做计算,计算结果不再是个RDD,而是个具体的值(对reduce来说,计算结果是个具体的数字,而其它action(s)得到的可能是个list或其他数据结构),所以reduce是个action操作。

需要特别强调的是,Spark对所有的transformations操作都采用lazy evaluation的策略,也即spark在调度时并不是对遇到的每个transformation都立即求值以得到新的RDD,而是将针对某个RDD的一系列transformations操作记录下来,只有最终遇到action操作时,Spark才会计算先前记录的每个transformations。

这种lazy evaluation的设计思路使得Spark得以更高效运行,因为调度器可以对从初始RDD到最终action操作路径上的transformations做合并或其它变换,且只有最终的action操作结果才会返回给driver program,节省了transformations操作的中间结果在集群worker node和driver program间的传输开销。

默认情况下,调用action操作时,初始RDD经过的每个transformation操作均会被执行一次,在多个actions会经过一系列相同的transformations操作时,这种recompute显得并不高效。因此,在实际开发Spark计算任务脚本时,会被多个actions共用的transformations结果最好调用persist或cache缓存起来,这样会节省不少计算时间。

4) pyspark.Broadcast

通过Broadcast广播的变量的作用域对应用所申请的每个节点上的executor进程都是可见的,而且广播后,变量会一直存在于每个worker节点的executor进程中,直到任务结束,这样可以避免RDD数据集在driver和worker节点的executor进程间频繁传输带来的开销。

尤其是对于某些用到只读共享变量的应用(如需要加载字典且所有计算节点均需访问该字典),广播可以高效地实现变量共享的目的。

5) pyspark.Accumulator

它是Spark支持的另一种变量共享的方式(第1种方式是上面介绍的Broadcast),worker节点上的进程可以通过add()操作更新变量,更新后的变量会自动传播回driver program。

6) pyspark.SparkFiles

当应用通过SparkContext.addFile()向集群提交任务用到的文件时,调用SparkFiles类的相关方法可以解析这些文件路径并访问文件。

7) pyspark.StorageLevel

它可以指定RDD的存储级别,如只使用内存、只使用磁盘、内存为主磁盘为辅,等等。详细的控制标识可以参考这里的文档。

【参考资料】

1. Spark Programming Guide - RDD Operations

2. pyspark package

3. Spark Programming Guide: RDD Transformations

4. Spark Programming Guide: RDD Actions

5. pyspark package: pyspark.StorageLevel

======================= EOF ====================

时间: 2025-01-07 01:43:24

Spark调研笔记第5篇 - Spark API简介的相关文章

Spark调研笔记第5篇 - Spark API简单介绍

因为Spark是用Scala实现的,所以Spark天生支持Scala API.此外,还支持Java和Python API. 以Spark 1.3版本号的Python API为例.其模块层级关系例如以下图所看到的: 从上图可知,pyspark是Python API的顶层package,它包括了几个重要的subpackages.当中: 1) pyspark.SparkContext 它抽象了指向spark集群的一条连接,可用来创建RDD对象,它是API的主入口. 2) pyspark.SparkCo

Spark调研笔记第1篇 - Spark简介

在公司线上项目中引入Spark已经将近1年时间了,从效果来看,Spark确实是能提高生产力的优秀分布式计算平台. 从本篇笔记开始,会把之前调研Spark时的调研报告分享出来(限于篇幅,会分成几篇文章),以便帮助刚接触Spark的朋友们尽快入门. 下面开始正文. 1. 项目背景 Spark项目于2009年诞生于UC Berkeley AMP Lab并于2010年正式提交Apache Software Foundation成为开源项目.目前已经成为Apache下的明星项目,其代码提交活跃度在整个社区

Spark调研笔记第6篇 - Spark编程实战FAQ

本文主要记录我使用Spark以来遇到的一些典型问题及其解决办法,希望对遇到同样问题的同学们有所帮助. 1. Spark环境或配置相关 Q: Spark客户端配置文件spark-defaults.conf中,spark.executor.memory和spark.cores.max应该如何合理配置? A: 配置前,需要对spark集群中每个节点机器的core和memory的配置有基本了解.比如由100台机器搭建的spark集群中,每个节点的配置是core=32且memory=128GB,那么,向该

Spark调研笔记第3篇 - Spark集群相应用的调度策略简单介绍

Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明. 1. 应用间调度 1) 调度策略1: 资源静态分区 资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分配时的最小粒度是一个静态的partition. 依据应用对资源的申请需求为其分配静态的partition(s)是Spark支持的最简单的调度策略. 我们已经知道,不同的应用有各自的Spark Context且占用各自的JVM和executor(s).依据Spark Job Scheduling文档的

Spark调研笔记第3篇 - Spark集群对应用的调度策略简介

Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明. 1. 应用间调度 1) 调度策略1: 资源静态分区 资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分配时的最小粒度是一个静态的partition.根据应用对资源的申请需求为其分配静态的partition(s)是Spark支持的最简单的调度策略. 我们已经知道,不同的应用有各自的Spark Context且占用各自的JVM和executor(s).根据Spark Job Scheduling文档的说

Spark调研笔记第7篇 - 应用实战: 如何利用Spark集群计算物品相似度

本文是Spark调研笔记的最后一篇,以代码实例说明如何借助Spark平台高效地实现推荐系统CF算法中的物品相似度计算. 在推荐系统中,最经典的推荐算法无疑是协同过滤(Collaborative Filtering, CF),而item-cf又是CF算法中一个实现简单且效果不错的算法. 在item-cf算法中,最关键的步骤是计算物品之间的相似度.本文以代码实例来说明如何利用Spark平台快速计算物品间的余弦相似度. Cosine Similarity是相似度的一种常用度量,根据<推荐系统实践>一

Spark调研笔记第4篇 - PySpark Internals

其实,有两个名为PySpark的概念,一个是指Spark客户端内置的pyspark脚本,而另一个是指Spark Python API中的名为pyspark的package. 本文只对第1个pyspark概念做介绍. 1. Spark客户端内置的pyspark"命令" Spark客户端支持交互模式以方便应用调试,通过调用pyspark可以进入交互环境: cd /path/to/spark/ && ./bin/pyspark 用编辑器查看可知,pyspark其实是个shel

日志收集系统Flume调研笔记第1篇 - Flume简介

用户行为数据的收集无疑是构建推荐系统的先决条件,而Apache基金会下的Flume项目正是为分布式的日志收集量身打造的,本文是Flume调研笔记的第1篇,主要介绍Flume的基本架构,下篇笔记将会以实例说明Flume的部署和使用步骤. 本文所用的Flume版本为目前最新版的ver1.5.2,它属于Flume-NG,在系统架构上与Flume-OG有所区别,二者的不同可以参考FlumeWiki文档的说明. 1. Flume是什么 Flume是Apache基金会下的一个开源项目,它实现了一套分布式的.

Spark发行笔记8:解读Spark Streaming RDD的全生命周期

本节主要内容: 一.DStream与RDD关系的彻底的研究 二.StreamingRDD的生成彻底研究 Spark Streaming RDD思考三个关键的问题: RDD本身是基本对象,根据一定时间定时产生RDD的对象,随着时间的积累,不对其管理的话会导致内存会溢出,所以在BatchDuration时间内执行完RDD操作后,需对RDD进行管理. 1.DStream生成RDD的过程,DStream到底是怎么生成RDD的? 2.DStream和RDD到底什么关系? 3.运行之后怎么对RDD处理? 所