怎么用StormIPResolutionBolt写爬虫

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

成都创新互联公司于2013年开始,先为衡南等服务建站,衡南等地企业,进行企业商务咨询服务。为衡南企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

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写爬虫”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


分享名称:怎么用StormIPResolutionBolt写爬虫
文章链接:http://azwzsj.com/article/pjcigi.html