package com.neverwinterdp.demandspike;
import com.neverwinterdp.server.Server;
import com.neverwinterdp.server.gateway.ClusterGateway;
import com.neverwinterdp.server.shell.Shell;
import com.neverwinterdp.util.FileUtil;
/**
* @author Tuan Nguyen
* @email tuan08@gmail.com
*/
public class DemandSpikeClusterBuilder {
static {
System.setProperty("app.dir", "build/cluster") ;
System.setProperty("app.config.dir", "src/app/config") ;
System.setProperty("log4j.configuration", "file:src/app/config/log4j.properties") ;
}
public static String TOPIC = "metrics.consumer" ;
public Server zkServer, sparknginServer, demandSpikeServer, genericServer ;
public Server[] kafkaServer ;
public Shell shell ;
public ClusterGateway gateway ;
public DemandSpikeClusterBuilder() {
kafkaServer = new Server[1] ;
}
public DemandSpikeClusterBuilder(int numOfKafkaServer) {
kafkaServer = new Server[numOfKafkaServer] ;
}
public void start() throws Exception {
FileUtil.removeIfExist("build/cluster", false);
genericServer = Server.create("-Pserver.name=generic", "-Pserver.roles=generic") ;
zkServer = Server.create("-Pserver.name=zookeeper", "-Pserver.roles=zookeeper") ;
for(int i = 0; i < kafkaServer.length; i++) {
int id = i + 1;
kafkaServer[i] = Server.create("-Pserver.name=kafka" + id, "-Pserver.roles=kafka") ;
}
sparknginServer = Server.create("-Pserver.name=sparkngin", "-Pserver.roles=sparkngin") ;
demandSpikeServer = Server.create("-Pserver.name=demandspike", "-Pserver.roles=demandspike") ;
shell = new Shell() ;
shell.getShellContext().connect();
gateway = shell.getShellContext().getClusterGateway() ;
//Wait to make sure all the servervices are launched
Thread.sleep(2000) ;
}
public void destroy() throws Exception {
shell.close();
demandSpikeServer.destroy() ;
sparknginServer.destroy() ;
genericServer.destroy() ;
for(int i = 0; i < kafkaServer.length; i++) {
kafkaServer[i].destroy() ;
}
zkServer.destroy() ;
}
public void install() throws Exception {
gateway.execute(
"module install --member-role zookeeper -Pmodule.data.drop=true -Pzk:clientPort=2181 --autostart --module Zookeeper"
) ;
String kafkaReplication = kafkaServer.length >= 2 ? "2" : "1" ;
for(int i = 0; i < kafkaServer.length; i++) {
int id = i + 1;
gateway.execute(
"module install "+
" --member-name kafka" + id +
" --autostart" +
" --module Kafka" +
" -Pmodule.data.drop=true" +
" -Pkafka:broker.id=" + id +
" -Pkafka:port=" + (9092 + i) +
" -Pkafka:zookeeper.connect=127.0.0.1:2181" +
" -Pkafka:default.replication.factor=" + kafkaReplication +
" -Pkafka:controller.socket.timeout.ms=90000" +
" -Pkafka:controlled.shutdown.enable=true" +
" -Pkafka:controlled.shutdown.max.retries=3" +
" -Pkafka:controlled.shutdown.retry.backoff.ms=60000"
) ;
}
gateway.execute(
"module install " +
" -Pmodule.data.drop=true -Pkafka:zookeeper.connect=127.0.0.1:2181 " +
" --member-role generic --autostart --module KafkaConsumer"
) ;
gateway.execute(
"module install" +
" --member-role sparkngin" +
" --autostart --module Sparkngin" +
" -Pmodule.data.drop=true" +
" -Psparkngin:http-listen-port=7080" +
" -Psparkngin:forwarder-class=com.neverwinterdp.sparkngin.KafkaMessageForwarder" +
" -Pkafka-producer:metadata.broker.list=" + getKafkaConnect()
) ;
gateway.execute(
"module install --member-role demandspike --autostart --module DemandSpike"
) ;
;
shell.execute("server registration");
Thread.sleep(1000);
}
public void uninstall() {
shell.execute("module uninstall --member-role demandspike --timeout 20000 --module DemandSpike");
shell.execute("module uninstall --member-role sparkngin --timeout 20000 --module Sparkngin");
shell.execute("module uninstall --member-role generic --timeout 20000 --module KafkaConsumer");
shell.execute("module uninstall --member-role kafka --timeout 20000 --module Kafka");
shell.execute("module uninstall --member-role zookeeper --timeout 20000 --module Zookeeper");
}
public String getKafkaConnect() {
StringBuilder b = new StringBuilder() ;
for(int i = 0; i < kafkaServer.length; i++) {
if(i > 0) b.append(",") ;
b.append("127.0.0.1:").append(9092 + i) ;
}
return b.toString() ;
}
}