本篇内容介绍了“怎么用Storm IPResolutionBolt写爬虫”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
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; //在这里判断我们的tuple是否包含着Meradata 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写爬虫”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。