实现了将Kafka中的数据推送给Mongodb,然后再将Mongodb中的数据推送给Es的过程。数据来源是来自txt文档中的180万条数据。
准备工作:
1)在Mongdb集群上创建一个数据库mydb,并创建一个空的Collection,命名为netflows
@SuppressWarnings("deprecation")
Mongo mongo = new Mongo("10.10.16.251", 10111);
DB db = mongo.getDB("mydb");
//创建Collection,但是不添加数据
db.createCollection("netflows", null);
DBCollection dbColl = db.getCollection("netflows");
2)在kafka的集群上创建一个主题flume1
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic flume1
2)在es集群上创建一个索引myindex,该索引的类型是netflows
IndexResponse res = client.prepareIndex().setIndex("myindex").setType("netflows").execute().actionGet();
下面是代码实现:
1.从文件中读取测试数据,并推动给Kafka
package com.test;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Properties;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
public class Kafka_Producer {
public static void main(String[] args) {
/*
* Properties props = new Properties();
* props.setProperty("metadata.broker.list","10.10.16.253:9092");
* props.setProperty
* ("serializer.class","kafka.serializer.StringEncoder");
* props.put("request.required.acks","-1");
*
* ProducerConfig config = new ProducerConfig(props); Producer<String,
* String> producer = new Producer<String, String>(config);
* KeyedMessage<String, String> data = new KeyedMessage<String,
* String>("flume","test-kafka");
*
* producer.send(data);
*
* producer.close();
*/
MessageSender messageSender = new MessageSender();
FileReader fr;
try {
fr = new FileReader("C:\\TxtData\\NetFlowAttackDDOS\\4test.txt");
BufferedReader br = new BufferedReader(fr);
String line = "";
String[] arrs = null;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
long num = 0;
while ((line = br.readLine()) != null) {
arrs = line.split(",");
date = format.parse(format.format(new Date()));
Calendar cla = Calendar.getInstance();
cla.setTime(date);
cla.add(Calendar.HOUR_OF_DAY,8);
messageSender.sendToKafkaTopic((num+10001) + ","+arrs[3] + " ," + arrs[4] + " ," + arrs[5]+ ","+arrs[6]);
num ++;
}
br.close();
fr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
messageSender.close();
}
}
其中MessageSender中代码如下所示:
package com.test;
import java.util.Properties;
import com.test.utils.ConstanUtil;
import com.test.utils.ObjectFormatUtil;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
public class MessageSender {
private long windowStart = 0;
private long windowCurrent = 0;
private long sendSize = 0;
Producer<String, String> producer = null;
private StringBuilder records = new StringBuilder();
public MessageSender() {
initKafkaProperties();
}
private void