SparkRDD内核
Spark内核
RDD是基础,是spark中一个基础的抽象,是不可变的,比如我们加载进的数据RDD,如果想更改其中的内容是不允许的;分区的集合,可以并行来计算;RDD类中包含了很多基础的操作,例如map filter persist,RDD的数据是加载到内存中,使用persist可将内存中的数据持久化到磁盘中,也可以持久化到内存中。对RDD的一些算子操作放在PairRDDFunctions类中,比如groupByKey、join等
任何操作会通过隐式转换自动匹配任何类型的RDD
Resilient Distributed Dataset 弹性分布式数据集
每个RDD有五个主要的特性。RDD可以有副本,通过persist的方式持久化出副本。初始加载是没有副本的,初始加载到内存中只有一个。
五大特性(前3个特性每个RDD都有)
A list of partitions
每个RDD是由一组partition组成的
每个partition是在一个节点中连续的数据
在HDFS中存储的文件分为多个block块,每个block块对应一个partition
数据会遵循数据本地性,当spark使用HDFS中的数据文件时,文件的block在哪个节点,就会将该block加载到自身节点内存中,形成partition,供spark使用。
A function for computing each split
从数据的角度看一个partition对应一个split
并行计算如果对RDD进行map操作,会把map操作应用到每个partition上去
A list of dependencies on other RDDs
RDD会记着由谁产生,为了做容错,因为RDD是瞬时的转化,如果上个RDD存在,那么用上个RDD的数据接着计算,如果上个RDD不存在,那么再往前找
PairRDD依赖FilterRDD依赖HadoopRDD
RDD的生成在内存中,内存中的数据不稳定,如果宕机,数据就没了,spark会重算,spark是并行计算,partition:HadoopRDD-> FilterRDD ->PairRDD,如果计算过程中某条线出现了错误,那spark只会重新计算这条线,不会影响其他partition。
Optionally, a Partitioner for key-value RDDS
可对RDD重新进行分区,提高并行度,提高计算速度,分区多了,partition中的数据就少了,计算也就快了,有相应的算子。默认分区方式是对key取哈希取模,hash-partitioned,根据下游partition的数量,partition的数量是几就模几。
键值对的RDD可以自定义分区,所有RDD都可以进行分区
Optionally, a list of preferred locations to compute each split on
数据本地性
如果读HDFS中的block,一个block有三个副本,就有一个最优位置,但是如果读的是本地文件,就会随便放在某台spark节点,那么此选项就没用了
sc.textFile()将HDFS的数据封装到RDD,遵循数据本地性,HDFS中数据文件的block在哪台机器,就会加载到哪台机器的内存中。
partition是具体的概念,指在某个节点中连续的数据
RDD是抽象的概念
spark运行时
Driver:驱动程序,任务调度,发配当前的job任务,将任务切分为多个task,把task发到每个物理节点,task将每个物理节点的数据加载到对应机器的内存中,在内存中一条线的进行计算,将计算结果返回给驱动程序。不同的job,driver在不同机器上,这样才能做到分布式(mapreduce中的job)
流程示意
分布式文件系统(File system)--加载数据集
都是封装为RDD
transformations延迟执行—针对RDD的操作
所有操作都是针对RDD,每步转化成为算子操作
Action触发执行
碰到action就会将之前的代码封装为job,提交到集群中执行
代码示例
filter是transformation算子,延迟算子
count是action算子,立即执行。
碰到filter延迟算子,不先计算,碰到action算子会把前边的代码封装为job,提交到集群中进行运算。
errors.persist(); errors.cache();等价。
持久化在内存。如果RDD需要复用,需要持久化,以供后边代码使用。如果不持久化,那么计算http_errors时会重新计算之前的代码生成errors。
RDD是瞬时存在的状态,产生新的RDD,旧的RDD就没了。
SparkRDD内核的更多相关文章
- Linux 内核概述 - Linux Kernel
Linux 内核学习笔记整理. Unix unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠. 1973 年,在用 ...
- [PHP内核探索]PHP中的哈希表
在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...
- QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...
- 模仿Linux内核kfifo实现的循环缓存
想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...
- [内核笔记1]内核文件结构与缓存——inode和对应描述
由来:公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列,然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作,尽量的减少Nginx的阻塞. 但是由于System/V消 ...
- ucos实时操作系统学习笔记——内核结构和任务创建
对于ucos实时操作系统,邵贝贝的那本书已经写得很详细了,我因为之前不深的研究过ucos,所以在这里做一个笔记,写一些个人对该操作系统的理解,仅仅是个人理解,如果有人看到这边随笔有不对的地方,望给我指 ...
- linux内核调试技术之修改内核定时器来定位系统僵死问题
1.简介 在内核调试中,会经常出现内核僵死的问题,也就是发生死循环,内核不能产生调度.导致内核失去响应.这种情况下我们可以采用修改系统内核中的系统时钟的中断来定位发生僵死的进程和函数名称.因为内核系统 ...
- linux内核调试技术之自构proc
1.简介 在上一篇中,在内核中使用printk可以讲调试信息保存在log_buf缓冲区中,可以使用命令 #cat /proc/kmsg 将缓冲区的数区的数数据打印出来,今天我们就来研究一下,自己写k ...
- linux内核调试技术之printk
原创博客:欢迎转载,转载请注明出处https://i.cnblogs.com/EditPosts.aspx?postid=6218383 1.简介(基于s3c2440 linux) 在内核调试技术之中 ...
随机推荐
- 使用rsa进行http传输加密
目录 1. RSA算法 2. HTTPS 2.1 HTTPS优点 2.2 HTTPS缺点 3. RSA传输加密实现 3.1 所需插件 3.1.1 JS插件 3.1.2 所需JAR 3.1.3 代码 4 ...
- Atitit. Atiposter 发帖机版本历史 编年史
Atitit. Atiposter 发帖机版本历史 编年史 V1 初步实现sina csdn cnblogs V2 实现qzone sohu 的发帖功能 顺便重构接口实现分离 V3多文件循环发帖 ...
- KiB、MiB与KB、MB的区别
原来没太注意MB与MiB的区别,甚至没太关注还有MiB这等单位,今天认真了一下,发现两者还是有区别的,具体的差别是MB等单位以10为底数的指数,MiB是以2为底数的指数,如:1KB=10^3=1000 ...
- Linux进程间通信(一) - 管道
管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道. 例如:ps | grep vsftpd .管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准 ...
- ios __block typeof 编译错误解决
type specifier missing a parameter list without types is only allowed in a function definition 解决: 工 ...
- python基础-------python2.7教程学习【廖雪峰版】(二)
2017年6月7日14:59:27任务: 看完python基础1.计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文 ...
- gridControl使用集锦
1.grid控件默认选择一行时,focused的cell并不是蓝色的,而是白色的 要想实现一次选择一行全都是蓝色的只要改一个属性就可以了 this.gridView1.OptionsSelection ...
- 浅谈<持续集成、持续交付、持续部署>(二)
集成是指软件个人研发的部分向软件整体部分交付,以便尽早发现个人开发部分的问题:部署是代码尽快向可运行的开发/测试节交付,以便尽早测试:交付是指研发尽快向客户交付,以便尽早发现生产环境中存在的问题.如果 ...
- (比赛)A - Simple String Problem
A - Simple String Problem Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%lld & ...
- java操作文件流对象
所有流对象 InputStream 字节流 FileInputStream 字节流 专门读写非文本文件的 BufferedInputStream 高效流 OutPutS ...