package backtype.storm.contrib.hbase.examples; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.contrib.hbase.bolts.HBaseCountersBatchBolt; import backtype.storm.contrib.hbase.utils.TupleTableConfig; import backtype.storm.testing.MemoryTransactionalSpout; import backtype.storm.transactional.TransactionalTopologyBuilder; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; /** * An example transactional topology that uses the * {@link HBaseCountersBatchBolt} to increment the following counters in a HBase * table: * <ul> * <li>cf:'data' cq:'clicks' * <li>cf:'daily' cq:'YYYYMMDD' * </ul> * The example assumes that the following table exists in HBase:<br> * <tt>create 'shorturl', {NAME => 'data', VERSIONS => 3}, {NAME => 'daily', VERSION => 1, TTL => 604800}</tt> */ public class HBaseCountersBatchTopology { @SuppressWarnings("serial") protected final static Map<Integer, List<List<Object>>> values = new HashMap<Integer, List<List<Object>>>() {{ put(0, new ArrayList<List<Object>>() {{ add(new Values("http://bit.ly/ZK6t", "www.arsenal.com/home", "kinley", "20120816")); add(new Values("http://bit.ly/LsaBa", "www.baltimoreravens.com/", "kinley", "20120816")); add(new Values("http://bit.ly/2VL7eA", "www.49ers.com/", "kinley", "20120816")); add(new Values("http://bit.ly/9ZJhuY", "www.buccaneers.com/index.html", "kinley", "20120816")); add(new Values("http://atmlb.com/7NG4sm", "baltimore.orioles.mlb.com/", "kinley", "20120816")); }}); put(1, new ArrayList<List<Object>>() {{ add(new Values("http://bit.ly/ZK6t", "www.arsenal.com/home", "kinley", "20120817")); add(new Values("http://bit.ly/ZK6t", "www.arsenal.com/home", "kinley", "20120817")); add(new Values("http://bit.ly/ZK6t", "www.arsenal.com/home", "kinley", "20120817")); }}); put(2, new ArrayList<List<Object>>() {{ add(new Values("http://bit.ly/LsaBa", "www.baltimoreravens.com/", "kinley", "20120820")); add(new Values("http://bit.ly/LsaBa", "www.baltimoreravens.com/", "kinley", "20120820")); add(new Values("http://bit.ly/LsaBa", "www.baltimoreravens.com/", "kinley", "20120903")); }}); }}; /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // Add transactional spout MemoryTransactionalSpout spout = new MemoryTransactionalSpout(values, new Fields("shortid", "url", "user", "date"), 3); TransactionalTopologyBuilder builder = new TransactionalTopologyBuilder( "shorturl-count", "spout", spout, 2); // Build TupleTableConifg TupleTableConfig ttConfig = new TupleTableConfig("shorturl", "shortid"); ttConfig.setBatch(false); ttConfig.addColumn("data", "clicks"); ttConfig.addColumn("daily", "date"); builder.setBolt("hbase-counters", new HBaseCountersBatchBolt(ttConfig), 2) .fieldsGrouping("spout", new Fields("shortid")); LocalCluster cluster = new LocalCluster(); Config stormConfig = new Config(); stormConfig.setDebug(true); stormConfig.setMaxSpoutPending(3); cluster.submitTopology("hbase-example", stormConfig, builder.buildTopology()); Thread.sleep(10000); cluster.shutdown(); } }