案例研究有两个目的。一个是从更大的范围来审视那些将Hadoop作为核心部分的系统。你会发现一些辅助工具,如Cascading、HBase和Jaql。第二个目的是说明对于多样性的业务,Hadoop均为它们解决了在运营中所面临的挑战。
我们以IBM的ES2项目作为例子,它是一个面向企业查询的分析系统。撰写人为Vuk Ercegovac、Rajasekak Krishnamurthy、Sriram Raghavan等。
相比过去几年的Web搜索的飞速进步,企业内部网的搜索在很大程度上认识一个未被解决的难题。基于对IBM内部网的研究,Fagin等人指出内部网搜索与Web搜索之间存在一些重要差异。他们观察到内部网上的查询绝大多数都是“导航式的”。正确答案只是一个很小的集合。例如,通过人工检查IBM内部网(至2008年7月)最常用的6500个查询,他们发现这些查询的90%以上都是导航式的。
有几个要素是企业所特有的,它们复杂化了找到查询的“正确”答案任务。 在搜索查询语句和内部网网页上使用企业特定词汇、缩写和首字母缩写词。
依据发起请求人的所在地及其在组织中的角色,相同的查询有不同的“正确”答案 从IBM先前的努力中,我们了解到使用传统信息检索技术很难克服这些问题。后来提出了一种方法,其中包括用详尽的离线分析来预先标识导航页,并使用专用的导航索引。对IBM内部网上550多万页的语料进行了试验,验证了这种方法的可行性。这种方法的系统使用了专有平台和关系数据库混合方式。还曾抓取了IBM内部网上大部分数据,共找到1亿多个URL,编制了超过1600万份的索引文档。为了应付如此大的规模,我们汲取了前人的努力成果,开发了ES2——一种可扩展的、高质量的IBM内部网搜索引擎。它利用了大量的开放源码平台工具,如Hadoop、Nutch、Lucene和Jaql。 原则上,Nutch爬虫、Hadoop MapReduce框架与Lucene索引引擎提供了构建一个完全的搜索引擎所需的所有软件组件。但真正解决前面所述的挑战,仅仅拼接这些系统是不够的。我们描述如何对抓去的网页进行复杂的分析挖掘,并采用专用导航索引与智能的查询处理相结合的方式,以确保有效的搜索质量。 接下来来了解ES2的系统结构。我们假定读者对Hadoop和Nutch有所了解。Nutch是在Hadoop MapReduce平台上实现的用于Web爬行的开源爬虫。 ES2还使用了Jaql,一个为JSON(一种流行的半结构化数据模型)设计的数据流语言。Jaql提供了一种累死Unix管道的语法,将半结构化JSON数据的多个处理阶段连接在一起。ES2工作流涉及多个算法,,它们用于在将数据插入索引之前的本地分析、全局分析和变体生成。没有足够的数据管理支持,这个复杂的多阶段工作流很快变得无法处理。要解决此问题,ES2使用JSON来表示数据,用Jaql指定工作流。(参见图9.1) 图9.2显示了ES2的系统结构。ES2有6各部分:爬虫、本地分析、全局分析、变体生成和索引、背景挖掘和搜索运行时。ES2使用Nutch的增强版(0.9版)——一个基于Hadoop平台的可扩展的开源爬虫。此外,ES2还从IBM社会书签服务(称为Dogear)收集信息。与delicious.com非常类似,Dogear包含由IBM社区所收藏的各种URL,以及与每个URL相关联的标签集合。与URL非常类似,Dogear包含由IBM社区所收藏的各种URL,以及与每个URL相关了标签集合。与URL相关联的标签包含与页面相关的价值线索,而ES2使用此信息建立其索引。所有阶段都使用通用分布式文件系统HDFS用于输入和输出。本地分析处理每个页面来提取有关页面的特征,并在HDFS中将结果存储为JASON对象。ES2使用Jaql将每个页面推过剩余的管道,根据需要在每个阶段转换数据。Jaql查村被用于汇集不同的本地分析结果并调用全局分析。Jaql还被用于调用变体生成,以及使用本地和全局分析的输出对工作流进行索引。索引会定期复制到一组不同的服务于用户查询机器。
图9.1 ES2系统结构
虽然不属于主要工作流,ES2仍会定期执行几个挖掘和分类任务。此示例包含自动生成首字母缩写词库、正则表达式库与地理分类规则的算法。 ES2使用Nutch 0.9。Nutch中的主要数据结构为CrawlDB:它是一个键值集合,其中键为Nutch所知的URL,而值为URL的状态。状态包含与URL有关的元数据,如何发现时间、是否已经被获取等。Nutch被设计为一个包含3个MapReduce作业的序列。
生成——在此阶段中,通过扫描(来自CrawlDB的)输入键/值对,为已经被发现
但未提取的URL生成一个提取列表。生成此列表的通用方法是基于适当的评分机制选择未提取URL中的前k个。
提取——在此阶段,输入提取列表中与URL相关联的页被提取并解析。输出包括
URL和页面解析后的结果。
更新——此阶段通过解析提取阶段的页面内容来收集所有已发现的URL,并将它
们合并到CrawlDB。在每个生成—提取—更新的周期提取的页被称为段(segment)。 ES2的复杂性与能力大多在于其分析。这里,我们简要说明不同的算法,特别注意将这些算法映射到Hadoop上时所做的选择。 在本地分析中,每页单独进行分析以提取线索,这些线索有助于决定该页面是否为候选导航页。在ES2中使用了5种不同的本地分析算法,即TitleHomePage、PersonalHomePage、URLHomePage、AnchorHome和Navlink。这些算法使用基于正则表达式模式、词典和信息提取工具的规则来确定候选导航页。 IBM内部网的很多网站重定向用于更新、负载平衡、升级和内部重组处理。遗憾的是,重定向会导致本地分析算法出问题。例如,URLHomePage使用URL文本来检测候选导航页面。重定向之后,目标URL可能就不再包含与原始URL相同的特征。 如要跟踪重定向,我们修改Nutch来标记每个由源URL重定向的目标页。考虑图9.2。爬虫遵循从页面A到页面B,以及从页面B到页面C的重定向。我们通过用源URL(A)来标记页面B和页面C来跟踪这些重定向。这个标记以元数据字段形式被存储在段文件中。段文件是一个键/值对集合,其中键是页URL,值是页的内容(联通其他的元数据字段)。
图2.9 重定向解决方案
以下代码清单(称为ResolveSimple)概述了Map和Reduce函数,这两个函数用于解决段上的重定向和调回本地分析的功能。Map阶段输出源URL和页面内容。Reduce阶段将所有URL相同的页面放回到单个组中。在图9.2所示的示例中,页面A、B和C的共同源URL为A。这个组(C)中的目标页面以及其他的URL(A和B)于是被传递到本地分析中。 代码清单:
Map (Key: URL, Value: PageData) if PageData.SourceURL exists then
Output [PageData.SourceURL, PageData] else
Output [URL, Pagedata] end if End
Reduce(Key:URL, Values: Pageset)
Let URLset = Set of all URLs in Pageset
Let page = Target of redirection in Pageset Result = LocalAnalysis(page, URLset) Output [page.URL, result] End
在ResolveSimple这个例子中,在化简程序里调用本地分析。这就要求Hadoop将页面的内容从map阶段传递到reduce阶段。这涉及在网络上对大量数据进行排序和移动。要避免出现这种情况,我们修改ResolveSimple并将重定向解决方案和本地分析分开,以便在map阶段运行本地分析运算。这让本地分析的计算与数据可以在相同的为之,从而得到性能的显著提升。 在以下代码清单中,我们给出了改进的算法,称为Resolve2Step。在该算法的map阶段,我们仅传递元数据,而不传递页面内容。在ResolveSimple的reduce阶段,我们输出一个两列的表:第一列为这组页面中目标页的URL,而第二列是当前页面提交给本地分析时与之关联的一组URL。 代码清单:
1: Resolve Redirections
Map (Key: URL, Value: Page)
if PageData.SourceURL exists then
Output [PageData.SourceURL, PageData.metadata] else
Output [URL, PageData.metadata] end if End
Reduce (Key: URL, Value: Pageset)
Let URLset = Set of all URLs in Pageset
Let page = Target of redirections in Pageset Output [page.URL, URLset] End
2. Run Local Analysis
Map (Key: URL, Value: Page)
Load resolveTable from output of previous step if needed Let URLSet = resolveTable [URL]
Result = LoadAnalysis(page, URLset) Output [page.URL, result] End
至此我们描述了ES2的体系结构——它是一种可扩展的企业搜索系统,由IBM使用开源组件开发,如Nutch、Hadoop、Lucene和Sqal。我么还针对企业信息抓取,概述了Nutch所需作的改变。我们本地分析算法映射到了Hadoop上。在实现一个包抓取,本地分析、全局分析和索引呃复杂工作流时,我们发现JSON是一种有效的数据格式,而Jqal是一个非常强大的工具。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务