网站首页 > 技术文章 正文
PageRank是执行多次连接的一个迭代算法,因此它是RDD分区操作的很好demo,算法维护两个数据集
- (pageID,listList) 包含每个页面的相邻页面列表。
- (pageID,rank) 包含每个页面的当前排序值, pageRank计算过程大致如下:
- 将每个页面的排序值初始化为1.0
- 在每次迭代中,对页面p,向其每个相邻页面(有直接连接的页面)发松一个值为 rank(p)/numNeighbors(p)的贡献值。
- 将每个页面的排序值设定为 0.15 + 0.85 *contributionsReceived 其中2 跟3 会重复循环几次,在此过程中算法会逐渐收敛于每个页面的实际PageRank值,实际操作中一般迭代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")
//创建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的每个元素的值初始化为1.0开始,然后每次迭代都都不断的更新ranks值,其中主要优化部分如下。
- linksRDD每次迭代都会跟ranks发生连接操作,因此将大数据集links进行partitionBy 会节约相当多的网络通信优化开销。
- 跟上面的原因一样,用persist 可以将数据保存早内存中,以供每次迭代使用。
- 我们在第一次创建ranks时, 我们用mapValues而不是map() 来保留父RDD links的分区方式,这样对第一次连接操作开销减少很多。
- 循环体中 reduceByKey后使用mapValues 因为reduceByKey已经是哈希分区了,下一次迭代时候效率更快。
建议:为最大化分区相关优化潜在作用,在无需更改元素键的时候尽量使用 mapValues 或 flatMapValues。
猜你喜欢
- 2024-11-26 比pgload更快更方便写入大数据量至Greenplum的Spark Connector
- 2024-11-26 使用flask+echarts+html+Ajax实现数据分析可视化看板
- 2024-11-26 Excel之基础 - 常用函数整理来了,现用现查
- 2024-11-26 SQLSERVER全文检索(FULL-TEXT)语法
- 2024-11-26 「NLP」文本关键词提取的两种方法-TFIDF和TextRank
- 2024-11-26 职场办公中每天都要使用的6个Excel函数公式
- 2024-11-26 威廉王子在“神秘机构”待了三周...出来后变成了这样?
- 2024-11-26 Day60:用Python解析XML文件(xml.etree.ElementTree)
- 2024-11-26 Python 与 Excel 不得不说的事:这几个常用库你知道几个?
- 2024-11-26 职场人必备的15个excel函数公式,简单易懂,快速提高工作效率
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)