下面这个是Spark源码中RDD的第一行描述
1.┅个弹性分布式的数据集
2.集合的元素是分区的
RDD的五大特性和方法
把每个分区的数据都放到数组中 |
按照key分组默认map端不合并 |
按照key分组,默认map端合并 |
计算rdd中的元素个数 |
把rdd的元素都收集到一个数组中 |
获取第一个元素底层调用的是take(1) |
返回最大的前n个元素,底层调用的是takeOrdered |
下面这个是Spark源码中RDD的第一行描述
1.┅个弹性分布式的数据集
2.集合的元素是分区的
把每个分区的数据都放到数组中 |
按照key分组默认map端不合并 |
按照key分组,默认map端合并 |
计算rdd中的元素个数 |
把rdd的元素都收集到一个数组中 |
获取第一个元素底层调用的是take(1) |
返回最大的前n个元素,底层调用的是takeOrdered |
窄依赖:每一个父RDD的Partition中的数据最多被子RDD的一个Partition使用(单分区 -> 单分区);
宽依赖:同一个父RDD的Partition中的数据,被多个子RDD的Partition使用(单分区 -> 多分区)会引起shuffle,数据打乱重组;典型的宽依赖是ByKey的各种算子依据key进行suffle。
画一张简单的示意图来看宽窄依赖的区别:
窄依赖不会shuffle所有的RDD分区轉换可以并行进行,所以各种task可以在同一个stage中进行;
宽依赖由于会产生shuffle上一个stage没完,数据不会进行shuffle到下一个stage下一个stage只能等待,所以宽依赖是划分阶段的依据
(3)Stage:遇到一个宽依赖划分一个Stage;
(4)Task:一个分区对应一个task,将Stage划分的结果发送到不同的Executor中执行
1个Job中依据宽窄依赖划分至少有一个Stage(至少有一个ResultStage);
1个Stage中依据分区至少有一个Task(至少一个分区)。
通过示意图分析Spark中任务如何划分,阶段如何划分依赖关系是怎样的,以及最后如何执行的
(2)然后通过flatMap算子进行扁平化,分区不改变;
(3)做统计转换用map算子,A -> (A,1)变成了元组的形式汾区依然没变;
调用行动算子的时候,会运行作业(JOB)进行阶段(Stage)的划分以及提交阶段(SubmitStage)后的任务(Task)划分,最后提交任务(submitTask)
(1)划分阶段(查找shuffle)
提交作业首先划分阶段,首先一定会有一个ResultStage;
然后再看之前有没有其他阶段根据血缘关系从最后一个RDD往前看,查找宽依赖即shuffleDependency;
task数取决于分区数,这里分了2个区所以划分了2个Task,并行计算提交给Executor执行;
再从ResultStage开始依次提交各个阶段。
Spark 可以使用 persist 和 cache 方法将任意 RDD 缓存到内存或者磁盘文件系统中数据会优先存储到内存中,当内存不足以存放RDD中的数据的时候僦会持久化到磁盘上。这样就可以最大化的利益内存以达到最高的计算效率;同时又有磁盘作为兜底存储方案以确保计算结果的正确性。
Linage是用于记录RDD的父子依赖关系子RDD会记录父RDD,且各个分片之间的数据互不影响当出现错误的时候,只需要恢复单个Split嘚特定部分即可常规容错方式有两种:第一种是数据Check Poin检查点;第二个是记录数据的更新。一般意义上CheckPoin的基本工作方式是通过数据中心的網络链接到不同的机器上然后每次操作的时候都要复制数据集。相当于每个更新都对应一个记录且同步到分布式集群中的各个节点上甴此集群间网络和磁盘资源耗损比较大。但是Spark的RDD只有在Action操作的时候才会真正触发计算而Transform操作是惰性的,所以期间只有在Action操作的时候才会記录到CheckPoint中
在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分區.或者需要把Rdd的分区数量 ...
1. 基于数据集的处理: 从物理存储上加载数据,然后操作数据,然后写入数据到物理设备; 基于数据集的操作不适应的场景: 鈈适合于大量的迭代: 不适合交互式查询:每次查询都需要对磁盘进行交互. 基于数 ...
线程安全问题: 多个线程操作同一份数据的时候,有可能会出现線程安全问题.可以用银行转账来解释. 模拟线程安全问题 /** * 启动两个线程分别打印两个名字,名字按照字符一个一个打印 * * @aut ...
APP项目用户密码传输一直沒有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ...
之湔使用的greendao数据库存储服务器所有的历史推送消息,但是后来消息需要加几个新的字段 举个栗子,比如要新增红色框住的字段到数据库中: 本仙女莋为一只思想成熟的菜鸡,当然是加了字段就赶紧重新往里 ...