package org.jai.flume.sinks.elasticsearch;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.flume.Channel;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.Sink;
import org.apache.flume.Transaction;
import org.apache.flume.channel.MemoryChannel;
import org.apache.flume.conf.Configurables;
import org.apache.flume.sink.elasticsearch.ElasticSearchSink;
import org.apache.flume.sink.elasticsearch.ElasticSearchSinkConstants;
import org.jai.flume.sinks.elasticsearch.serializer.ElasticSearchJsonBodyEventSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class FlumeESSinkServiceImpl implements FlumeESSinkService {
private static final Logger LOG = LoggerFactory
.getLogger(FlumeESSinkServiceImpl.class);
private ElasticSearchSink sink;
private Channel channel;
@Override
public Sink getSink() {
return sink;
}
@Override
public void processEvents(List<Event> events) {
int batchSize = 10;
int batches = events.size() / batchSize;
for (int i = 0; i <= batches; i++) {
Transaction txn = channel.getTransaction();
txn.begin();
int from = batchSize * i;
int to = (i == batches) ? events.size() : from + batchSize;
for (Event event : events.subList(from, to)) {
channel.put(event);
LOG.debug("Putting event to channel: {} ", event);
}
txn.commit();
txn.close();
try {
sink.process();
} catch (EventDeliveryException e) {
LOG.error("Error processing events!", e);
throw new RuntimeException("Error processing events!", e);
}
}
}
@Override
public void start() {
createSink();
}
@Override
public void shutdown() {
channel.stop();
sink.stop();
}
@Override
public Channel getChannel() {
return channel;
}
private void createSink() {
sink = new ElasticSearchSink();
sink.setName("ElasticSearchSink-" + UUID.randomUUID());
channel = new MemoryChannel();
Map<String, String> channelParamters = new HashMap<>();
channelParamters.put("capacity", "100000");
channelParamters.put("transactionCapacity", "1000");
Context channelContext = new Context(channelParamters);
Configurables.configure(channel, channelContext);
channel.setName("ElasticSearchSinkChannel-" + UUID.randomUUID());
Map<String, String> paramters = new HashMap<>();
paramters.put(ElasticSearchSinkConstants.HOSTNAMES, "127.0.0.1:9310");
String indexNamePrefix = "recentlyviewed";
paramters.put(ElasticSearchSinkConstants.INDEX_NAME, indexNamePrefix);
paramters.put(ElasticSearchSinkConstants.INDEX_TYPE, "clickevent");
paramters.put(ElasticSearchSinkConstants.CLUSTER_NAME,
"jai-testclusterName");
paramters.put(ElasticSearchSinkConstants.BATCH_SIZE, "10");
paramters.put(ElasticSearchSinkConstants.SERIALIZER,
ElasticSearchJsonBodyEventSerializer.class.getName());
Context sinkContext = new Context(paramters);
sink.configure(sinkContext);
sink.setChannel(channel);
sink.start();
channel.start();
}
}