怎么用Storm IPResolutionBolt写爬虫

64次阅读
没有评论

共计 2222 个字符,预计需要花费 6 分钟才能阅读完成。

本篇内容介绍了“怎么用 Storm IPResolutionBolt 写爬虫”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

package com.digitalpebble.storm.crawler.bolt;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class IPResolutionBolt extends BaseRichBolt {
 public static final Logger LOG = LoggerFactory
 .getLogger(IPResolutionBolt.class);
 OutputCollector _collector;
 @SuppressWarnings(unchecked)
 public void execute(Tuple tuple) {
 String url = tuple.getStringByField( url 
 HashMap String, String[]  metadata = null;

if (tuple.contains( metadata)) metadata = (HashMap String, String[] ) tuple .getValueByField( metadata  // 这里的 Metadata 是一个 HashMap,持有的是一个   String,String[]   的对象组合 String ip = null; String host =  URL u; try {u = new URL(url); host = u.getHost();} catch (MalformedURLException e1) {LOG.warn( Invalid URL:   + url); // ack it so that it doesn t get replayed _collector.ack(tuple); return; try {long start = System.currentTimeMillis(); final InetAddress addr = InetAddress.getByName(host); ip = addr.getHostAddress(); long end = System.currentTimeMillis(); LOG.info(IP for:   + host +       + ip +   in   + (end - start) +   msec
 // 在这里我们发射  url,ip,metadata  并且针对 tuple 做一个 Ack _collector.emit(tuple, new Values(url, ip, metadata)); _collector.ack(tuple); } catch (final Exception e) {LOG.warn( Unable to resolve IP for:   + host); _collector.fail(tuple); public void declareOutputFields(OutputFieldsDeclarer declarer) {declarer.declare(new Fields( url ,  ip ,  metadata)); public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {_collector = collector;}

          在这里我们需要关注,declareOutputFields 在设定我们的 Tuple records 对象的时候,是传递的“url”,“ip”,“metadata”,而不是一个封装好的对象。 

        一旦我们传递的 records 的数量比较多。那么请宁务必将传递的值设置为对象。并且在接受方,getValues(0)的方式取得。

“怎么用 Storm IPResolutionBolt 写爬虫”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计2222字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)