spark的缓存方法

使用spark开发已有几个月。相比于python/hive,scala/spark学习门槛较高。尤其记得刚开时,举步维艰,进展十分缓慢。不过谢天谢地,这段苦涩(bi)的日子过去了。忆苦思甜,为了避免项目组的其他同学走弯路,决定总结和梳理spark的使用经验。

操作方法

  • 01

    Spark基础 基石RDD spark的核心是RDD(弹性分布式数据集),一种通用的数据抽象,封装了基础的数据操作,如map,filter,reduce等。RDD提供数据共享的抽象,相比其他大数据处理框架,如MapReduce,Pegel,DryadLINQ和HIVE等均缺乏此特性,所以RDD更为通用。 简要地概括RDD:RDD是一个不可修改的,分布的对象集合。每个RDD由多个分区组成,每个分区可以同时在集群中的不同节点上计算。RDD可以包含Python,Java和Scala中的任意对象。

  • 02

    Spark生态圈中应用都是基于RDD构建(下图),这一点充分说明RDD的抽象足够通用,可以描述大多数应用场景。 RDD操作类型—转换和动作 RDD的操作主要分两类:转换(transformation)和动作(action)。两类函数的主要区别是,转换接受RDD并返回RDD,而动作接受RDD但是返回非RDD。转换采用惰性调用机制,每个RDD记录父RDD转换的方法,这种调用链表称之为血缘(lineage);而动作调用会直接计算。 采用惰性调用,通过血缘连接的RDD操作可以管道化(pipeline),管道化的操作可以直接在单节点完成,避免多次转换操作之间数据同步的等待。 使用血缘串联的操作可以保持每次计算相对简单,而不用担心有过多的中间数据,因为这些血缘操作都管道化了,这样也保证了逻辑的单一性,而不用像MapReduce那样,为了竟可能的减少map reduce过程,在单个map reduce中写入过多复杂的逻辑。

  • 03

    RDD使用模式 RDD使用具有一般的模式,可以抽象为下面的几步 加载外部数据,创建RDD对象 使用转换(如filter),创建新的RDD对象 缓存需要重用的RDD 使用动作(如count),启动并行计算 RDD高效的策略 Spark官方提供的数据是RDD在某些场景下,计算效率是Hadoop的20X。这个数据是否有水分,我们先不追究,但是RDD效率高的由一定机制保证的: RDD数据只读,不可修改。如果需要修改数据,必须从父RDD转换(transformation)到子RDD。所以,在容错策略中,RDD没有数据冗余,而是通过RDD父子依赖(血缘)关系进行重算实现容错。 RDD数据在内存中,多个RDD操作之间,数据不用落地到磁盘上,避免不必要的I/O操作。 RDD存放的数据可以是java对象,所以避免的不必要的对象序列化和反序列化。 总而言之,RDD高效的主要因素是尽量避免不必要的操作和牺牲数据的操作精度,用来提高计算效率。

  • 04

    Spark使用技巧 RDD基本函数扩展 RDD虽然提供了很多函数,但是毕竟还是有限的,有时候需要扩展,自定义新的RDD的函数。在spark中,可以通过隐式转换,轻松实现对RDD扩展。画像开发过程中,平凡的会使用rollup操作(类似HIVE中的rollup),计算多个级别的聚合数据。下面是具体实, /** * 扩展spark rdd,为rdd提供rollup方法 */ implicit class RollupRDD[T: ClassTag](rdd: RDD[(Array[String], T)]) extends Serializable { /** * 类似Sql中的rollup操作 * * @param aggregate 聚合函数 * @param keyPlaceHold key占位符,默认采用FaceConf.STAT_SUMMARY * @param isCache,确认是否缓存数据 * @return 返回聚合后的数据 */ 上面代码声明了一个隐式类,具有一个成员变量rdd,类型是RDD[(Array[String], T)],那么如果应用代码中出现了任何这样的rdd对象,并且import当前的隐式转换,那么编译器就会将这个rdd当做上面的隐式类的对象,也就可以使用rollup函数,和一般的map,filter方法一样。

  • 05

    RDD相关操作都需要传入自定义闭包函数(closure),如果这个函数需要访问外部变量,那么需要遵循一定的规则,否则会抛出运行时异常。闭包函数传入到节点时,需要经过下面的步骤: 驱动程序,通过反射,运行时找到闭包访问的所有变量,并封成一个对象,然后序列化该对象 将序列化后的对象通过网络传输到worker节点 worker节点反序列化闭包对象 worker节点执行闭包函数, 注意:外部变量在闭包内的修改不会被反馈到驱动程序。 简而言之,就是通过网络,传递函数,然后执行。所以,被传递的变量必须可以序列化,否则传递失败。本地执行时,仍然会执行上面四步。 广播机制也可以做到这一点,但是频繁的使用广播会使代码不够简洁,而且广播设计的初衷是将较大数据缓存到节点上,避免多次数据传输,提高计算效率,而不是用于进行外部变量访问。

(0)

相关推荐

  • 千牛怎么清理缓存?两种清理千牛缓存方法介绍

    千牛怎么清理缓存呢?如果缓存太多,千牛客户端会提示清理缓存,但是有很多朋友对于千牛怎么清理缓存还不太清楚,下文小编就为大家带来两种清理千牛缓存方法介绍,有需要的朋友一起去看下吧。 两种清理千牛缓存方 ...

  • UC浏览器电脑版怎么清除缓存?UC浏览器清除缓存方法

    当我们的浏览器用久了,垃圾就多了,快点来让你的浏览器减减肥吧。以UC浏览器为例小编教大家怎么让你的浏览器减肥,甩掉不必要的垃圾。分享一篇UC浏览器清除缓存方法,希望能帮到大家 1、双击打开你的uc浏览 ...

  • 如何清理ie缓存? 清理IE缓存方法

    如何清理IE缓存?怎么清理IE浏览器缓存?经常见到网友提问,小编转载了一下腾讯客服官网的步骤方法教大家一步步清理自己的IE缓存。记住,IE缓存一定要定期清理,这样浏览器就不会老是出现问题了,例如网页打 ...

  • Firefox和IE浏览器清除缓存方法

    IE浏览器清除缓存的方法 工具 =》Internet选项 =》浏览历史记录 =》删除 =》选中Internet临时文件夹 =》确定 请仔细对照上图,删除缓存避免调试程序时不刷新问题。 Firefox清 ...

  • 如何清空DNS缓存方法/命令

    如何清空DNS缓存方法/命令 微软windows下如何清空DNS缓存 In Microsoft Windows, you can use the command ipconfig /flushdns ...

  • win8.1修复图标缓存方法

    win8.1修复图标缓存方法 具体操作方法很简单,便是按组合键win+r打开运行窗口,输入ie4uinit -show并按回车执行,如图所示: 执行之后,便会自动重建并修复图标缓存.

  • 逗拍在哪里清除缓存垃圾?逗拍清除缓存方法

    当你的手机内存快慢了的时候,就应该适当清理下缓存垃圾了,那么你们知道逗拍的缓存垃圾应该怎么清除么,下面就让我们小编来教你们逗拍清除缓存方法吧! 1)首先我们先打开[逗拍],然后来到[我的]界面地啊你[ ...

  • Mac怎么QQ清理缓存 苹果Mac清理QQ缓存方法

    平时在 Mac 上使用 QQ 久以后,难免会接收到很多图片,文件,文字等内容,时间久了以后就会越来越多.如果这些东西太多的话,不仅会占用磁盘空间,还会让影响 QQ 的运行速度.这里简单介绍下怎么在 M ...

  • 新版微信怎么清除缓存 新版微信清理缓存方法流程

    新版微信怎么清理缓存方法流程: 微信每隔一段时间就会更新,或优化体验或推出小功能,最近的一次更新很多用户发现清理缓存这个功能不见了,其实微信团队并没有把它去除,只是隐藏得更深了,就让小编带着你重新找回 ...