【无标题】

2021SC@SDUSC

invert函数创建了两个hadoop的Job,第一个Job设置输入为crawl/segments/*/下的parse_data目录,Mapper函数为LinkDb的map函数,Reducer为LinkDbMerger,Combiner为LinkDbMerger,该Job的作用是把parse_data中记录的url记录连接进行反向,存入临时目录newLinkDb中,所谓反向,比方说parse_data目录中记录的url链接为A(Key)->B(Value)、A(Key)->C(Value)、B(Key)->C(Value),经过反向处理后,输出的链接为B(Key)->A(value) 、C(Key)->A(value)、C(Key)->B(value),即正向链接记录的信息是“一个url地址链接到哪些url地址”,反向链接记录的信息是“有多少url地址链接到这个url地址”。
invert的第二个Job通过LinkDbMerger的createMergeJob函数创建,该Job的作用是将第一个Job输出的临时文件夹newLinkDb,与crawl/linkdb/current,即之前的反向信息合并,输出到另一个临时文件夹中。
最后执行LinkDb的install函数更新信息,LinkDb的install函数和前几章分析的install函数类似,都将第二个Job输出的临时文件夹命名为current、将原来的current文件夹命名为old,将原来的old文件夹删除。

先来看第一个Job。

LinkDb::map

public void map(Text key, ParseData parseData,
OutputCollector<Text, Inlinks> output, Reporter reporter)
throws IOException {
String fromUrl = key.toString();
String fromHost = getHost(fromUrl);
fromUrl = urlNormalizers
.normalize(fromUrl, URLNormalizers.SCOPE_LINKDB);
fromUrl = urlFilters.filter(fromUrl);

Outlink[] outlinks = parseData.getOutlinks();
Inlinks inlinks = new Inlinks();
for (int i = 0; i < outlinks.length; i++) {
  Outlink outlink = outlinks[i];
  String toUrl = outlink.getToUrl();

  toUrl = urlNormalizers.normalize(toUrl, URLNormalizers.SCOPE_LINKDB);
  toUrl = urlFilters.filter(toUrl);

  inlinks.clear();
  String anchor = outlink.getAnchor();
  if (anchor.length() > maxAnchorLength) {
    anchor = anchor.substring(0, maxAnchorLength);
  }
  inlinks.add(new Inlink(fromUrl, anchor));
  output.collect(new Text(toUrl), inlinks);
}

}

map函数取出parse_data文件夹下记录的从某个url即fromUrl提取出的所有链接outlinks,进行标准化和过滤,最后输出的key为outlinks中每个链接,value为fromUrl。

LinkDbMerger::reduce

public void reduce(Text key, Iterator values,
OutputCollector<Text, Inlinks> output, Reporter reporter)
throws IOException {

Inlinks result = new Inlinks();

while (values.hasNext()) {
  Inlinks inlinks = values.next();

  int end = Math.min(maxInlinks - result.size(), inlinks.size());
  Iterator<Inlink> it = inlinks.iterator();
  int i = 0;
  while (it.hasNext() && i++ < end) {
    result.add(it.next());
  }
}
if (result.size() == 0)
  return;
output.collect(key, result);

}

maxInlinks为最多有多少链接能链接到该url地址,默认为10000,reduce函数就是将链接到相同url地址的链接添加到Inlinks中,最后记录到文件中。

第二个Job的Mapper和Reducer和第一个Job相同,用来将第一个Job的输出和原来crawl/linkdb/current下的数据合并,这里就不看了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值