Spark基础和RDD
spark
1. Spark的四大特性
- 速度快
spark比mapreduce快的两个原因
- 基于内存
1. mapreduce任务后期在计算的是时候,每一个job的输出结果都会落地到磁盘,后续有其他的job要依赖于前面job的输出结果,这个时候就需要进行大量的磁盘io操作,性能较低 2. spark任务后期在进行计算的时候,job的结果是可以保存在内存中的,后面有其他的job需要以言语前面job的输出结果,这个时候可以直接从内存中读取,避免了磁盘io操作,性能比较高 spark程序和mapreduce程序都会产生shuffle阶段,在shuffle阶段中他们产生的数据都会保留在磁盘中
- 进程与线程
1 mapreduce任务以进程的方式运行在yarn集群中,比如说有100个mapTask,一个task就需要一个进程,这些task要运行就需要开启100个进程 2 spark任务以线程的方式运行在进程中,比如说有100个task,则一个task就对应一个线程
- 易用性
- 可以用java、scala、python、R等不同的语言来快速编写spark程序
- 通用性
- 兼容性
- spark程序有多种运行模式
- standAlone
- spark自带的独立运行模式,整个任务的资源分配由spark集群的的Master来负责
- yarn
- 可以把spark程序提交到yarn上运行,整个任务的资源分配由yarn中的ResourceManager负责
- mesos
- apache开源的一个类似于yarn的资源调度平台
- standAlone
- spark程序有多种运行模式
2. spark集群架构

- Driver
- 他会执行客户端写好的main方法,构建一个SparkContext对象(该对象是所有spark程序的执行入口)
- Application
- 是一个spark的应用程序,包含了客户端的代码和任务运行的资源信息
- ClusterManager
- 给程序提供计算资源的外部服务
- standAlone
- spark自带的集群模式,整个任务的资源分配由spark集群的Master负责
- yarn
- 把spark程序提交到yarn中运行,整个任务的资源分配由yarn中的ResourceManager负责
- mesos
- apache开源的一个类似于yarn的资源调度平台
- standAlone
- 给程序提供计算资源的外部服务
- Master
- Spark集群的主节点,负责任务资源的分配
- Worker
- Spark集群的从节点,负责任务计算的节点
- Executor
- 是一个在worker节点启动的进程
- Task
- spark任务的以task线程的方式运行在worker节点的executor进程中的
3. RDD是什么
- RDD (Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的抽象单位。它代表的是是一个不可变的、可分区的、里面元素可以并行计算的数据集合。
- Resilient 弹性的,表示RDD中的数据既可以保存在磁盘上也能保存在内存中
- Distibuted 分布式的,表示RDD的数据是分布式存储的,方便后期的各种计算
- Dataset 一个数据集合,可以存储很多数据
4. RDD的五大属性
A list of partitions
- 一个分区列表,数据集的基本组成单位
- 这里表示的是一个RDD可能会有多个分区,每个分区会存储该RDD的一部分数据,Spark中任务是以task线程的方式运行的,一个分区就对应一个task
- 一个分区列表,数据集的基本组成单位
A function of computing each split
- 一个用来计算每个分区的函数
- Spark中RDD的计算是以分区为单位的
- 一个用来计算每个分区的函数
A list of dependencies on other RDDs
一个RDD会依赖于其他多个RDD
这里是说RDD和RDD之间是有依赖关系的,spark任务的容错机制就是根据这个特性(血统)而来
Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
一个Patitioner,即RDD的分区函数(可选项)
spark中实现了两种类型的分区函数
1 基于哈希的HashPartitioner,(key.hashcode % 分区数 = 分区号)
2 基于范围的RangePartitioner 只有对于key-value的RDD,并且产生shuffle,才会有Partitioner
非key-value的RDD的Partitioner的值是None
Optionally, a list of preferred locations to compute each split in (e.g. block locations for an HDFS file)
一个列表,存储每个Partition的优先位置(可选项)
spark任务在调度的时候会优先考虑存有数据的节点开启计算任务,以减少数据的网络传输,提成计算效率
5. RDD算子分类
- transformation(转换)
- 根据已经存在的RDD转换生成另外一个新的RDD,它是延迟加载,不会立即执行
- 如
- map、flatMap、reduceByKey
- action(动作)
- 会触发任务的运行
- 将RDD计算的结果数据返回给Driver端,或者保存到外部存储介质(磁盘、内存、HDFS)
- 如
- collect、saveAsTextFile
- 会触发任务的运行
6. RDD常见的算子操作
6.1 transformation算子
| 转换 | 含义 |
|---|---|
| map(func) | 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成 |
| filter(func) | 返回一个新的RDD,该函数由经过func函数计算并且返回值为true的输入元素组成 |
| flatMap(func) | 类似于map,但每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一的元素) |
| mapPartitions(func) | 类似于map,但独立地在RDD的每一个分片上运行,因此在类型为T的RDD上运行时,func的函数类型必须是Iterator[T] => Iterator[U] |
| mapPartitionsWithIndex(func) | 类似于mapPartitions,但func带有一个整数参数表示分片的索引值,因此在类型为T的RDD上运行时,func的函数类型必须是Iterator[T] => Iterator[U] |
| union(otherDataset) | 对源RDD和参数RDD求并集,并返回一个新的RDD |
| intersection(otherDataset) | 对源RDD和参数RDD求交集,并返回一个新的RDD |
| distinct([numTasks])) | 对源RDD进行去重之后返回一个新的RDD |
| groupByKey([numTasks]) | 在一个(k,v)类型的RDD上调用,返回一个(k,v)的RDD |
| reduceByKey(func, [numTasks]) | 在一个(k,v)类型的RDD上调用,返回一个(k,v)的RDD,使用指定的reduce函数,将相同key的值聚合到一起,与groupByKey类似,reduce任务的个数可以通过第二个参数来设置 |
| sortByKey([ascending], [numTasks]) | 在一个(k,v)的RDD上调用,k必须实现Ordered接口,返回一个按照key进行排序的(k,v)RDD |
| sortBy(func,[ascending], [numTasks]) | 与sortByKey类似,但是更灵活,可以自定义排序func |
| join(otherDataset, [numTasks]) | 在类型为(k,v)和(k,w)的RDD上调用,返回一个相同 key对应的所有元素对在一起的(k,(v,w))的RDD |
| cogroup(otherDataset, [numTasks]) | 在类型为(K,V)和(K,W)的RDD上调用,返回一个(K,(Iterable,Iterable))类型的RDD |
| coalesce(numPartitions) | 减少RDD的分区数到指定值 |
| repartition(numPartitions) | 重新给RDD分区 |
| repartitionAndSortWithinPartitions(partitioner) | 重新给RDD分区,并且每个分区内以记录的key排序 |
6.2 action算子
| 动作 | 含义 |
|---|---|
| reduce(func) | reduce将RDD中元素前两个传给输入函数,产生一个新的return值,新产生的return值与RDD中下一个元素(第三个元素)组成两个元素,再被传给输入函数,直到最后只有一个值为止。 |
| collect() | 在驱动程序中,以数组的形式返回数据集的所有元素 |
| count() | 返回RDD的元素个数 |
| first() | 返回RDD的第一个元素(类似于take(1)) |
| take(n) | 返回一个由数据集的前n个元素组成的数组 |
| takeOrdered(n, [ordering]) | 返回自然顺序或者自定义顺序的前 n 个元素 |
| saveAsTextFile(path) | 将数据集中的元素以textFile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本 |
| saveAsSequenceFile(path) | 将数据集中的元素以Hadoop sequenceFile的格式保存到指定的目录,可以是HDFS或者其他Hadoop支持的文件系统 |
| saveAsObjectFile(path) | 将数据集的元素以Java序列化的方式保存到指定的目录下 |
| countByKey() | 针对(k,v)类型的RDD,返回一个(k,int)的map,表示每一个key对应的元素个数 |
| foreach(func) | 在数据集上每个元素上,运行函数func |
| foreachPartition(func) | 在数据集的每个分区上,运行函数func |
Spark基础和RDD的更多相关文章
- Spark 基础及RDD基本操作
什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合.RDD具有数据 ...
- Spark基础:(二)Spark RDD编程
1.RDD基础 Spark中的RDD就是一个不可变的分布式对象集合.每个RDD都被分为多个分区,这些分区运行在分区的不同节点上. 用户可以通过两种方式创建RDD: (1)读取外部数据集====> ...
- Spark基础入门(01)—RDD
1,基本概念 RDD(Resilient Distributed Dataset) :弹性分布式数据集 它是Spark中最基本的数据抽象,是编写Spark程序的基础.简单的来讲,一个Spark程序可以 ...
- 【Spark基础】:RDD
我的代码实践:https://github.com/wwcom614/Spark 1.RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式 ...
- Spark计算模型-RDD介绍
在Spark集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(Resilient Distributed DataSet,RDD),它是逻辑集中的实体,在集群中的多台集群上进行数据分区.通 ...
- Spark 核心概念 RDD 详解
RDD全称叫做弹性分布式数据集(Resilient Distributed Datasets),它是一种分布式的内存抽象,表示一个只读的记录分区的集合,它只能通过其他RDD转换而创建,为此,RDD支持 ...
- Spark学习之RDD编程总结
Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...
- Spark的核心RDD(Resilient Distributed Datasets弹性分布式数据集)
Spark的核心RDD (Resilient Distributed Datasets弹性分布式数据集) 原文链接:http://www.cnblogs.com/yjd_hycf_space/p/7 ...
- 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell
Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...
随机推荐
- 【java面试】Web篇
1.AJAX创建步骤 step1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象: step2. 创建一个新的HTTP请求,并指定改HTTP请求的方法.URL以及验证信息: s ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
- Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator
可以推出 min[i]要么是i要么是1,当a序列中存在这个数是1 max[i]的话就比较麻烦了 首先对于i来说,如果还没有被提到第一位的话,他的max可由他后面的这部分序列中 j>=i 的不同数 ...
- 使用FileZilla Pro S3协议访问七牛云对象存储
偶然发现FileZilla还有Pro版本,主要是比免费版多了一些协议支持,也偶然发现七牛云支持了S3协议接口,这样刚好弥补了其没有FTP的不足,于是找官方文档,折腾一下,使用FileZilla Pro ...
- JDBC的学习笔记-手动实现
JDBC是SUN公司提供的一套用于数据库操作的接口,Java程序员只需要面向这套接口编程即可.不同的数据库厂商,需要针对这套接口,提供不同实现. 使用JDBC的好处:1.程序员不需要关注不同数据库的细 ...
- Gradle | Gradle项目无法导入依赖包
Gradle | Gradle项目无法导入依赖包 背景 今天使用idea导入一个Gradle项目,使用 gradle build构建成功,但是项目还是无法正常导入依赖包,显示错误如下: 解决方案 后来 ...
- 什么是 ThreadLocal?
什么是 ThreadLocal? ThreadLocal 诞生于 JDK 1.2,用于解决多线程间的数据隔离问题.也就是说 ThreadLocal 会为每一个线程创建一个单独的变量副本. Thread ...
- 集合详解之 Map
集合详解之 Map + 面试题 集合有两个大接口:Collection 和 Map,本文重点来讲解集合中另一个常用的集合类型 Map. 以下是 Map 的继承关系图: Map 简介 Map 常用的实现 ...
- Oracle 11g 单实例静默安装实战记录(linux)
oracle 11g 单实例静默安装 AUTHOR:Oracle_Ran 环境规划: OS Version : Red Hat Enterprise Linux Server release 6.7 ...
- jdk和dubbo的SPI机制
前言:开闭原则一直是软件开发领域中所追求的,开闭原则中的"开"是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的,“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代 ...