文章目录
为什么要使用Flume对接Kafka
生产环境中通常将数据写入日志文件中,这样更多的使用Flume
但是,当有多个业务线需要使用数据时Flume,需要多个内存(多个sink)而且并不支持动态增加业务线
而Kafka支持多条业务线使用,并且支持动态增加
1、 编写Flume的conf文件
# name
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# sink 使用KafkaSink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers = hadoop1:9092
a1.sinks.k1.kafka.topic = first //这里写的topic与接下来开启的kafka消费者要一致
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
2、启动kafka消费者
kafka-console-consumer.sh --bootstrap-server hadoop1:9092 --topic first --from-beginning
3、启动Flume
flume-ng agent -c /opt/flume1.6/conf/ -f /opt/flume1.6/conf/job/flume-kafka.conf -n a1
4、登录监控端口
telnet localhost 44444
5、测试是否成功
输入flume_kafka
Flume对接Kafka–数据分类
1、实现数据分类 编写flume拦截器
package my.test;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author WGY
* 拦截器
* Flume对接Kafka实现数据分类
*/
public class Flume_Kafka_Intercrptor implements Interceptor{
//声明一个存放时间的集合
private List<Event> addHeaderEvents;
@Override
public void initialize() {
//初始化
addHeaderEvents = new ArrayList<>();
}
//对单个事件处理
@Override
public Event intercept(Event event) {
//获取事件中的头信息
Map<String, String> headers = event.getHeaders();
//获取事件中的body信息
String body = new String(event.getBody());
//根据body中是否含有“hello”来决定添加怎样的头信息
if (body.contains("hello")) {
//添加头信息 这里将type改为topic
headers.put("topic", "first");
} else {
//添加头信息
headers.put("topic", "first1");
}
return null;
}
//对批量事件处理
@Override
public List<Event> intercept(List<Event> list) {
//1、清空集合
addHeaderEvents.clear();
//2、遍历list,
for (Event event : list) {
//3、给每一个事件添加头信息
addHeaderEvents.add(intercept(event));
}
//返回结果
return addHeaderEvents;
}
@Override
public void close() {
}
public static class Builder implements Interceptor.Builder {
@Override
public Interceptor build() {
return new my.test.Myinterceptor();
}
@Override
public void configure(Context context) {
}
}
}
2、打包上传
先删除 再上传
[root@hadoop1 job]# cd /opt/flume1.6/lib/
[root@hadoop1 lib]# rm -rf flume-1.0-SNAPSHOT.jar
3、启动
启动flume
启动kafka消费者first与first1
启动端口44444测试即可