Kafka Producer


Producer发送模式

1、同步发送
2、异步发送
3、异步回调发送

业务流程

sparksql 并发写入kafka优化 spark发送kafka_kafka

producer的发送大致分为两步,第一步是先构建producer,第二步是send出去

Producer发送原理

sparksql 并发写入kafka优化 spark发送kafka_hadoop_02

kafka的生产者主要做了三个事情,第一个是直接发送,直接发送是指kafka会把producer的消息发送到整个分区leader的broker上,一般不会涉及到其他的干预。还会缓存producer的主节点列表,如果leader出现问题会刷新列表。
第二个是负载均衡,负载均衡器是默认的,会告诉我们两件事,第一是kafka的producer数据可以被控制在哪个partition上,第二个是数据具体在哪个partition上由谁来决定的,这个是由我们的客户端决定的。
第三个是异步发送,异步发送分两件事情,第一个是它本身是future对象,这个future对象可以不获取。第二是做批量发送,会在内存里积累数据,当单次请求发送数据达到一定的预值会按批次的将数据发送到kafka上,这样首先减少了io操作,变相的提高了吞吐量。

代码操做及解释

1、接之前的操作,如果没有之前的操作,就先把app-11、app-12、app-13的ip地址写入hosts文件中。如果写完之后,打开pom文件,将 com.kinginsai.bigdata.kafka.admin. AdminSample修改为com.kinginsai.bigdata.kafka.producer.ProducerSample,其实这里是修改主程序,运行那个class填写那个路径。

sparksql 并发写入kafka优化 spark发送kafka_数据_03


往后的运行操作:

先编译:mvn compile -Dexec.mainClass="com.kinginsai.bigdata.kafka.producer.ProducerSample" 后运行:mvn exec:java -Dexec.mainClass="com.kinginsai.bigdata.kafka.producer.ProducerSample" -Dexec.classpathScope=runtime -Dmaven.test.skip=true

2、Producer异步发送演示。以下运行程序都是先编译后运行,上面都是配置信息。

sparksql 并发写入kafka优化 spark发送kafka_kafka_04


3、检查运行之后是否是我们想象的结果,登录app-11,新建new terminal,以hadoop用户登录,在进入到kafka的目录下

命令:su – hadoopcd /hadoop/Kafka/kafka_2.11-2.2.0/

sparksql 并发写入kafka优化 spark发送kafka_kafka_05

4、查看接受消息

命令:bin/kafka-console-consumer.sh --bootstrap-server app-11:9092 app-12:9092 app-13:9092 --topic songshu-topic --from-beginning

sparksql 并发写入kafka优化 spark发送kafka_kafka_06

5、Producer异步阻塞发送演示,区别在于send有返回值,是future类型,future是发出去就不管了,在get之前都不会获取返回值,但是每次发送都获取一下,就相当于把返回值阻塞在这个位置上了,就是发送一次停一次。随机发送。

sparksql 并发写入kafka优化 spark发送kafka_hadoop_07


运行结果:

sparksql 并发写入kafka优化 spark发送kafka_数据_08

6、Producer异步发送带回调函数,offset是不同的,offset是针对partition的,会有不同的partition有相同的offset,offset是做文件解锁的

sparksql 并发写入kafka优化 spark发送kafka_hadoop_09


运行结果:

sparksql 并发写入kafka优化 spark发送kafka_hadoop_10

一般来讲我们经常用的是Producer异步发送,如果需要做消息记录的用Producer异步发送带回调函数,这个会将值回调,阻塞会阻塞在哪。

7、Producer异步发送带回调函数和Partition负载均衡,自定义的partition。结果的partition是五个0和五个1。

sparksql 并发写入kafka优化 spark发送kafka_kafka_11


sparksql 并发写入kafka优化 spark发送kafka_hadoop_12


运行结果:

sparksql 并发写入kafka优化 spark发送kafka_kafka_13

常见问题

sparksql 并发写入kafka优化 spark发送kafka_hadoop_14

问题解释:不识别app-11、app-12、app-13的ip地址
解决方法:将app-11、app-12、app-13的ip地址写入hosts文件中