我对于spark并行处理的理解正确吗

第一个问题中的两种方式是有区别的:1. 直接用sc.textFile生成RDD,这个RDD里面存储的是一些元信息,包含文件名等。对它进行filter、collect操作的时候,会根据RDD对应的文件信息将RDD划分成多个partition,每个partition的处理过程作为一个task分发到executor端执行。执行完之后driver将partition collect后的结果聚合到driver端。2. 第二段代码你在textFile和filter两个操作中间加了两个动作,一个对初始的rdd进行collect,然后对结果进行parallelize。大家都知道collect是一个action操作,返回的是一个scala标量,即相当于你把文件读出来,生成rdd,然后把rdd的每个partition结果算出来,聚合到driver端,再使用parallelize方法生成一个新的RDD。第二段代码比第一段代码多了一个collect再重生成RDD的操作(这个场景中,这两步是没有必要的),会慢很多。第二个问题:会。sqlcontext相当于把原来的rdd封装了一层,变成了dataframe
■网友
@狗叔 的回答已经比较清楚了。
【我对于spark并行处理的理解正确吗】 这里额外解释下 parallelize 存在的意义。parallelize 这个API的作用就是把一个scala native的collection转化为一个RDD,只不过题主这里的第二段代码传给parallelize 的scala collection是通过textFile(xxx).collect() 而来的,单就题主的例子来说parallelize确实没必要。更“正常”的parallelize 的使用场景是把当前某个scala collection distribute出去当做一个RDD来进行后续操作:
val something = sc.parallelize($some_computation_produces_a_scala_collection)// some further RDD operations on $something第二段代码比第一段代码多了一个collect再重生成RDD的操作(这个场景中,这两步是没有必要的),会慢很多。除了前面答案提到的会慢很多,还有个问题是,如果driver端的memory存不下整个文件的结果,会报OOM。
请问以下使用parallelize方法的代码是否和上面代码完成一样的工作?从功能上来说,完成的工作是一样的。但是textFile生成的是HadoopRDD, parallelize生成的是ParallelCollectionRDD,二者实现RDD的相关接口的方式不一样,也就是说二者完成相同“工作”的过程是不一样的。 (有兴趣的话,可以看看这两个是如何override RDD.getPartitions和RDD.compute等)

■网友
对于第一个问题的理解我是跟你一样的
■网友
我的理解是parallelize在你不指定资源的时候生效。而分块,存在hdfs上的文件本身就是分块的,所以应该是直接将job代码发到块所在的机器然后执行。
■网友
我也是初学,我尝试下回答第一个问题(个人理解)1、RDD 记录的只是 它从哪里来?经过怎样的加工转换而来?所以在调用所有的转换操作,都不会真实的操作数据,仅仅只是新生了一个RDD只有调用的action类型的操作,才会触发对数据的一系列转换动作。


    推荐阅读