热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:用hadoop实现SimRank++算法权值转移矩阵的计算

篇首语:本文由编程笔记#小编为大家整理,主要介绍了用hadoop实现SimRank++算法----权值转移矩阵的计算相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了用hadoop实现SimRank++算法----权值转移矩阵的计算相关的知识,希望对你有一定的参考价值。




本文主要针对广告检索领域的查询重写应用,依据查询-广告点击二部图,在MapReduce框架上实现SimRank++算法。关于SimRank++算法的背景和原理请參看前一篇文章《基于MapReduce的SimRank++算法研究与实现》。


SimRank++的矩阵形式的计算公式为:
技术分享
算法主要过程例如以下:
Step1: 计算权值矩阵。并获取最大Query编号和最大广告编号。
Step2: 以Step1的输出作为输入,迭代计算SimRank相似度。
Step3: 计算证据矩阵。并用计算结果修正Step2的输出,计算出终于的经过归一化的相似度分数。
Step4: 把Step3的输出转化为固定的格式,得到终于的相似度分数结果。
当中Step2迭代计算SimRank相似度分数比較复杂。由一系列的MapReduce作业组成。

本文主要关注Step1。即计算权值矩阵的计算。Step2~4将在兴许的文章中给出。



1.输入文件的格式


为了简单起见,在我们的实现中。用点击次数作为边的权值。

一个更好的选择是用广告点击率(Click Through Rate, CTR)作为权值。理由例如以下:某个广告在q1下展示10000次。点击100次(CTR为0.01)。在q2下展示1000次,点击90次(CTR为0.09);在q3下展示1000次。点击100次(CTR为0.1);显然q3和q2的相似度要比q3和q1的相似度要高,然而假设仅仅考虑点击次数,那么算法会觉得q3和q1的相似度比q3和q2的高。


期待的输入数据的文件格式:
1. Query和广告的点击关系数据文件(下面记为qas文件)的每一行的格式例如以下:
qas ^A queryid { ^A adid ^B clicknum}
当中。{ }表示内部的内容能够反复1次或多次,但至少一次;“qas”的标识字符串;‘^A’是ASCII码为1的不可见字符。‘^B’是ASCII码为2的不可见字符。
2. 广告和Query的点击关系数据文件(下面记为aqs文件)的每一行的格式例如以下:
aqs ^A ad
id { ^A queryid ^B clicknum}
当中,{ }表示内部的内容能够反复1次或多次,但至少一次。“aqs”的标识字符串;‘^A’是ASCII码为1的不可见字符;‘^B’是ASCII码为2的不可见字符。
技术分享
上图所看到的的查询和广告之间的点击关系相应的文件格式例如以下:

qas文件
qas ^A 1 ^A 1 ^B 10 ^A 3 ^B 5
qas ^A 2 ^A 2 ^B 7 ^A 3 ^B 6
aqs文件
aqs ^A 1 ^A 1 ^B 10
aqs ^A 2 ^A 2 ^B 7
aqs ^A 3 ^A 1 ^B 5 ^A 2 ^B 6


2. 思路分析


权值矩阵元素的计算公式为:
技术分享
能够看出。 variance(a)的计算须要用到aqs文件, normalize_weight(q,a)的计算须要用到qas文件; variance(q)的计算须要用到qas文件, normalize(q,a)的计算须要用到aqs文件。从而,在计算W(a,q) 和 W(q,a)时都要用到aqs文件和qas文件。这使得MapReduce算法的设计比較困难。


考虑前面所述的一个简单样例。”Mapper”任务在处理qas文件时会计算出例如以下所看到的的内容。
技术分享
”Mapper”任务在处理aqs文件时会计算出例如以下所看到的的内容。
技术分享


在计算W(q,a)时须要使用到variance(a)和normalizedweight(q, a);在计算W(a,q)时须要使用到variance(q)和normalizedweight(a, q)。

因此,依据以上分析,对于一个特定的q和a。须要把Map任务的输出中的variance(a)和normalizedweight(q, a)”Shuffle”到同一个”Reduce”节点,由该”Reduce”节点计算出W(q,a)。同理,须要把”Map”任务的输出中的variance(q)和normalizedweight(a,
q) ”Shuffle”到同一个”Reduce”节点。由该”Reduce”节点计算出W(a,q)。


另外。能够看出。在计算W(q1,a), W(q2,a),……. 时都须要用到variance(a),因此我们希望计算 的“Reduce”节点接受到的值列表中variance(a)项排在全部normalized_weight(q, a)项之前。

MapReduce框架在记录到达”Reducer”之前按键对记录排序,但键所相应的值并没有被排序。因为值来自不同的map任务,所以在多次执行程序时,值的出现顺序并不固定。导致每次执行作业的时间会各有不同。一般来说,大多数MapReduce程序无需考虑值在”Reduce”函数中出现的顺序。可是。像我们这里碰到的情况一样。有时确实须要通过对键进行排序和分组等以实现对值的排序。通过MapReduce框架辅助对记录值排序的方法总结例如以下:
(1) 定义包含自然键和自然值的组合键。


(2) 键的comparator依据组合键对记录进行排序,即同一时候利用自然键和自然值进行排序。
(3) 针对组合键partitioner和分组comparator在进行分区和分组时均仅仅考虑自然键。


基于以上分析。计算权值矩阵的MapReduce任务须要小心地设计”Map”任务输出的Key和Value的数据结构以及”Partitioner”函数。



3. 算法实现


(1) Map任务输出的键(Key)的数据结构
键(Key)由一个三元组构成:
type用于标识index1是广告的编号(0),还是Query的编号(1);当type = 0时。相应的值(value)表示normalizedweight(q,a),当中q等于index1,a等于index2;当type = 1时。value表示normalizedweight(a,q),当中a等于index1,q等于index2;
另外,当index2 = -1时。表示相应的值为方差(variance(index1))。设为-1是为了保证同一组Key相应的值列表中方差项排在第一个。
键(Key)的三个元素都參与comparator的比較。


(2) Map任务输出的值(Value)的数据结构
值(Value)有一个二元组构成:。当中index总是等于相应的键的第三个元素index2。这里看似冗余,事实上不然。

由于我们在利用MapReduce框架辅助排序时,分组函数(GroupComparator)仅仅比較Key的前两个元素,忽略Key的第三个元素,这样仅仅有Key的前两个元素的值同样,那么他们的值将合并到同一个列表中。有唯一的一个“Reduce”函数处理。MapReduce框架在默认情况下仅仅会把key全然同样值合并到同一个列表中。

因此我们须要设置OutputValueGroupingComparator为我们自己定义的GroupComparator。能够利用例如以下的语句设置:

conf.setOutputValueGroupingComparator(GroupComparator.class);


(3) 分区函数
分区函数控制”Map”任务的每一个输出记录由哪一个”Reduce”节点处理。

在权值矩阵的计算作业中该函数的地位特别重要。

依据上一小节的分析和辅助排序的要求,分区函数仅仅考虑键的前两个元素。

我们把”Reduce”节点分成两部分,一部分计算 ,另外一部分计算 。”Partition”函数的代码例如以下。

public int getPartition(Key key, Value value, int numPartitions)
{
int offset = numPartitions / 2;
if (key.type == 0)
{
int base = numPartitions - offset;
return key.index1 % base + offset;
}
return key.index1 % offset;
}


(4) “Map”函数和”Reduce”函数
“Map”函数和”Reduce”函数并行地处理基本的工作。当中”Map”函数读入qas文件,计算出variance(q)和normalizedweight(a, q)。读入aqs文件。输出variance(a)和normalizedweight(q, a)。

同一时候为了以后的计算方便,”Map”函数还记录下最大的Query编号和最大的Ad编号。

因为多个”Map”函数之间不能相互通信。为了得到全局的最大Query编号和Ad编号。每一个Map函数结束的时候在一个指定的HDFS文件夹下新建一个以本函数统计出的当前最大编号为文件名称的空文件,前提条件是此时该指定文件夹下还没有更大编号的文件存在。


“Reduce”函数比較简单,直接依据公式计算出终于的权值就能够了。

”Reduce”输出的Key是一个二元组。表示权值矩阵的行号和列号。输出的值为对应的权值。

因为我们在同一个作业中同一时候计算了Query-Ad的权值矩阵和Ad-Query的权值矩阵。这两个矩阵在后面的SimRank实现过程中需要单独使用,因此必需要把两种的输出区分开来。我们使用MultipleOutputs类定义了两个数据收集对象,这两个数据收集对象输出的文件名称有不同的前缀。


“Mapper”和”Reducer”的伪代码例如以下。


计算权值矩阵的”Map”函数

Setup(){
currMaxQueryId ← 0
currMaxAdId ← 0
dir ← “hdfs://namenode/…/XXX”
}
Map(line_no, line_txt){
content ← Parser(line_txt)
if (content.type == 1)
currMaxQueryId ← max(currMaxQueryId, content. id)
else
currMaxAdId ← max(currMaxAdId, content. id)
weight_sum ← sum(content.weights)
variance ← var(content.weights)
emit , <-1, variance>
for e in content.elements
normalized_weight ← e.weight / seight_sum
emit ,
}
Close(){
Query_id ← getCurrentQueryId(dir)
Ad_id ← getCurrentAdId(dir)
If (currMaxQueryId > Query_id)
Touch dir/ currMaxQueryId
If (currMaxAdId > Ad_id)
Touch dir/ currMaxAdId
}


计算权值矩阵的”Reduce”函数

Reduce(key, valueList){
variance ← valueList[0]
spread ← exp(-variance)
for v in valueList[1]…valueList[N]
emit , spread * v.value
}




































推荐阅读
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文介绍如何通过整合SparkSQL与Hive来构建高效的用户画像环境,提高数据处理速度和查询效率。 ... [详细]
  • 大数据领域的职业路径与角色解析
    本文将深入探讨大数据领域的各种职业和工作角色,帮助读者全面了解大数据行业的需求、市场趋势,以及从入门到高级专业人士的职业发展路径。文章还将详细介绍不同公司对大数据人才的需求,并解析各岗位的具体职责、所需技能和经验。 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • hive和mysql的区别是什么[mysql教程]
    hive和mysql的区别有:1、查询语言不同,hive是hql语言,MySQL是sql语句;2、数据存储位置不同,hive把数据存储在hdfs上,MySQL把数据存储在自己的系统 ... [详细]
  • 深入理解云计算与大数据技术
    本文详细探讨了云计算与大数据技术的关键知识点,包括大数据处理平台、社会网络大数据、城市大数据、工业大数据、教育大数据、数据开放与共享的应用,以及搜索引擎与Web挖掘、推荐技术的研究及应用。文章还涵盖了云计算的基础概念、特点和服务类型分类。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • Python 数据分析领域不仅拥有高质量的开发环境,还提供了众多功能强大的第三方库。本文将介绍六个关键步骤,帮助读者掌握 Python 数据分析的核心技能,并深入探讨六款虽不广为人知但却极具潜力的数据处理库,如 Pandas 的替代品和新兴的可视化工具,助力数据科学家和分析师提升工作效率。 ... [详细]
  • hadoop3.1.2 first programdefault wordcount (Mac)
    hadoop3.1.2安装完成后的第一个实操示例程 ... [详细]
author-avatar
KisS汐唲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有