Hadoop集群案例--电信客服项目②:flume采集数据到kafka

此处是单节点生产数据到文件a.txt中,由flume采集上传到kafka集群,然后由kafka集群开启一个消费者,消费数据

  1. 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消费者是接收不到数据。最新版的配置名如下

在这里插入图片描述

  1. 配置好flume之后,开启kafka集群,然后开启一个消费者,用于检测集群是否连通
  2. 开启flume,将flume监控某个文件
  3. 启动生产数据的程序,不断往文件中写入数据,此时可以看到kafka消费端会打出数据,
  4. 如果未打出数据,请看日志文件找错

编写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();
            }
            	
        }
        
    }
}

猜你喜欢

转载自blog.csdn.net/xydxsl/article/details/89380047