Spark at TalkingData

本文是TalkingData程序猿田永军在多年的工作实践中总结的一些经验,主页君在此分享给大家。看完此文有兴趣与作者本人交(gou)流(da)的筒子,可以关注TalkingData微信并给留言给主页君哦~

历史演变

  • 数据量:以前一天1-2TB,现在一天3-4TB
  • 数据格式JSON(解析非常慢)
  • Hadoop跑一天需要几个小时。一个月的数据无法跑,只能每天处理好再合并后处理月的,还是需要很长时间。
  • 用Spark跑,一天需要1-2个小时,量大后到2、3个小时,一个月的数据也可以跑,但是经常会OOM
  • 现在方法可以使ad-hoc,一天的量需要2min,一个月的一个小时。我们把每天的数据提前处理一天生成Parquet格式,大概需要就是用3个小时,以后的任务都从这个Parquet里面出,速度非常快。

 

Spark技巧和问题

  • reduceByKey / groupByKey

这个好多人都知道他们的区别,reduceByKey 是自带combine的,对于统计一类的效率会大大提高,但是groupByKey也有他的用处,比如我们对一个key的值的序列做一个非常复杂的计算,比如求这个序列的方差、标准差,再计算3倍标准差以内的平均。

  • 序列化

scala有闭包,spark会对闭包引用到的对象通过akka来通信发送,而如果对象没有实现Serializable接口,就会报错,如果数据比较大,注意一下frameSize的设置,如果小了可能会造成Timeout、失联。

  • 数据倾斜

对于有些key对应量非常大,shuffle很可能会出现oom或者timeout、失联

  • 找不到jar包

报一个 /xx/x/x.jar not a file or directory ,如果 –master yarn-cluster 会把 —jars下的jar包都发到每个worker上,一般不会出什么问题,由于粗心在代码里,本来要 setAppName 写成了 conf.setMaster 造成了找不到jar包,这个原因找了好久。–master yarn 这个,driver 是 spark-submit 的机器跑的 ,这个就要看是不是真存在jar包。

  • textFile( in ).collect.toSet()

猜一下这个返回的是什么结果?Set[String] ?结果却令我们很惊讶,结果是Boolean ,为什么?toSet() = toSet.apply() = toSet.apply( ():Unit ) ,返回的是Boolean,具体和Scala的类型推断有关系,网上有一些具体的介绍。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注