spark笔记总结

RDD基础:


transformation操作:由一个RDD生成新的RDD, 转化操作是惰性的

action操作:由RDD生成其他数据类型,向驱动器返回结果或者把结果写入外部文件系统。

默认情况下,RDD会在每次进行action操作时重新计算。

常用转化操作:

每次针对一个元素的操作:

filter:过滤出符合条件的数据,蚕食不改变输入的原始数据。

map:对每个元素返回一个输出元素,返回类型不需要喝输入的类型一样。

flatMap:对每个输入元素生成多个输出元素,返回值是一个序列的迭代器,输出的RDD倒不是由迭代             器组成的,我们得到的是一个包含各个迭代器可访问的所有元素的RDD。

(理解map和flatMap的区别:map输出的元素个数和输入的个数相同,但是每个元素的类型可能变了,比如由一个String变成了一个String数组。而flatMap将这些元素拍扁,这样个数可能变多了。)


伪集合操作:

RDD本身不是严格意义上的集合,但是支持数学上的集合操作,比如合并和相交操作,但是这些操作要求RDD是相同数据类型的。

distinct:去除重复元素, 为了确保元素只有一份,所以要经过网络混洗,因此开销比较大。

union:返回一个包含两个RDD中所有元素的RDD。不需网络混洗。

intersection:返回两个RDD中都有的元素。需网络混洗。

subtract:返回只存在第一个RDD而不存在第二个RDD中的所有元素组成的RDD。需网络混洗。

cartesian:返回两个RDD的笛卡尔积。


常用行动操作:

行动操作:

take:获取RDD中少量的元素到本地。

top:获取前几个元素。

collect:获取整个RDD中的元素到本地,因此数据规模大的时候不宜使用。

reduce:将操作RDD的两个元素并返回同样类型的一个元素。要求输入和输出类型一样。

fold:和reduce一样,外加一个计算的初始值。要求输入和输出类型一样。

aggregate:可以代替map后接fold方式,不要求输入和输出类型一样。

takeSample:从数据中获取一个采样,并指定时候替换。

count:计算RDD中元素个数。

countByValue:各元素在RDD中出现的次数。

foreach:不论什么情况,都可以使用foreach行动操作来对RDD中的每个元素进行操作,而不需要把RDD发回本地。


键值对操作:


键值对RDD通常用来进行聚合计算。当需要把一个普通的RDD转为par RDD时,可以调用map函数实现。不论是基础RDD的转化操作还是行动操作,在pair RDD上同样可用。

常用动机操作:

1.pair RDD动机操作:

countByKey:对每个键对应的元素分别计数。

collectAsMap:将结果以映射表的形式返回,以便查询。

lookup:返回制定键对应的所有值。

常用转化操作:

1.每次针对一个元素的操作:

reduceByKey:合并具有相同键的值。

groupByKey:对具有相同键的值进行分组。

combineByKey:使用不同的返回类型合并具有相同键的值。

mapValues:对pair RDD中的每个值应用一个函数而不改变键。

flatMapValues:对pair RDD中的每个值应用flatMap,然后将返回的每个元素都生成一个对应原键的键值对纪录。

keys:返回一个仅包含键的RDD。

values:返回一个仅包含值的RDD。

sortByKey:返回一个根据键排序的RDD。

2.针对两个pair RDD的转化操作。

subtractByKey:删除第一个pair RDD中与第二个pair RDD中键相同的元素。

join:对两个pair RDD进行内链接。

rightOuterJoin:对两个pair RDD进行右外链接。确保第二个RDD键一定存在。

leftOutJoin:对两个pai RDD进行左外链接。确保第一个RDD键一定存在。

cogroup:将两个RDD中拥有相同键的数据分组到一起。


向spark传递函数时需要注意:

python不要传某个对象的成员活着对某个对象的一个字段的引用,这样spark会将整个对象都发到工作节点上,高效的方式的用局部变量记录需要传的值。

scala也同样存在上述问题。解决办法也是用局部变量接收需要传的字段。


持久化:

scala和java中,默认情况下persist会把数据以序列化的形式缓存在JVM的堆空间中,在python中,会始终序列化存储的数据,所以持久化级别默认值就是以序列化后的对象存储在jvm堆空间中。当把数据写到磁盘或者堆外存储时,也总是使用序列化后的数据。

如果缓存的数据太多,内存中放不下,spark会自动利用最近最少使用的缓存策略把最老的分区从内存中移除。


分区:

pair RDD都可以进行分区,可以调用partitionBy指定分区方式,partitionBy是一个转化操作,因此它不改变原来的RDD,而是返回一个新的RDD。当调用partitionBy之后记得进行persist,否则分区操作带来的好处将被抵消。

能从分区中获得好处的操作包括:cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reduceByKey, combineByKey, lookup。

对于二元操作,输出数据分区方式取决于父RDD的分区方式,默认情况下,结果会采用哈希分区,如果父RDD以设置过分区方式,那么结果将采用那种分区方式,如果两个RDD都设置过分区方式,结果RDD将采用第一个父RDD的分区方式。


Spark运行时架构:

Spark集群采用的是主/从结构,中央协调节点称为驱动器节点,与之对应的工作节点被称为执行器节点(驱动器节点和执行器节点都是逻辑概念)。Spark应用通过一个叫做集群管理器(例如spark自带的独立集群管理器,Yarn,Mesos等。)的外部服务在集群中的机器上启动。

驱动器节点:

执行main方法的进程,它执行用户编写的用来创建SparkContext,创建RDD,以及进行RDD的转化和行动操作的代码。(注意,具体的RDD task在执行器里执行。)

职责:1.将用户程序转为任务。

2.对执行器节点调度任务。

执行器节点:

作用:1.负责运行组成Spark应用的任务,并将结果返回给驱动器进程。

2.通过自身的块管理器为用户程序中要求缓存的RDD提供内存式存储。


集群上运行spark程序的详细过程:

1. 用户通过spark-submit脚本提交应用。

2. spark-submit脚本启动驱动器程序,调用用户自定义的main方法。

3. 驱动器程序与集群管理器通信,申请资源以启动执行器结点。

4. 集群管理器为驱动器程序启动执行器结点。

5. 驱动器进程执行用户应用中的操作,根据程序中所定义的对RDD的转化和行动操作,驱动器节点把工作以任务的形式发送到执行器进程。

6. 任务在执行器程序中进行计算并保存结果。

7. 如果驱动器程序的main方法退出,或者调用了SparkContext.stop,驱动器程序会终止执行器进程,并且通过集群管理器释放资源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容