package backtype.storm.contrib.hbase.bolts; import java.io.IOException; import java.util.Map; import org.apache.log4j.Logger; import backtype.storm.contrib.hbase.utils.HTableConnector; import backtype.storm.contrib.hbase.utils.TupleTableConfig; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.IRichBolt; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.tuple.Tuple; /** * A Storm bolt for putting data into HBase. * <p> * By default works in batch mode by enabling HBase's client-side write buffer. Enabling batch mode * is recommended for high throughput, but it can be disabled in {@link TupleTableConfig}. * <p> * The HBase configuration is picked up from the first <tt>hbase-site.xml</tt> encountered in the * classpath * @see TupleTableConfig * @see HTableConnector */ @SuppressWarnings("serial") public class HBaseBolt implements IRichBolt { private static final Logger LOG = Logger.getLogger(HBaseBolt.class); protected OutputCollector collector; protected HTableConnector connector; protected TupleTableConfig conf; protected boolean autoAck = true; public HBaseBolt(TupleTableConfig conf) { this.conf = conf; } /** {@inheritDoc} */ @SuppressWarnings("rawtypes") @Override public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { this.collector = collector; try { this.connector = new HTableConnector(conf); } catch (IOException e) { throw new RuntimeException(e); } LOG.info("Preparing HBaseBolt for table: " + this.conf.getTableName()); } /** {@inheritDoc} */ @Override public void execute(Tuple input) { try { this.connector.getTable().put(conf.getPutFromTuple(input)); } catch (IOException ex) { throw new RuntimeException(ex); } if (this.autoAck) { this.collector.ack(input); } } /** {@inheritDoc} */ @Override public void cleanup() { this.connector.close(); } /** {@inheritDoc} */ @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { } /** {@inheritDoc} */ @Override public Map<String, Object> getComponentConfiguration() { return null; } /** * @return the autoAck */ public boolean isAutoAck() { return autoAck; } /** * @param autoAck the autoAck to set */ public void setAutoAck(boolean autoAck) { this.autoAck = autoAck; } }