package com.neverwinterdp.scribengin.dataflow.test;
import java.util.Random;
import com.neverwinterdp.kafka.tool.KafkaTool;
import com.neverwinterdp.scribengin.Record;
import com.neverwinterdp.scribengin.ScribenginClient;
import com.neverwinterdp.scribengin.dataflow.DataflowDescriptor;
import com.neverwinterdp.scribengin.dataflow.DataflowTaskContext;
import com.neverwinterdp.scribengin.event.ScribenginWaitingEventListener;
import com.neverwinterdp.scribengin.scribe.ScribeAbstract;
import com.neverwinterdp.scribengin.storage.StorageDescriptor;
public class HelloKafkaDataflowBuilder {
private String name = "hello";
private String zkConnect = "127.0.0.1:2181";
private String topic = "hello";
private int numOfWorkers = 3;
private int numOfExecutorPerWorker = 3;
private ScribenginClient scribenginClient;
public HelloKafkaDataflowBuilder(ScribenginClient scribenginClient) {
this.scribenginClient = scribenginClient;
}
public void setNumOfWorkers(int numOfWorkers) {
this.numOfWorkers = numOfWorkers;
}
public void setNumOfExecutorPerWorker(int numOfExecutorPerWorker) {
this.numOfExecutorPerWorker = numOfExecutorPerWorker;
}
public ScribenginWaitingEventListener submit() throws Exception {
KafkaTool client = new KafkaTool(name, zkConnect) ;
client.connect();
String brokerList = client.getKafkaBrokerList() ;
client.close();
DataflowDescriptor dflDescriptor = new DataflowDescriptor();
dflDescriptor.setName("hello-kafka-dataflow");
dflDescriptor.setNumberOfWorkers(numOfWorkers);
dflDescriptor.setNumberOfExecutorsPerWorker(numOfExecutorPerWorker);
dflDescriptor.setScribe(TestCopyScribe.class.getName());
StorageDescriptor storageDescriptor = new StorageDescriptor("KAFKA") ;
storageDescriptor.attribute("name", name);
storageDescriptor.attribute("topic", topic + ".source");
storageDescriptor.attribute("zk.connect", zkConnect);
storageDescriptor.attribute("broker.list", brokerList);
dflDescriptor.setSourceDescriptor(storageDescriptor);
StorageDescriptor defaultSink = new StorageDescriptor("KAFKA");
defaultSink.attribute("name", name);
defaultSink.attribute("topic", topic + ".sink.default");
defaultSink.attribute("zk.connect", zkConnect);
defaultSink.attribute("broker.list", brokerList);
dflDescriptor.addSinkDescriptor("default", defaultSink);
StorageDescriptor invalidSink = new StorageDescriptor("KAFKA");
invalidSink.attribute("name", name);
invalidSink.attribute("topic", topic + ".sink.invalid");
invalidSink.attribute("zk.connect", zkConnect);
invalidSink.attribute("broker.list", brokerList);
dflDescriptor.addSinkDescriptor("invalid", invalidSink);
return scribenginClient.submit(dflDescriptor);
}
static public class TestCopyScribe extends ScribeAbstract {
private int count = 0;
private Random random = new Random();
@Override
public void process(Record record, DataflowTaskContext ctx) throws Exception {
if(random.nextDouble() < 0.8) {
ctx.append(record);
//System.out.println("Write default");
} else {
ctx.write("invalid", record);
//System.out.println("Write invalid");
}
count++ ;
if(count == 100) {
ctx.commit();
count = 0;
}
}
}
}