**
kafka集成到flink
**
一、kafka下载安装和配置
1.1.下载,注意scala的版本,目前通用的是2.11,2.12与2.11不兼容
http://mirror.bit.edu.cn/apache/kafka/2.4.0/kafka_2.11-2.4.0.tgz
1.2.解压到你所需要的目录,例如需要放到/soft目录下
tar -xvf kafka_2.11-2.4.0.tgz -C /soft
1.3.启动zookeeper,由于这个kafka二进制包已经自带zookeeper,端口默认是2181,可以修改,直接启动
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
1.4.配置kafka,
broker.id=1 //这个id在kafka集群中是唯一的,若kafka是单机版,这个id可以是随意的正整数
log.dir=/data/kafka/logs-1 //这个是日志目录,自己指定(需要有读写权限的目录)
1.5.启动kafka,有两种,
启动命令:bin/kafka-server-start.sh config/server.properties ,kafka默认端口9092。
后台启动:bin/kafka-server-start.sh -daemon config/server.properties
二、使用kafka
2.1 创建topic,副本因子和分区可以根据集群规模和保存策略来指定,单机版用1
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
2.2 查看topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
2.3 启动生产者,一种是直接启动,然后在程序中输入信息,第二种是直接一次发送一条消息,然后结束
2.3.1 bin/kafka-topics.sh --list --zookeeper localhost:2181
2.3.2 向test发送一条包含key的消息:echo ‘00000,{“name”:“Steve”, “title”:“Captain America”}’ | kafka-console-producer.sh --broker-list localhost:9092 --topic test --property parse.key=true --property key.separator=,
向test发送一条消息: echo “The first record” | kafka-console-producer.sh --broker-list localhost:9092 --topic test
2.4启动消费者,设置消息消费位置,默认最新offset,若是加上–from-beginning,则从最早开始消费
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
将消息的key也输出
kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning --property print.key=true --property key.separator=,
参见:https://www.cnblogs.com/shengulong/p/9013282.html
三、flink生产者
1.启动zk,kafka
2.idea代码如下,运行
public static void main(String[] args) throws Exception{
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource text = env.addSource(new MyNoParalleSource()).setParallelism(1);
Properties properties = new Properties();
properties.setProperty(“bootstrap.servers”, “192.168.1.221:9092”);
//new FlinkKafkaProducer(“topn”,new KeyedSerializationSchemaWrapper(new SimpleStringSchema()),properties,FlinkKafkaProducer.Semantic.EXACTLY_ONCE);
FlinkKafkaProducer011 producer = new FlinkKafkaProducer011(“test”,new SimpleStringSchema(),properties);
text.addSink(producer);
env.execute();
}
public class MyNoParalleSource implements SourceFunction {//1
//private long count = 1L;
private boolean isRunning = true;
/**
* 主要的方法
* 启动一个source
* 大部分情况下,都需要在这个run方法中实现一个循环,这样就可以循环产生数据了
*
* @param ctx
* @throws Exception
*/
@Override
public void run(SourceContext<String> ctx) throws Exception {
while(isRunning){
//图书的排行榜
List<String> books = new ArrayList<>();
books.add("Pyhton从入门到放弃");//10
books.add("Java从入门到放弃");//8
books.add("Php从入门到放弃");//5
books.add("C++从入门到放弃");//3
books.add("Scala从入门到放弃");//0-4
int i = new Random().nextInt(5);
ctx.collect(books.get(i));
//每2秒产生一条数据
Thread.sleep(2000);
}
}
//取消一个cancel的时候会调用的方法
@Override
public void cancel() {
isRunning = false;
}
}
报错:Caused by: org.apache.flink.streaming.connectors.kafka.FlinkKafka011Exception: Failed to send data to Kafka: Expiring 2 record(s) for test-0: 30029 ms has passed since batch creation plus linger time
解决1:修改 config 下配置文件server.properties
配置本机ip
listeners=PLAINTEXT://192.168.174.128:9092
执行命令时
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
将localhost 换成ip 192.168.174.128
解决2: 在config 下配置文件server.properties增加host.name=本机id(如192.168.1.221),执行消费者命令时localhost改为192.168.1.221