package com.produban.openbus.analysis;
import backtype.storm.Config;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.StormTopology;
import backtype.storm.tuple.Fields;
import com.lexicalscope.jewel.cli.ArgumentValidationException;
import com.lexicalscope.jewel.cli.CliFactory;
import com.lexicalscope.jewel.cli.Option;
import storm.trident.Stream;
import storm.trident.TridentTopology;
import java.util.ArrayList;
import java.util.List;
/**
* Trident topology for analytics on raw logs coming from Kafka
*/
public class RawLogTopology {
public static StormTopology buildTopology (TopologyOptions options) {
TridentTopology topology = new TridentTopology();
BrokerSpout kafkaSpout = new BrokerSpout(options.getKafkaTopic(),
options.getZookeeper(),
options.getKafkaClientID(),
options.isForceFromStart());
String parserClass = options.getLogParserClass();
LogParser logParser = null;
try {
logParser = (LogParser) Class.forName(parserClass).newInstance();
} catch (Exception e) {
throw new RuntimeException("Couldn't instantiate log parser", e);
}
List<String> parsedFields = logParser.fieldNames();
Stream stream = topology.newStream("spout", kafkaSpout.getPartitionedTridentSpout())
.each(new Fields("bytes"), logParser, new Fields(parsedFields));
//do something interesting here
return topology.build();
}
public static void main(String[] args) throws Exception {
//parse topology arguments:
TopologyOptions appOptions = null;
try {
appOptions = CliFactory.parseArguments(TopologyOptions.class, args);
}
catch(ArgumentValidationException e)
{
System.out.println(e.getMessage());
System.exit(-1);
}
Config stormConfig = new Config();
stormConfig.setNumWorkers(appOptions.getStormNumWorkers());
List<String> fields = new ArrayList<>();
StormSubmitter.submitTopology(appOptions.getTopologyName(), stormConfig, buildTopology(appOptions));
}
/* Definition of topology arguments (this uses JewelCLI library) */
public interface TopologyOptions
{
@Option(defaultValue = "rawLogTopology")
String getTopologyName();
@Option
String getZookeeper();
@Option
String getKafkaTopic();
@Option(defaultValue = "3")
int getStormNumWorkers();
@Option(defaultValue = "rawLogTopology")
String getKafkaClientID();
@Option
String getLogParserClass();
@Option
boolean isForceFromStart();
@Option(shortName = "h", helpRequest = true)
boolean getHelp();
}
}