千家信息网

怎么用Storm IPResolutionBolt写爬虫

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,本篇内容介绍了"怎么用Storm IPResolutionBolt写爬虫"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅
千家信息网最后更新 2025年02月07日怎么用Storm IPResolutionBolt写爬虫

本篇内容介绍了"怎么用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 metadata = null;                                //在这里判断我们的tuple是否包含着Meradata                if (tuple.contains("metadata"))                        metadata = (HashMap) tuple                                        .getValueByField("metadata");                                                        //这里的Metadata是一个HashMap,持有的是一个  的对象组合                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写爬虫"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0