您的位置:首页 > 编程语言

MapReduce 编程模型在日志分析方面的应用

2011-10-09 19:50 267 查看
简介
日志分析往往是商业智能的基础,而日益增长的日志信息条目使得大规模数据处理平台的出现成为必然。MapReduce 处理数据的有效性为日志分析提供了可靠的后盾。
本文将以对访问网页用户的日志进行分析,进而挖掘出用户兴趣点这一完整流程为例,详细解释 MapReduce 模型的对应实现,涵盖在 MapReduce 编程中对于特殊问题的处理技巧,比如机器学习算法、排序算法、索引机制、连接机制等。文章分三部分展开:首先介绍 MapReduce 编程模型,对其原理、对任务处理流程以及适用情况进行介绍;接下来描述了日志分析的例子 - 用户兴趣点挖掘的处理流程;最后对处理流程的几个模块分别进行了 MapReduce 的实现。本文的目的在于通过
MapReduce 在日志分析领域的具体实现,使读者对 MapReduce 对实际问题的处理有较为形象的认识。
回页首
MapReduce 编程模型简介
随着信息化的进一步加深,在各个领域,如电信、交通、金融、零售、航天、医药等,数据量级都呈现快速增长趋势。如何高效并且无误地存储、分析、理解以及利用这些大规模数据,成为一个关键性问题。
为了应对大规模数据处理的难题,MapReduce 编程模型应运而生。Google 提出的这一模型,由于良好的易用性和可扩展性,得到了工业界和学术界的广泛支持。Hadoop,MapReduce 的开源实现,已经在 Yahoo!, Facebook, IBM, 百度 , 中国移动等多家单位中使用。
MapReduce 编程模型
MapReduce 以函数方式提供了 Map 和 Reduce 来进行分布式计算。Map 相对独立且并行运行,对存储系统中的文件按行处理,并产生键值(key/value)对。Reduce 以 Map 的输出作为输入,相同 key 的记录汇聚到同一 reduce,reduce 对这组记录进行操作,并产生新的数据集。所有 Reduce 任务的输出组成最终结果。形式化描述如下:
Map: (k1,v1) -> list(k2,v2)
Reduce:(k2,list(v2)) ->list(v3)
MapReduce 对任务的处理流程如图 1 所示。主要分为几步:
用户提交 MapReduce 程序至主控节点,主控节点将输入文件划分成若干分片(split)。主控节点 Master 和工作节点 worker 启动相应进程;主控节点根据工作节点实际情况,进行 map 任务的分配;被分配到 map 任务的节点读取文件的一个分片,按行进行 map 处理,将结果存在本地。结果分成 R 个分片进行存储,R 对应的是 Reduce 数目;Map 节点将存储文件的信息传递给 Master 主控节点,Master 指定 Reduce
任务运行节点,并告知数据获取节点信息;Reduce 节点根据 Master 传递的信息去 map 节点远程读取数据。因为 reduce 函数按分组进行处理,key 相同的记录被一同处理,在 reduce 节点正式处理前,对所有的记录按照 key 排序;Reduce 将处理结果写入到分布式文件系统中。

图 1 . MapReduce 处理流程图



MapReduce 适用情况
由于 MapReduce 编程模型是对输入按行顺次处理,它更适用于对批量数据进行处理。由于良好的可扩展性,MapReduce 尤其适用于对大规模数据的处理。
但是,对搜索等只是需要从大量数据中选取某几条特别的操作,MapReduce 相对于具有完善索引的系统而言,不再具有优势。因为它需要对每条数据进行匹配,并与搜索条件相匹配的数据提取出来。而如果采用索引系统,并不需要遍历所有的数据。
另外,由于每次操作需要遍历所有数据,MapReduce 并不适用于需要实时响应的系统。相反地,对于搜索引擎的预处理工作比如网页爬虫、数据清洗,以及日志分析等实时性要求不高的后台处理工作,MapReduce 编程模型是足以胜任的。

日志分析应用
互联网或者大型应用系统中,日志的产生和记录是非常重要的事情。日志分析则是进行数据挖掘进而推进下一步工作的基础。比如,在购物网站,针对用户访问网页的信息,可以挖掘出用户的兴趣点,进而进行物品推荐;又比如,在应用系统中,通过分析用户对系统部件的使用情况,可以挖掘出该系统中的热点部件,进而采取相应的措施加强管理;典型地,对于一个医疗卫生系统,根据医生对不同病情开处方的日志记录,可以挖掘出某种病情和药品的对应关系,进而建立一个专家推荐系统等。
随着互联网行业的壮大和应用系统规模的扩充,记录相应信息的日志数量级也在急剧扩充。传统的单机版分析程序已经不能满足日志分析的需求,为此,大规模数据处理平台成为日志分析的理想平台。另一方面,日志分析并没有很高的实时性要求,MapReduce 编程模型由于易用性强、处理数据规模大,成为日志分析的利器。
本文下面部分会以用户访问网页日志为例,阐述如何利用 MapReduce 来分析日志,进而挖掘出相应信息。
回页首
用户访问网页行为建模
一般而言 , 用户每访问网页时 , 系统日志中会存储一条记录 : 用户 + url + 访问时间。用户访问的一系列网页记录即是推断用户兴趣点的基础,即:用户 + urlSet。
如何根据用户访问的系列 URL 信息来推测用户兴趣点?一般而言,由以下几个步骤构成:
单一网页信息挖掘。根据 URL 得到网页内容信息,并对网页内容进行处理,得到代表此网页的几个关键词,一般要借助机器学习算法或者专家经验来攫取较有价值的词。用户访问关键词信息汇总。汇总用户访问的各个 URL 中的所有关键词信息,进而得到用户关注的关键词列表。每个关键词均有不同权重,视该词在 URL 中出现的次数而定。关键词扩展及归约。对用户关注关键词列表进行一定的扩展或归约操作,得到更加具有普遍意义的词信息,以更好地表征用户的兴趣点。

图 2 .用户兴趣挖掘流程图



单一网页信息挖掘
从 URL 得到该网页中有价值的词信息,首先要对 URL 进行重新爬取,以得到其对应的网页内容。从网页中提取关键词,则需要一定的算法支持。在一篇网页中,不同词因为在不同位置或者以不同的格式出现,对应影响程度也不同。比如,在网页的标题或者网页内容每一自然段段首或者段尾的词可能更为重要;在网页中有特定格式,比如加粗或者字体较大或者标记颜色的词可能更为重要。
而给定一个词,如何标记其重要性或者对网页的价值?可以将每个词用向量的形式来进行描述,向量中每一维度 d 表示不同的衡量标准,比如 TF(在该网页中出现的次数)、DF(在所有网页中出现的次数)、是否在标题中出现、是否在段首 / 段尾出现、是否在句首 / 句尾出现、颜色有无区别其它词、词的词性是名词 / 动词 / 形容词 / 助词,等等。形如 w = (v1, v2, v3, v4, … ),每个维度 v 对词是网页关键词的决定程度不同,这个影响因子可以通过机器学习算法训练而得。即:由事先指定关键词的网页来进行训练,得到特征权重。
得到特征权重后,对于网页中的每个词,可以通过 w = sum(vi*fi) 的方式来得到其作为关键词的比例。从网页中选取能代表其内容的几个词,应对所有计算出权重的词按权重从大到小依次排序,选取前几名或者大于某个阈值的词即可。
解决思路如图 3 所示。

图 3 .网页关键词挖掘流程图



用户访问关键词汇总
得到每个网页的代表关键词后,对于用户访问的关键词,即可通过汇总用户访问的所有网页的关键词得到。简单而言,用户访问每个词的次数可以作为该词为用户关注词的权重。因为后面还要进行进一步的关键词扩展 / 归约,为防止数值过大的情况,可以对权重进行归一化。当然,也可以再加入其它策略,对词的权重进行进一步调整,比如通过黑名单或者词的共现频率等方式将垃圾词(对描述用户兴趣点无作用的词,比如“网易”、“淘宝”等)位置后调,此处不再详加展开。
关键词扩展及归约
关键词扩展
上一步得到的结果是用户在日志所记录的时间内访问的关键词汇总,而词与词之间往往是相互关联的。比如,用户访问了“篮球”这个词,那实际上该用户也很有可能对“球星”这个词感兴趣,因为“篮球”和“球星”两词存在一定关联。可以通过关键词扩展,推断出用户对“球星”一词也感兴趣。
如何得到两个词之间的相关度?一般而言,同时在一个网页元信息(meta)的 keyword 域里的词很大程度是相关的。因此,统计 meta 中词,就可以统计出来词与词的相关度信息。因为用户访问的词与词之间并不是孤立完全无关的,而是有一定关联的。把 meta 中词与词的相关性信息加入到用户对各个词的关注度中,可以更好地体现用户的关注方面。加入 meta 相关词信息后,便得到了更加精确的用户对词的关注度列表。
网页 meta 中 keyword 区域放置的往往是该网页的分类信息 ( 导航类网页 ),或者是该网页的关键词(正文类网页)。如果是前者,meta 中的词往往相关度较大。而不同网站的 meta 内容是什么,是由网站的编辑决定的。所以把不同网站的 meta 里面共现的词提取出来并汇总到一起,其实是汇聚了各个网站编辑们的集体智慧。这些词的共现信息应该能够很好地表现出词与词之间的相关性。如果两个词总在一起出现,它们极有可能是相关的。
具体流程为:首先,统计 meta 中共同出现的词对以及它们共同出现的次数;然后,统计这些共现的词对中的词每个词出现的次数;最后,应用公式进行共现频率的计算,得到的就是词与词之间的相关度。计算公式为



其中,pij表示词 i 和词 j 的相关度,mi、mj、mij分别表示词 i、词 j 以及词 i 和 j 共同在网页元信息(meta)的 keyword 中出现的次数。

图 4 .用户访问关键词扩展流程图



图 4 描述了将词之间的相关度加入用户访问关键词列表中的流程:首先得到所有词对之间的相关度信息,并以索引形式存储;然后,对之前得到的用户访问关键词列表中的每个词,查找索引得到相关的词,如果该词未被用户访问过,直接将其加入到用户访问列表中;否则,对两个词的权重都需进行调整。
关键词归约
与关键词扩展相对应的是关键词归约。用户访问的网页中挖掘出的关键词往往是具体的,比如用户关注的网页中提取出的词是“足球”、“篮球”,而这些词在划分的时候都属于体育类,通过关键词归约,可以推测出该用户对”体育”比较感兴趣。
而分类标准应该如何获得呢?在各大门户网站如新浪、网易的首页,都有诸如天气、新闻、教育、军事等各大类,在每一大类里又有各小类;在淘宝、易趣等网上交易平台,更是有对商品的多级详细分类。关键词归约,就是根据用户访问的关键词追溯到用户对哪些类别的内容感兴趣。
无论是关键词扩展还是归约,都会得到更加精确的用户访问关键词列表,对所有词按权重由大到小进行排列,描述的即是用户的兴趣点。
回页首
MapReduce 对用户兴趣挖掘的实现
上一部分介绍了用户兴趣点挖掘的流程,本部分将针对各个模块进行 MapReduce 的实现。整个应用的输入是用户访问网页记录组成的文件,文件每行表示用户访问网页的一条记录,形为:
“用户 URL”。期望输出为用户的兴趣点文件,文件每行存储每个用户的兴趣点,形为:
“用户 词 1 权重 1 词 2 权重 2 词 3 权重 3 ”。
下面会对三个步骤分别讲解 MapReduce 实现。
单一网页信息挖掘
单一网页信息挖掘的目的是选取出网页中相对重要的关键词。策略为每个词赋予权重,并选取权重较大的词。词的权重获取公式 v = sum(vi*fi) 由两部分决定:该词在每个特征上的取值和该特征的权重。
每个特征的权重,可由训练得到,输入为给出关键词的系列网页。特征权重训练通常有特定的算法,比如 SCGIS 算法,因为训练集相对于整体的输入集较小,而算法通常也较复杂,并不适合并行化,可在 MapReduce 任务开始之前进行特征权重训练。
而词在每个特征维度上对应的取值,视特征的不同,难易程度也不同。比如词的出现位置、大小写、词性等,在对网页进行扫描时,可以立即获得。而 TF( 词在网页中出现的次数 )、DF(词在所有网页中出现的次数)等特征并不能随词出现时立即获取,但由于每个词处理的程序都相同,所以可以使用 MapReduce 编程模型并行化。下面进行具体讲述。
单一网页信息挖掘部分的 MapReduce 流程如图 5 所示。

图 5.MapReduce 实现单一网页信息挖掘

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: