{"payload":{"allShortcutsEnabled":false,"fileTree":{"examples/storm-starter/src/jvm/org/apache/storm/starter":{"items":[{"name":"bolt","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/bolt","contentType":"directory"},{"name":"spout","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/spout","contentType":"directory"},{"name":"streams","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/streams","contentType":"directory"},{"name":"tools","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/tools","contentType":"directory"},{"name":"trident","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/trident","contentType":"directory"},{"name":"AnchoredWordCount.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/AnchoredWordCount.java","contentType":"file"},{"name":"BasicDRPCTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/BasicDRPCTopology.java","contentType":"file"},{"name":"BlobStoreAPIWordCountTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/BlobStoreAPIWordCountTopology.java","contentType":"file"},{"name":"ExclamationTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/ExclamationTopology.java","contentType":"file"},{"name":"FastWordCountTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/FastWordCountTopology.java","contentType":"file"},{"name":"InOrderDeliveryTest.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/InOrderDeliveryTest.java","contentType":"file"},{"name":"JoinBoltExample.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/JoinBoltExample.java","contentType":"file"},{"name":"LambdaTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/LambdaTopology.java","contentType":"file"},{"name":"ManualDRPC.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/ManualDRPC.java","contentType":"file"},{"name":"MultiThreadWordCountTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/MultiThreadWordCountTopology.java","contentType":"file"},{"name":"MultipleLoggerTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/MultipleLoggerTopology.java","contentType":"file"},{"name":"PersistentWindowingTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/PersistentWindowingTopology.java","contentType":"file"},{"name":"Prefix.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/Prefix.java","contentType":"file"},{"name":"ReachTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/ReachTopology.java","contentType":"file"},{"name":"ResourceAwareExampleTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/ResourceAwareExampleTopology.java","contentType":"file"},{"name":"RollingTopWords.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/RollingTopWords.java","contentType":"file"},{"name":"SingleJoinExample.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/SingleJoinExample.java","contentType":"file"},{"name":"SkewedRollingTopWords.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/SkewedRollingTopWords.java","contentType":"file"},{"name":"SlidingTupleTsTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/SlidingTupleTsTopology.java","contentType":"file"},{"name":"SlidingWindowTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/SlidingWindowTopology.java","contentType":"file"},{"name":"StatefulTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/StatefulTopology.java","contentType":"file"},{"name":"StatefulWindowingTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/StatefulWindowingTopology.java","contentType":"file"},{"name":"WordCountTopology.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/WordCountTopology.java","contentType":"file"},{"name":"WordCountTopologyNode.java","path":"examples/storm-starter/src/jvm/org/apache/storm/starter/WordCountTopologyNode.java","contentType":"file"}],"totalCount":29},"examples/storm-starter/src/jvm/org/apache/storm":{"items":[{"name":"starter","path":"examples/storm-starter/src/jvm/org/apache/storm/starter","contentType":"directory"}],"totalCount":1},"examples/storm-starter/src/jvm/org/apache":{"items":[{"name":"storm","path":"examples/storm-starter/src/jvm/org/apache/storm","contentType":"directory"}],"totalCount":1},"examples/storm-starter/src/jvm/org":{"items":[{"name":"apache","path":"examples/storm-starter/src/jvm/org/apache","contentType":"directory"}],"totalCount":1},"examples/storm-starter/src/jvm":{"items":[{"name":"org","path":"examples/storm-starter/src/jvm/org","contentType":"directory"}],"totalCount":1},"examples/storm-starter/src":{"items":[{"name":"clj","path":"examples/storm-starter/src/clj","contentType":"directory"},{"name":"jvm","path":"examples/storm-starter/src/jvm","contentType":"directory"}],"totalCount":2},"examples/storm-starter":{"items":[{"name":"multilang","path":"examples/storm-starter/multilang","contentType":"directory"},{"name":"src","path":"examples/storm-starter/src","contentType":"directory"},{"name":"test","path":"examples/storm-starter/test","contentType":"directory"},{"name":"README.markdown","path":"examples/storm-starter/README.markdown","contentType":"file"},{"name":"pom.xml","path":"examples/storm-starter/pom.xml","contentType":"file"}],"totalCount":5},"examples":{"items":[{"name":"storm-elasticsearch-examples","path":"examples/storm-elasticsearch-examples","contentType":"directory"},{"name":"storm-hbase-examples","path":"examples/storm-hbase-examples","contentType":"directory"},{"name":"storm-hdfs-examples","path":"examples/storm-hdfs-examples","contentType":"directory"},{"name":"storm-hive-examples","path":"examples/storm-hive-examples","contentType":"directory"},{"name":"storm-jdbc-examples","path":"examples/storm-jdbc-examples","contentType":"directory"},{"name":"storm-jms-examples","path":"examples/storm-jms-examples","contentType":"directory"},{"name":"storm-kafka-client-examples","path":"examples/storm-kafka-client-examples","contentType":"directory"},{"name":"storm-loadgen","path":"examples/storm-loadgen","contentType":"directory"},{"name":"storm-mongodb-examples","path":"examples/storm-mongodb-examples","contentType":"directory"},{"name":"storm-mqtt-examples","path":"examples/storm-mqtt-examples","contentType":"directory"},{"name":"storm-opentsdb-examples","path":"examples/storm-opentsdb-examples","contentType":"directory"},{"name":"storm-perf","path":"examples/storm-perf","contentType":"directory"},{"name":"storm-pmml-examples","path":"examples/storm-pmml-examples","contentType":"directory"},{"name":"storm-redis-examples","path":"examples/storm-redis-examples","contentType":"directory"},{"name":"storm-rocketmq-examples","path":"examples/storm-rocketmq-examples","contentType":"directory"},{"name":"storm-solr-examples","path":"examples/storm-solr-examples","contentType":"directory"},{"name":"storm-starter","path":"examples/storm-starter","contentType":"directory"}],"totalCount":17},"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"bin","path":"bin","contentType":"directory"},{"name":"conf","path":"conf","contentType":"directory"},{"name":"dev-tools","path":"dev-tools","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"examples","path":"examples","contentType":"directory"},{"name":"external","path":"external","contentType":"directory"},{"name":"flux","path":"flux","contentType":"directory"},{"name":"integration-test","path":"integration-test","contentType":"directory"},{"name":"licenses","path":"licenses","contentType":"directory"},{"name":"log4j2","path":"log4j2","contentType":"directory"},{"name":"sql","path":"sql","contentType":"directory"},{"name":"storm-buildtools","path":"storm-buildtools","contentType":"directory"},{"name":"storm-checkstyle","path":"storm-checkstyle","contentType":"directory"},{"name":"storm-client","path":"storm-client","contentType":"directory"},{"name":"storm-clojure-test","path":"storm-clojure-test","contentType":"directory"},{"name":"storm-clojure","path":"storm-clojure","contentType":"directory"},{"name":"storm-core","path":"storm-core","contentType":"directory"},{"name":"storm-dist","path":"storm-dist","contentType":"directory"},{"name":"storm-multilang","path":"storm-multilang","contentType":"directory"},{"name":"storm-server","path":"storm-server","contentType":"directory"},{"name":"storm-shaded-deps","path":"storm-shaded-deps","contentType":"directory"},{"name":"storm-submit-tools","path":"storm-submit-tools","contentType":"directory"},{"name":"storm-webapp","path":"storm-webapp","contentType":"directory"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".travis.yml","path":".travis.yml","contentType":"file"},{"name":"DEPENDENCY-LICENSES","path":"DEPENDENCY-LICENSES","contentType":"file"},{"name":"DEVELOPER.md","path":"DEVELOPER.md","contentType":"file"},{"name":"KEYS","path":"KEYS","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"LICENSE-binary","path":"LICENSE-binary","contentType":"file"},{"name":"NOTICE","path":"NOTICE","contentType":"file"},{"name":"NOTICE-binary","path":"NOTICE-binary","contentType":"file"},{"name":"README.markdown","path":"README.markdown","contentType":"file"},{"name":"RELEASING.md","path":"RELEASING.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"THIRD-PARTY.properties","path":"THIRD-PARTY.properties","contentType":"file"},{"name":"VERSION","path":"VERSION","contentType":"file"},{"name":"doap_Storm.rdf","path":"doap_Storm.rdf","contentType":"file"},{"name":"pom.xml","path":"pom.xml","contentType":"file"}],"totalCount":41}},"fileTreeProcessingTime":45.746351,"foldersToFetch":[],"repo":{"id":14135470,"defaultBranch":"master","name":"storm","ownerLogin":"apache","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2013-11-05T08:00:14.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/47359?v=4","public":true,"private":false,"isOrgOwned":true},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"v2.3.0","listCacheKey":"v0:1710531362.0","canEdit":false,"refType":"tag","currentOid":"b5252eda18e76c4f42af58d7481ea66cf3ec8471"},"path":"examples/storm-starter/src/jvm/org/apache/storm/starter/ReachTopology.java","currentUser":null,"blob":{"rawLines":["/**"," * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with"," * this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version"," * 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at"," *"," * http://www.apache.org/licenses/LICENSE-2.0"," *"," * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS,"," * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions"," * and limitations under the License."," */","","package org.apache.storm.starter;","","import java.util.Arrays;","import java.util.HashMap;","import java.util.HashSet;","import java.util.List;","import java.util.Map;","import java.util.Set;","import org.apache.storm.Config;","import org.apache.storm.StormSubmitter;","import org.apache.storm.coordination.BatchOutputCollector;","import org.apache.storm.drpc.LinearDRPCTopologyBuilder;","import org.apache.storm.task.TopologyContext;","import org.apache.storm.topology.BasicOutputCollector;","import org.apache.storm.topology.OutputFieldsDeclarer;","import org.apache.storm.topology.base.BaseBasicBolt;","import org.apache.storm.topology.base.BaseBatchBolt;","import org.apache.storm.tuple.Fields;","import org.apache.storm.tuple.Tuple;","import org.apache.storm.tuple.Values;","import org.apache.storm.utils.DRPCClient;","","/**"," * This is a good example of doing complex Distributed RPC on top of Storm. This program creates a topology that can"," * compute the reach for any URL on Twitter in realtime by parallelizing the whole computation."," *"," *
Reach is the number of unique people exposed to a URL on Twitter. To compute reach, you have to get all the people"," * who tweeted the URL, get all the followers of all those people, unique that set of followers, and then count the"," * unique set. It's an intense computation that can involve thousands of database calls and tens of millions of follower"," * records."," *"," *
This Storm topology does every piece of that computation in parallel, turning what would be a computation that takes"," * minutes on a single machine into one that takes just a couple seconds."," *"," *
For the purposes of demonstration, this topology replaces the use of actual DBs with in-memory hashmaps."," *"," * @see Distributed RPC"," */","public class ReachTopology {"," public static Map