spark RDD内容总结(适用于复杂的结构)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011495642/article/details/85837323

1.RDD Checkpointing和RDD cache/persist的区别?

相同点:都需要手动调用方法来保存结果,为了避免前面所做的计算工作丢失

,需要把RDD存到缓存或者checkpoint里。

 

存放目录的区别

是否自动清除?

Checkpointing:自己设置目录,目录下面的文件我们自己来决定是否删除。

cache/persist:只在程序运行时,

存在临时的目录(spark自动管理),程序退出后会自动清除这些文件。

(就像一个临时表)

 

数据内容

persist: 还存了lineage(RDD变化图)

checkpoint:不保留lineage,只存数据。

 

2.广播

spark为什么要广播?

比如说现在有一个RDD,它的两个partition,在N1和N2节点上。

然后我现在要做一个join操作,那我就把这个RDD1的数据广播出去,

广播到所有要和RDD1进行join的节点,这样每台机器上,join都相当于在每台机器

本地做了,这个速度提高的快得多。

和mapsidejoin是一样的道理,把小的数据集广播出去,在大的数据集机器本地做join。

 

例子:

val a =.....        //获得一个rdd

r = a.collect()  //需要先获取rdd的结果,而不能直接把rdd对象广播出去,否则会报错。

val rdd1 = sc.broadcast(r)   //把  r  广播出去,返回一个变量rdd1

rdd2.join(rdd1.value)   // 通过rdd1.value获取该变量的值 ,和rdd2做join操作。

 

注意join: rdd1.join(rdd2) -->rdd1必须大于rdd2的数据集,否则的话,

就是大数据集像小数据做shuffle(迁移),这样消耗太大,显然应该小的

向大的靠拢。

 

3.Accumulators(计数器)

因为你可能会在多个worker node上面并行的去计数,

这个没有详细讲没看懂例子,用到再说。

 

4.分区大小的设置

(1)每个partition不可以超过2G

因为spark内部把数据放到缓存里,这个缓存最大的值就是整型最大的值,

所以不能溢出超过2G。

(2)比较合理的是每个partition是128M

为什么是128M,不是137M?

hdfs的block size不就是128M么,1.0里是64M,2.0变成了128M,给的经验值。

(3)当partition数目小于但是接近2000个,请直接设置为大于2000的一个值。

因为2000以下和2000以上采用的是不同的优化方法。

这个一般比较少遇到。

 

5.Data skew 数据倾斜

就是数据分区,比如分成5个partition,有的分区明显数据太多,有的太少。

两种解决办法:

(1)repartition

val result = rdd1.repartition(5)     //重新分区,我试了半天作用不太大。

result.saveAsTextFile("file:///home/liugen/sp1")

去这个目录查一下就可以

 

(2)加盐

就是在不同的key前面加1,2,3,4

然后你再按key来分就是平均分配了。

 

6.必考面试题

如何查找一篇文章中重复的单词

 

7.通过dataFrame加载csv,json文件

val df = spark.read.format("json").load("file:///root/customer.json")

df.show    //打印出来,格式较为整齐

 

格式

 

 

 


 

 

 

展开阅读全文

没有更多推荐了,返回首页