【十八掌●武功篇】第十六掌:Spark之RDD简介
来源:互联网 发布:类似英文的拼音域名 编辑:程序博客网 时间:2024/06/05 11:15
这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:大数据技术●降龙十八掌
- 系列文章:
- 【十八掌●武功篇】第十六掌:Spark之Scala安装和HelloWorld
【十八掌●武功篇】第十六掌:Spark之Scala语法快速概览
【十八掌●武功篇】第十六掌:Spark之简介、安装、Demo
【十八掌●武功篇】第十六掌:Spark之RDD简介
一、 定义
1、 RDD定义
RDD是弹性分布式数据集(Resilient Distributed Dataset)的简称,其实就是分布式元素集合。在Spark中,对数据的所有操作不外乎创建RDD、转化已有的RDD、调用RDD操作进行求值。
2、 操作类型
RDD有两种类型的操作:Transformation操作、Action操作,Transformation操作和Action操作区别在于Spark计算RDD的方式不同。
- Transformation操作会由一个RDD生成另一个新的RDD,生成的新的RDD是惰性求值的,只有在Action操作时才会被计算。
- Action操作会对RDD计算出一个结果,并把结果返回到驱动器程序中,或者是把结果存储到外部存储系统中。
二、 Spark RDD五大特性
RDD是弹性分布式数据集,是Spark中最关键、最基本的一个抽象,他代表的是不可变的、分区的集合,这个集合可以被并行处理。
Internally, each RDD is characterized by five main properties:
- A list of partitions
- A function for computing each split
- A list of dependencies on other RDDs
- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for
an HDFS file)
1、 RDD是分区的
一个RDD对应的数据集合是分区的,各个分区分布在各个机器当中,每个RDD是不可变的,每个分区对应一个Task。
查看rdd的分区数量:
scala> val rdd=sc.textFile("/input.txt")scala> rdd.getNumPartitions16/10/18 05:16:24 INFO mapred.FileInputFormat: Total input paths to process : 1res2: Int = 2
2、 每个分区都可以运用函数
每个分区上都应用于一个函数,各个分区运行的计算逻辑是一样的,只是数据不同。
3、 每个RDD都有一系列其他依赖
每个RDD依赖于一系列的RDD,因为有DAG,所以能找到依赖的RDD,目的是可以进行容错,当某一个RDD操作失败了,可以找到他的依赖进行重新计算。
查看某一个rdd的血缘关系:
scala> val rdd=sc.textFile("/input.txt")scala> var wordcountRdd=rdd.flatMap(line => line.split(" ")).map(word =>(word,1)).reduceByKey((a,b)=>(a+b))scala> wordcountRdd.toDebugStringres3: String = (2) ShuffledRDD[4] at reduceByKey at <console>:29 [] +-(2) MapPartitionsRDD[3] at map at <console>:29 [] | MapPartitionsRDD[2] at flatMap at <console>:29 [] | /input.txt MapPartitionsRDD[1] at textFile at <console>:27 [] | /input.txt HadoopRDD[0] at textFile at <console>:27 []
4、 键值对RDD类型可以指定分区方式
对于键值对类型的RDD,可以制定一个分区方式。
5、 数据本地化
Task所运行的机器与处理的数据在同一个机器上,就是数据本地化。
三、 RDD创建方式
1、 并行化集合
scala> val list=List(1,2,3,4,5,6,7)scala> val rddNum=sc.parallelize(list)scala> rddNum.countres0: Long = 7
2、 从外部数据集读取
可以从HDFS读取文件加载数据或者HBbase加载数据。
scala> val rdd=sc.textFile("/input.txt")res1: Long = 5
四、 RDD三大Operation
1、 transformation(转换)
从一个RDD变为另外一个RDD的操作叫做transformation操作,transformation的操作都是懒操作,即不会立即执行,只有当进行action操作时才会真正的去执行。
如:map()、filter()、distinct()
2、 action(执行)
action操作能返回Driver程序一个值或者是导出数据到外部系统。
比如:count()、reduce()、collect()、take()
3、 Persistence(持久化)
缓存数据到内存、磁盘、外部的存储器。
persist():缓存数据,可以指定缓存级别。
cache():就是调用的persist(),缓存级别为内存。
(1) 缓存级别:
- NONE:都不存储
- DISK_ONLY:只存储在磁盘
- DISK_ONLY_2:只存储在磁盘,存储两个副本
- MEMORY_ONLY:只存放内存中
- MEMORY_ONLY_2:只存放在内存中,存储两个副本。
- MEMORY_ONLY_SER:只存储在内存中并序列化到磁盘
- MEMORY_ONLY_SER_2:只存储在内存中并序列化到磁盘,存储两个副本
- MEMORY_AND_DISK:优先放入内存,内存不够就放在硬盘
- MEMORY_AND_DISK_2:优先放入内存,内存不够就放在硬盘,存储两个副本
- MEMORY_AND_DISK_SER:优先放入内存,内存不够就放在硬盘,并序列化
- MEMORY_AND_DISK_SER_2:优先放入内存,内存不够就放在硬盘,并序列化,存储两个副本
- OFF_HEAP:外部存储。
(2) 何时进行缓存
有两种情况下要进行缓存:
- RDD之后会被使用很多次
- 某个RDD的数据是经过非常复杂的清洗过滤得到的
五、 Spark Application调度
1、 Spark Application组成结构图
(1) 一个Application有多个Job,一个Action操作会产生一个Job。
(2) 每个Job有多个stage
(3) 每个stage有多个task,每个task是一个线程
(4) 每个task业务逻辑相同,数据不同
2、 Spark Application 运行架构
(1) Spark应用的运行架构主要分三部分:Driver、Executor、Cluster Manager。
(2) Driver Program负责提交Job,Spark在Driver Program的main函数中,创建一个SparkContext的实例,使用SparkContext来提交Job。
(3) Cluster Manager是个外部的服务,主要起管理资源的作用,它可能是standalone manager、Mesos,YARN。
(4) Application:只指创建在Spark上的用户程序,包括集群上的Driver Program和Executors两部分。
(5) Application Jar:一个jar包包含了用户的Spark Application,一个jar包可以有很多 Application,Jar包里不能包含Hadoop和Spark的包,Hadoop包和Spark包会在运行时被添加
(6) Worker节点,是集群中用来运行代码的节点,是实际来干活的机器。
(7) Executor负责来执行任务,运行在Worker节点上,是一个进程,在Executor上运行很多Task,每一个Task是一个线程。一个Executor只属于一个Application。
(8) Task是一个工作的单位是一个线程,运行在Executor上。
(9) Job是一个并行的计算,包含多个task,通常RDD一个Action执行时就触发一个Job。
(10) Stage:每一个Job会被划分为几个Stage,每个Stage之间是相互依赖的。
这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:大数据技术●降龙十八掌
- 【十八掌●武功篇】第十六掌:Spark之RDD简介
- 【十八掌●武功篇】第十六掌:Spark之简介、安装、Demo
- 【十八掌●武功篇】第十六掌:Spark之Scala安装和HelloWorld
- 【十八掌●武功篇】第十六掌:Spark之Scala语法快速概览
- 【十八掌●武功篇】第八掌:HBase之基本概念
- 【十八掌●武功篇】第八掌:HBase之Shell
- 【十八掌●武功篇】第十掌:Hive之基本语法
- 【十八掌●武功篇】第十掌:Hive之原理与优化
- 【十八掌●武功篇】第十掌:Hive之高级知识
- 【十八掌●武功篇】第十掌:Hive之安装过程实践
- 【十八掌●武功篇】第七掌:MapReduce之工作机制
- 【十八掌●武功篇】第七掌:MapReduce之序列化和压缩
- 【十八掌●武功篇】第八掌:HBase之基本操作Java API
- 【十八掌●武功篇】第八掌:HBase之过滤器总结
- 【十八掌●武功篇】第八掌:HBase之性能调优
- 【十八掌●武功篇】第八掌:HBase之安装与集成
- 【十八掌●武功篇】第十二掌:Flume之工作原理与使用
- 【十八掌●武功篇】第十二掌:Flume之Source、Channel、Sink
- C++ 线程的封装
- ios 视图动画的Option枚举值
- 一些好的网站记录(PART 7)
- D3 进入-更新-退出 理解
- 中小企业的架构之道
- 【十八掌●武功篇】第十六掌:Spark之RDD简介
- 假如时光倒流,我会这么学习Java
- Cortex系列ARM内核介绍
- 深入理解Composer autoload
- 使用snoopy logger记录用户命令
- 百度推广客户端下载地址
- 人工神经网络概念梳理与实例演示
- 给Java新手的一些建议——Java知识点归纳(Java基础部分)
- IndentationError: unindent does not match any outer indentation level(关键词:Web开发/bug)