一、Spark中coalesce和repartiton的区别
- repartition对数据进行完全洗牌,创建新的数据分区,这些分区的数据量是均衡分布的。
- repartition必然会造成shuffle。
- repartition(num) 相当于 coalesce (num,true) ,既使用coalesce 中shuffle参数为true,必然会产生shuffle无论分区是增加或者减少
- coalesce不会对数据完全洗牌,只移动另外分区数据到不动的分数上,以使得需要shuffle的数据量最小化,这样会使得各分区的数据量不一致。coalesce是repartition的一部分。 二、Spark的部署方式(启动流程是什么)
- local
- standalone
- yarn 三、Spark宽窄依赖 宽依赖:多个子RDD的Partition会依赖同一个父RDD 窄依赖:指每一个负RDD的Partition最多只能被子RDD的一个Partition使用 四、RDD和DataFrame的区别 RDD是一种弹性分布式数据集 最基本的数据抽象,代表一个不可变,可分区,里面元素并行计算的集合 五大特性
-
每一个分区对应就是一个Task线程:这里表示一个rdd有很多分区,每一个分区内部是包含了该rdd的部分数据,spark中任务是以task线程的方式运行, 一个分区就对应一个task线程。用户可以在创建RDD时指定RDD的分区个数,如果没有指定,那么就会采用默认值。(比如:读取HDFS上数据文件产生的RDD分区数跟block的个数相等) RDD的分区其实可以简单这样理解,比如说我现在要来一个wordCount,这个文本的大小是300M,那按照我们 HDFS 的套路,每128M是一个block块,那这个300M的文件就是3个block,然后我们的RDD会按照你这个文件的拥有的block块数来决定RDD的分区数,此时RDD的分区数就是3,但是如果我这个文件本身就小于128M呢,那RDD就会默认为2个分区数。
-
计算函数对每个分区进行计算的操作:Spark中RDD的计算是以分区为单位的,每个RDD都会实现compute函数以达到这个目的.
-
RDD之间存在依赖关系:Spark的容错机制
-
对于每个K-V数据存在分区计算函数(只有k-v数据有);分区函数其实就是把计算的结果丢到不同的分区中。 当前Spark中实现了两种类型的分区函数,一个是基于哈希的 HashPartitioner,另外一个是基于范围的RangePartitioner 只有对于key-value的RDD,并且产生shuffle,才会有 Partitioner,非key-value的RDD的 Parititioner 的值是None。
-
运行计算时在距离数据最近的节点上使用 计算任务的位置优先为存储每个Partition的位置,这里涉及到数据的本地性,数据块位置最优。简单点说也就是说哪里有数据我们就在哪里做计算的意思。
spark任务在调度的时候会优先(注意只是优先,而不是必然)考虑存有数据的节点开启计算任务,减少数据的网络传输,提升计算效率。