Kafka->Mongodb->Es

该博客介绍了如何将180万条TXT文档数据从Kafka推送到MongoDB,然后进一步将MongoDB中的数据推送到Elasticsearch。首先,创建了MongoDB的mydb数据库和netflows集合,接着在Kafka创建flume1主题,最后在ES创建myindex索引。文中包含具体的操作步骤和代码实现。
摘要由CSDN通过智能技术生成

实现了将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 
可以使用 Docker Compose 部署 Kafka、Elasticsearch、Redis、MySQL 和 MongoDB,并实现持久化。以下是一个示例的 Docker Compose 配置文件: ```yaml version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:6.2.0 container_name: zookeeper ports: - 2181:2181 volumes: - zookeeper-data:/var/lib/zookeeper/data - zookeeper-logs:/var/lib/zookeeper/logs kafka: image: confluentinc/cp-kafka:6.2.0 container_name: kafka depends_on: - zookeeper ports: - 9092:9092 environment: - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 volumes: - kafka-data:/var/lib/kafka/data elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0 container_name: elasticsearch ports: - 9200:9200 volumes: - esdata:/usr/share/elasticsearch/data environment: - discovery.type=single-node redis: image: redis:6.2.5 container_name: redis ports: - 6379:6379 volumes: - redis-data:/data mysql: image: mysql:8.0.26 container_name: mysql ports: - 3306:3306 volumes: - mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=your_root_password mongo: image: mongo:5.0.2 container_name: mongo ports: - 27017:27017 volumes: - mongo-data:/data/db volumes: zookeeper-data: driver: local zookeeper-logs: driver: local kafka-data: driver: local esdata: driver: local redis-data: driver: local mysql-data: driver: local mongo-data: driver: local ``` 这个示例配置文件中包含了 ZooKeeper、Kafka、Elasticsearch、Redis、MySQL 和 MongoDB 的部署配置。通过挂载相应的卷,实现了持久化。 使用以下命令启动所有的服务: ```shell docker-compose up -d ``` 这将启动所有的容器,并将它们分别绑定到主机的相应端口。你可以根据需要修改端口映射。 请注意,这只是一个简单的示例配置文件,你可以根据自己的需求进行修改和扩展。同时,还可以根据需要配置其他 Kafka、Elasticsearch、Redis、MySQL 和 MongoDB 相关的环境变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值