溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PageRank怎么使用

發(fā)布時(shí)間:2021-12-08 09:40:55 來源:億速云 閱讀:224 作者:iii 欄目:云計(jì)算

這篇文章主要講解了“PageRank怎么使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“PageRank怎么使用”吧!

PageRank是執(zhí)行多次連接的一個(gè)迭代算法,因此它是RDD分區(qū)操作的很好demo,算法維護(hù)兩個(gè)數(shù)據(jù)集

  1. (pageID,listList) 包含每個(gè)頁面的相鄰頁面列表。
  2. (pageID,rank) 包含每個(gè)頁面的當(dāng)前排序值, pageRank計(jì)算過程大致如下:
  3. 將每個(gè)頁面的排序值初始化為1.0
  4. 在每次迭代中,對頁面p,向其每個(gè)相鄰頁面(有直接連接的頁面)發(fā)松一個(gè)值為 rank(p)/numNeighbors(p)的貢獻(xiàn)值。
  5. 將每個(gè)頁面的排序值設(shè)定為 0.15 + 0.85 *contributionsReceived 其中2 跟3 會重復(fù)循環(huán)幾次,在此過程中算法會逐漸收斂于每個(gè)頁面的實(shí)際PageRank值,實(shí)際操作中一般迭代10次。
package com.sowhat.spark

import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

/**
* links = (pageID,LinkList)
* ranks = (pageID,rank)
**/
object MyPageRank {
 def main(args: Array[String]): Unit = {
   val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("pagerank")

   //創(chuàng)建SparkContext,該對象是提交spark App的入口
   val sc = new SparkContext(conf)

   val links: RDD[(String, Seq[String])] = sc.objectFile[(String, Seq[String])]("filepwd").partitionBy(new HashPartitioner(100)).persist()
   var ranks: RDD[(String, Double)] = links.mapValues(x => 1.0)

   for (i <- 0 until 10) {
     val totalRDD: RDD[(String, (Seq[String], Double))] = links.join(ranks)
     val contributions: RDD[(String, Double)] = totalRDD.flatMap(
       {
         case (pageID, (links, rank)) => links.map(dest => (dest, rank / links.size))
       }
     )
     ranks = contributions.reduceByKey(_ + _).mapValues(v => 0.15 + 0.85 * v)
   }
   ranks.saveAsTextFile("ranks")
 }

}
 

算法從ranksRDD的每個(gè)元素的值初始化為1.0開始,然后每次迭代都都不斷的更新ranks值,其中主要優(yōu)化部分如下。

  1. linksRDD每次迭代都會跟ranks發(fā)生連接操作,因此將大數(shù)據(jù)集links進(jìn)行partitionBy 會節(jié)約相當(dāng)多的網(wǎng)絡(luò)通信優(yōu)化開銷。
  2. 跟上面的原因一樣,用persist 可以將數(shù)據(jù)保存早內(nèi)存中,以供每次迭代使用。
  3. 我們在第一次創(chuàng)建ranks時(shí), 我們用mapValues而不是map() 來保留父RDD links的分區(qū)方式,這樣對第一次連接操作開銷減少很多。
  4. 循環(huán)體中 reduceByKey后使用mapValues 因?yàn)閞educeByKey已經(jīng)是哈希分區(qū)了,下一次迭代時(shí)候效率更快。

建議:為最大化分區(qū)相關(guān)優(yōu)化潛在作用,在無需更改元素鍵的時(shí)候盡量使用 mapValues 或 flatMapValues。

本文使用 mdnice 排版

感謝各位的閱讀,以上就是“PageRank怎么使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對PageRank怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI