在Hadoop上使用R进行图度分布
图形引擎有两种常见的类型。 一种类型的重点是在单台服务器上表示的链表上提供基于遍历的实时算法。 这种引擎通常称为图数据库 ,一些供应商包括Neo4j , OrientDB , DEX和InfiniteGraph 。 图引擎的另一种类型集中在使用以顶点为中心的消息传递(在跨机器集群表示的图内)进行批处理。 这种形式的图形引擎包括Hama , Golden Orb , Giraph和Pregel 。
这篇文章的目的是演示如何表达两个基本图形统计的计算-每个图形遍历和MapReduce算法。 为此目的探索的图形引擎是Neo4j和Hadoop 。 但是,就Hadoop而言,其结果不是通过特定的基于顶点为中心的基于BSP的图形处理程序包(例如Hama或Giraph),而是通过本机Hadoop(HDFS + MapReduce)提供。 此外,不是使用Java开发MapReduce算法,而是使用R编程语言 。 RHadoop是Revolution Analytics开发的小型开源程序包,它将R绑定到Hadoop,并允许使用本机R表示MapReduce算法。
两种图算法提供了计算度统计信息 : 顶点度和图度分布 。 两者都是相关的,实际上,第一个的结果可用作第二个的输入。 也就是说,图形入度分布是顶点入度的函数。 这两个基本统计数据一起为更量化图论和网络科学领域中开发的统计数据奠定了基础。
- 顶点度数 :顶点X有多少个入边?
- 图的度数分布 :多少个顶点的X边数为X ?
这两种算法是在包含100,000个顶点和704,002条边的人工生成的图形上计算的。 子集显示在左侧。 用于生成图的算法称为优先附件 。 优先附着会产生具有“自然统计”的图,其度分布类似于真实世界的图/网络。 下面提供了相应的iGraph R代码。 一旦构造和简化(即在任意两个顶点之间不超过一个边且没有自环),就对顶点和边进行计数。 接下来,迭代并显示前五个边缘。 第一条边显示为“顶点2连接到顶点0。” 最后,图形作为GraphML文件保存到磁盘。
~$ rR version 2.13.1 (2011-07-08)
Copyright (C) 2011 The R Foundation for Statistical Computing> g <- simplify(barabasi.game(100000, m=10))
> length(V(g))
[1] 100000
> length(E(g))
[1] 704002
> E(g)[1:5]
Edge sequence:[1] 2 -> 0
[2] 2 -> 1
[3] 3 -> 0
[4] 4 -> 0
[5] 4 -> 1
> write.graph(g, '/tmp/barabasi.xml', format='graphml')
使用Neo4j进行图统计
当图的数量级为100亿个元素(顶点+边)时,单服务器图数据库就足以执行图分析。 附带说明一下,当这些分析/算法是“以自我为中心”的(即,遍历是从单个顶点或一小组顶点发出的)时,通常可以实时评估它们(例如<1000 ms)。 为了计算这些度数统计,使用了Gremlin 。 Gremlin是TinkerPop开发的一种图形遍历语言,与Neo4j,OrientDB,DEX,InfiniteGraph和RDF引擎Stardog一起分发 。 下面的Gremlin代码将R中在上一节中创建的GraphML文件加载到Neo4j中。 然后,它对图形中的顶点和边进行计数。
~$ gremlin\,,,/(o o)
-----oOOo-(_)-oOOo-----
gremlin> g = new Neo4jGraph('/tmp/barabasi')
==>neo4jgraph[EmbeddedGraphDatabase [/tmp/barabasi]]
gremlin> g.loadGraphML('/tmp/barabasi.xml')
==>null
gremlin> g.V.count()
==>100000
gremlin> g.E.count()
==>704002
下面提供了用于计算顶点度数的Gremlin代码。 第一行遍历所有顶点,并输出顶点及其入度。 第二行提供一个范围过滤器,以便仅显示前五个顶点及其入度计数。 请注意,澄清图说明了玩具图上的转换,而不是实验中使用的100,000个顶点图。
gremlin> g.V.transform{[it, it.in.count()]}
...
gremlin> g.V.transform{[it, it.in.count()]}[0..4]
==>[v[1], 99104]
==>[v[2], 26432]
==>[v[3], 20896]
==>[v[4], 5685]
==>[v[5], 2194]
接下来,要计算图形的度内分布,可以评估以下Gremlin遍历。 此表达式遍历图中的所有顶点,发出它们的度数,然后计算遇到特定度数的次数。 这些计数保存到由groupCount
维护的内部映射中。 最后的cap
步骤产生内部groupCount
映射。 为了仅显示前五个计数,将应用范围过滤器。 发出的第一行说:“有52,611个顶点没有任何传入边。” 第二行说:“有16,758个顶点具有一个传入边。”
gremlin> g.V.transform{it.in.count()}.groupCount.cap
...
gremlin> g.V.transform{it.in.count()}.groupCount.cap.next()[0..4]
==>0=52611
==>1=16758
==>2=8216
==>3=4805
==>4=3191
为了通过使用后者的前一个计算结果来计算两个统计量,可以执行以下遍历。 该表示形式与使用MapReduce计算顶点度和图形度分布的方式直接相关(在下一节中演示)。
gremlin> degreeV = [:]
gremlin> degreeG = [:]
gremlin> g.V.transform{[it, it.in.count()]}.sideEffect{degreeV[it[0]] = it[1]}.transform{it[1]}.groupCount(degreeG)
...
gremlin> degreeV[0..4]
==>v[1]=99104
==>v[2]=26432
==>v[3]=20896
==>v[4]=5685
==>v[5]=2194
gremlin> degreeG.sort{a,b -> b.value <=> a.value}[0..4]
==>0=52611
==>1=16758
==>2=8216
==>3=4805
==>4=3191
使用Hadoop进行图统计
当图形的数量级超过100+十亿个元素(顶点+边)时,单服务器图形数据库将无法表示或处理该图形。 需要多计算机图形引擎。 虽然本机Hadoop不是图形引擎,但是图形可以在其分布式HDFS文件系统中表示,并可以使用其分布式处理MapReduce框架进行处理。 将先前生成的图加载到R中,并对其顶点和边进行计数。 接下来,将图形表示为边缘列表。 边列表(用于单关系图)是成对的列表,其中每个对是有序的,表示边的尾顶点ID和头顶点ID。 边缘列表可以使用RHadoop推送到HDFS。 变量edge.list
表示一个指向该HDFS文件的指针。
> g <- read.graph('/tmp/barabasi.xml', format='graphml')
> length(V(g))
[1] 100000
> length(E(g))
[1] 704002
> edge.list <- to.dfs(get.edgelist(g))
为了计算顶点的度数,在edge.list
上评估MapReduce作业。 向地图函数提供了键/值对,其中键是边缘ID,值是边缘的尾部和头部顶点的ID(表示为列表)。 对于每个键/值输入,都会发出头顶点(即,传入的顶点)以及数字1。减少功能会馈入键/值对,其中键是顶点,值是1的列表。 reduce作业的输出是顶点id和1s列表的长度(即,该顶点被视为边的传入/头部顶点的次数)。 该MapReduce作业的结果将保存到HDFS,而degree.V
是指向该文件的指针。 以下代码块中的最终表达式从degree.V
读取第一个键/值对-顶点10030的度数为5。
> degree.V <- mapreduce(edge.list, map=function(k,v) keyval(v[2],1), reduce=function(k,v) keyval(k,length(v)))
> from.dfs(degree.V)[[1]]
$key
[1] 10030
$val
[1] 5
attr(,"rmr.keyval")
[1] TRUE
为了计算图形的度数分布,对degree.V
评估MapReduce作业。 映射函数会degree.V
存储在degree.V
的键/值结果。 该函数以数字1发出顶点的度数。 例如,如果顶点6的入度为100,则map函数将发射键/值[100,1]。 接下来,为reduce函数提供代表度数的键,这些键的值是该度数被视为1的列表的次数。 reduce函数的输出是键以及1s列表的长度(即遇到特定次数的次数的键)。 下面的最终代码片段从degree.g
了第一个键/值对-遇到1354次。
> degree.g <- mapreduce(degree.V, map=function(k,v) keyval(v,1), reduce=function(k,v) keyval(k,length(v)))
> from.dfs(degree.g)[[1]]
$key
[1] 1354
$val
[1] 1
attr(,"rmr.keyval")
[1] TRUE
总之,这两个计算可以组成一个MapReduce表达式。
> degree.g <- mapreduce(mapreduce(edge.list, map=function(k,v) keyval(v[2],1), reduce=function(k,v) keyval(k,length(v))), map=function(k,v) keyval(v,1), reduce=function(k,v) keyval(k,length(v)))
请注意,虽然图可以在100+十亿个元素的数量级上,但是度分布要小得多,通常可以放入内存中。 通常, edge.list > degree.V > degree.g
。 由于这个事实,可以将degree.g
文件从HDFS中拉出,将其放置到主存储器中,并绘制其中存储的结果。 degree.g
分布在对数/对数图上绘制。 令人怀疑的是,优先依附算法生成的图形具有自然的“无标度 ”统计数据-大多数顶点的度数较小,而很少的顶点度数较大。
> degree.g.memory <- from.dfs(degree.g)
> plot(keys(degree.g.memory), values(degree.g.memory), log='xy', main='Graph In-Degree Distribution', xlab='in-degree', ylab='frequency')
相关资料
- Cohen,J。,“ MapReduce世界中的图缠绕 ”,科学与工程计算,IEEE,11(4),第29-41页,2009年7月。
翻译自: https://www.javacodegeeks.com/2014/06/graph-degree-distributions-using-r-over-hadoop.html
在Hadoop上使用R进行图度分布相关推荐
- 在Hadoop上运行基于RMM中文分词算法的MapReduce程序
原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词 ...
- hadoop上的pageRank算法
简单的pageRank实现参考:http://wlh0706-163-com.iteye.com/blog/1397694 较为复杂的PR值计算以及在hadoop上的实现:http://deathsp ...
- python部署到hadoop上_python实现mapreduce(2)——在hadoop中执行
目的:将python实现mapreduce(1)中的python脚本部署到hadoop上,实现mapreduce. 1. 修改脚本执行权限 [tianyc@TeletekHbase ~]$ which ...
- 如何在Hadoop上编写MapReduce程序
1. 概述 1970年,IBM的研究员E.F.Codd博士在刊物<Communication of the ACM>上发表了一篇名为"A Relational Model of ...
- 朴素贝叶斯Naïve Bayes分类算法在Hadoop上的实现
1. Naïve Bayes算法介绍 Naïve Bayes是一个简单有效的分类算法,已经得到广泛使用.本文讨论了海量数据(TB级)下Naïve Bayes算法的实现方法,并给出了Hadoop上的实现 ...
- 如何在Hadoop上运行TensorFlow【部署】
为什么80%的码农都做不了架构师?>>> 原文链接 : https://www.tensorflow.org/deploy/hadoop 译文链接 : http://www.a ...
- 化妆definer是什么意思_化妆品上的r是什么意思
1.英米茄化妆品包装盒上的R是什么意思 用圆圈R,是"注册商标"的标记,意思是该商标已在国家商标局进行注册申请并已经商标局审查通过,成为注册商标.圆圈里的R是英文register注 ...
- linux centos7 r安装,如何在CentOS 7上安装R
R是一种快速增长的开源编程语言和免费环境,专门从事统计计算和图形表示.它得到R统计计算基金会的支持,主要由统计学家和数据挖掘人员用于开发统计软件和执行数据分析. 本教程将教您如何在CentOS 7上安 ...
- winpythonhadoop_让python在hadoop上跑起来
本文实例讲解的是一般的hadoop入门程序"WordCount",就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计 ...
最新文章
- golang strings.Fields 使用
- AAC音频文件时长计算
- C++获取Windows密码复杂度、密码有效期、密码锁定阀值等安全策略
- RedHat Linux 7.3基础环境搭建
- NSDateFormatter设定日期格式
- 阿里云佘俊泉:创新探索不停,边缘云持续为客户创造价值
- 麒麟990 5G获外媒好评:华为Mate30系列有望引领5G时代新体验
- “JavaSwing” ——简单使用
- php更换wordpress用户头像,WordPress主题设置在前台页面添加用户头像教程
- 使用Python把树莓派改造成一个语音助手
- 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
- 桌面计算机图标变黑块,win7桌面图标变成有黑色方块怎么办?4个步骤轻松搞定...
- 关于NI美国国家仪器音频分析器使用技巧(4461音频分析仪)
- 基于注意力对抗生成网络的AlphaFold从氨基酸序列建立三维蛋白质结构
- WebRTC系列 -- iOS 视频采集(1)
- 代码解读一 文件名“ANO_Imu.c”
- 两个UE免费开源小游戏
- 雷神ZERO游戏本和ROG冰刃5Plus的 区别 选哪个
- Android的定位策略
- 华为p50 pro 鸿蒙,华为P50Pro+鸿蒙系统!华为2021年上半年最期待的旗舰手机
热门文章
- Genscan操作实战
- Linux之防火墙策略
- win10 Anaconda 构建AI自动抠图
- 渐进式网页应用(PWA)
- OpenCV 图像直方图计算calcHist()
- C语言基本数据类型笔记整理(整型、实型/浮点型、字符型、枚举型、构造类型、指针类型、空类型)
- Circle Metro CodeForces - 1169A
- 菜鸟教程C语言-15
- php 谷歌搜索排名,不断去搜索点击自己的网站,能提升谷歌SEO排名吗
- c语言packed,结构体声明当中 __attribute__ ((__packed__))关键字