共计 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 小编将为大家输出更多高质量的实用文章!
正文完