Spark 123

    RDD(Resilient Distributed Datasets) 弹性分布式数据集合

 一、 RDD 的创建方式

    1、并行化一个集合(List)

    2、从外部存储系统,如 hdfs、hbase

    注意:默认情况下,spark读取hdfs的时候会创建一个分区为文件的每一个块(block可能是64M或者128M)

二、RDD的操作

    1、转换(transformations),所有的转化操作都是惰性的,执行完毕后不会立即返回结果。

JavaRDD<String> lines = sc.textFile("data.txt"); 
JavaRDD<Integer> lineLengths = lines.map(s -> s.length()); 
int totalLength = lineLengths.reduce((a, b) -> a + b);

    第一个RDD,lines不会立即执行,第二个lineLenths同样不会立即执行,因为textFile、map都是惰性的,只有reduce被调用的时候,整个任务才会执行,reduce是个action操作。当reduce被调用的时候就会将整个计算分成任务分发到集群中的每一个物理机器,每一个机器执行map、reduce操作,最后将结果返回给驱动程序。

    如果我们想一会继续使用lineLengths整个RDD,可以如下设置

lineLengths.persist(StorageLevel.MEMORY_ONLY());

三、shuffle

    一个任务会产生一个分区,以reducebykey为例

    最大的挑战是相同的k不在同一个partition,即使在同一个机器,也需要将不同的partition数据组织起来,何况多台机器呢?   

    首先假设:集群中的一台机器产生了(hello,1)、(hello、1)、(hello、1)......

    如果这些k-v由不同的任务(task)产生、那么结果就会落在不同的partition。比如:前两个k-v在partiontion1、后一个在partition2,当reducebyKey任务执行的时候,需要寻找所有的partition,将相同的k的v取出来,最后计算出最终结果,这就是shuffle过程。

    记住,上面的例子是一个机器,如果是多台机器呢?当然会跨机器传输数据,毫无疑问。

四、Stage

    Task是运行在集群上的基本单位,一个Task处理一个RDD的partition,所以RDD的多个partition会由多个Task来完成,当然多个Task的处理逻辑是一样的,这一组Task就组成了一个Stage。



你可能感兴趣的:(Spark 123)