此处是单节点生产数据到文件a.txt中,由flume采集上传到kafka集群,然后由kafka集群开启一个消费者,消费数据
- flume配置文件
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /root/CTData/a.txt
a1.sources.r1.shell = /bin/bash -c
# Describe the sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.brokerList = node3:9092,node1:9092,node2:9092
a1.sinks.k1.topic = first
a1.sinks.k1.batchSize = 10
a1.sinks.k1.requiredAcks =1
a1.sinks.k1.kafka.producer.linger.ms = 1
# Describe the channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
注意,我使用的是flume1.6版本的,最新版的不是这样配置的,此处很重要,不然kafka消费者是接收不到数据。最新版的配置名如下
- 配置好flume之后,开启kafka集群,然后开启一个消费者,用于检测集群是否连通
- 开启flume,将flume监控某个文件
- 启动生产数据的程序,不断往文件中写入数据,此时可以看到kafka消费端会打出数据,
- 如果未打出数据,请看日志文件找错
编写kafka的javaApi进行消费数据,将数据写入一个文件中,为后期写入hbase做准备
kafka的Api消费客户端
PS:其实api客户端和命令行客户端都是相似的,都是启动一个进程,然后进行从topic中拉数据,只不过自己编写的消费者可以对数据在一次处理。
数据写入文件之后,还是一行一行的很整齐。哈哈
package CT;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
public class Consumer {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter(new File("/root/a.txt"),true);
Properties props = new Properties();
// 定义kakfa 服务的地址,不需要将所有broker指定上
props.put("bootstrap.servers", "node1:9092");
// 制定consumer group
props.put("group.id", "test");
// 是否自动确认offset,自动更新offset,读取数据处理完后,要更新offset,方便下次读取
props.put("enable.auto.commit", "true");
// 自动确认offset的时间间隔
props.put("auto.commit.interval.ms", "1000");
// key的反序列化类
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// value的反序列化类
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// 定义消费者对象
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
// 指定消费者的消费的topic 可以同时订阅多个
consumer.subscribe(Arrays.asList("first"));
while (true) {
// 读取数据,读取超时时间为100ms
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
{
// System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
String value = record.value()+"\n";
fw.append(value);
fw.flush();
}
}
}
}