spark-数据分区

前提条件:

第一点:只有当数据集多次被调用(例如:循环调用的时候),并且还是基于健的链接操作时,使用分区才会有帮助。

第二点:给定的RDD分区只被扫描一次的时候,适用于分区

第三点:将数据进行分区以后,需要对其进行持久化。如果不进行持久化的话,在下次被调用的时候,数据还是会重新求值,和没有指定分区就一样了。

为什么要对其进行分区?

在分布式程序中,通信(也叫数据混洗)的代价是很大的,因此控制数据的分布减少数据之间的通信可以极大的提升整体性能。Spark程序通过控制RDD分区来减少通信的开销。

分区定义多少个合适?

定义分区的数量应当和集群中的总核心数一样

例子:

val result = sc.textFile("hdfs://sxjdb01:8020/home/mk/chongfu")
val date = result.map(x=>{
  x.split(",")
  (x(0),x(1))
}).partitionBy(new HashPartitioner(100)).persist(StorageLevel.MEMORY_ONLY_2)

//周期性的每隔5分钟调用一次该函数
  def processNewLogs(sc:SparkContext,logFileName:String){
   val events = sc.sequenceFile(logFileName)
    val joined = date .join(events)
    val offTopicVisits = joined.filter { case (userId, (userInfo, linkInfo)) => !userInfo.topics.contains(linkInfo.topic)}.count()
    println("Number of visits to non-subscribed opics: " + offTopicVisits)
  }

此时我们将date进行了分区操作。

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

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