Spark 之 sql 缓存

hkl曰:缓存对于一些复用程度很高的rdd来说是很有用的,可以很大程度上提高效率。

 

1.几种缓存数据的方法

 

例如有一张Hive表叫做activity

1.CACHE TABLE

 
  1. //缓存全表

  2. sqlContext.sql("CACHE TABLE activity")

  3.  
  4. //缓存过滤结果

  5. sqlContext.sql("CACHE TABLE activity_cached as select * from activity where ...")

  6.  

CACHE TABLE是即时生效(eager)的,如果你想等到一个action操作再缓存数据可以使用CACHE LAZY TABLE,这样操作会直到一个action操作才被触发,例如count(*)

 
  1. sqlContext.sql("CACHE LAZY TABLE ...")

  2.  

取消hive表缓存数据

sqlContext.sql("UNCACHE TABLE activity")
hkl曰:
上代码不废话:有现成的API
 
val videoCenterMac = sqlContext.sql(s"select * from xlold.video_center_mac where day = '$day'")
videoCenterMac.registerTempTable("videoCenterTmp")
sqlContext.cacheTable("videoCenterTmp")

 


2.将dataFrame注册成表并缓存

 
  1. val df = sqlContext.sql("select * from activity")

  2. df.registerTempTable("activity_cached")

  3. sqlContext.cacheTable("activity_cached")

  4.  
  5. Tip:cacheTable操作是lazy的,需要一个action操作来触发缓存操作。

对应的uncacheTable可以取消缓存

sqlContext.uncacheTable("activity_cached")

3.缓存dataFrame

 
  1. val df = sqlContext.sql("select * from tableName")

  2. df.cache()

  3.  

2.缓存结果

缓存时看到如下提示:

Added rdd_xx_x in memory on ...

如果内存不足,则会存入磁盘中,提示如下:

Added rdd_xx_x on disk on ...

缓存数据后可以在Storage上看到缓存的数据

cache

3.一些参数

spark.sql.autoBroadcastJoinThreshold

该参数默认为10M,在进行join等聚合操作时,将小于该值的表broadcast到每台worker,消除了大量的shuffle操作。

spark.rdd.compress true

将rdd存入mem或disk前再进行一次压缩,效果显著,我使用cacheTable了一张表,没有开启该参数前总共cache了54G数据,开启这个参数后只34G,可是执行速度并没有收到太大的影响。

spark.sql.shuffle.partitions

这个参数默认为200,是join等聚合操作的并行度,如果有大量的数据进行操作,造成单个任务比较重,运行时间过长的时候,会报如下的错误:

org.apache.spark.shuffle.FetchFailedException: Connection from /192.168.xx.xxx:53450 closed

这个时候需要提高该值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值