【openGL2021版】天空盒

考研c语言编程

  返回  

SparkStreaming消费kafka中的数据

2021/8/21 23:20:27 浏览:

一.消费的是某个主题中全部数据

1.在linux中开启kafka集群进行topic创建

kafka目录下:
nohup bin/kafka-server-start.sh config/server.properties 2>&1 &

kafka的bin目录下:
创建主题ningxw  分区数位3  副本因子为2
./kafka-topics.sh --zookeeper node-01:2181,node-02:2181,node-03:2181 --create  --topic nignxw --partitions 3  --replication-factor 2

2.向ningxw主题中添加数据,这里是向每个分区添加100数据

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/*
向topic中每个分区导入数据
*/
public class OrderProducer {
public static void main(String[] args) {
    //连接kafka所需配置文件
    Properties props = new Properties();
    props.put("bootstrap.servers", "node-01:9092,node-02:9092,node-03:9092");
    //ack机制
    /*
    0:生产者生产数据,不管leader是否保存成功,不管follower是否同步成功,继续发送下一条数据
    1:生产者生产数据,只要leader保存成功,不管follower是否同步成功,继续发送下一条数据
    -1:生产者生产数据,leader要保存成功,follower也要同步成功,继续发送下一条数据
     */
    //同步模式和异步模式
    /*
    同步模式是生产一条数据发送一条数据
    异步模式是生产一部分数,发送一部分数据,(例如一次性发送500条数据到broker中,0-499条数据先放到producer中的缓冲区里,达到500条数据再进行数据发送)
     */
    props.put("acks", "all"); //相当于-1,最安全。
    //连接集群重试几次
    props.put("retries", 0);
    //多大批次发送一次
    props.put("batch.size", 16384);
    //延迟1毫秒发送
    props.put("linger.ms", 1);
    //缓冲区大小
    props.put("buffer.memory", 33554432);
    //value序列化
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    //value反序列化
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");


    //创建生产者
    KafkaProducer<String,String> kafkaProducer = new KafkaProducer<String,String>(props);
    //生产数据
    for (int i=0;i<100;i++){
        //只指定了主题和value
        //这里要是设置往那个分区中添加数据,必须要加一个key参数例如这里的 hello
        //向1分区中添加数据
        //kafkaProducer.send(new ProducerRecord<String, String>("ningxw",1,"hello","这是第"+i+"条数据"));
        //向2分区中添加数据
        //kafkaProducer.send(new ProducerRecord<String, String>("ningxw",2,"hello","这是第"+i+"条数据"));
        //向0分区中添加数据
        kafkaProducer.send(new ProducerRecord<String, String>("ningxw",0,"hello","这是第"+i+"条数据"));
    }
    //关闭kafkaProducer
    kafkaProducer.close();
   }
}

3.按照偏移量去消费主题中每个分区中的数据

import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.TopicPartition
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.dstream.{DStream, InputDStream}
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Seconds, StreamingContext}

/*
kafka处理流动数据
spark对数据进行逻辑上的操作
按照分区中指定偏移量进行消费数据
*/
object Kafka_Offset_Demo2 {
//创建程序入口

val conf: SparkConf = new SparkConf().setAppName("Kafka_Offset_Demo2").setMaster("local[*]")
val sc = new SparkContext(conf)
val ssc = new StreamingContext(sc,Seconds(5))

//设置日志级别
sc.setLogLevel("WARN")

//连接kafka所需配置文件
val kafkaParams = Map[String, Object](
//连接kafka集群
"bootstrap.servers" -> "node-01:9092,node-02:9092,node-03:9092",
//key的反序列化
"key.deserializer" -> classOf[StringDeserializer],
//value的反序列化
"value.deserializer" -> classOf[StringDeserializer],
//消费者组id,怎么来的
"group.id" -> "use_a_separate_group_id_for_each_stream",
//从最新的数据开始消费
"auto.offset.reset" -> "latest",
//是否自动提交偏移量,手动提交
"enable.auto.commit" -> (false: java.lang.Boolean)
)

//消费者所要消费的主题,这里的主题是重新在linux创建的
val topics = Array("hadoop")
//指定消费主题下面哪个分区,从哪开始消费
val offsets = Map[TopicPartition, Long](
new TopicPartition("hadoop", 0) -> 11,
new TopicPartition("hadoop", 1) -> 22,
new TopicPartition("hadoop", 2) -> 66
)

//连接kafka
val data: InputDStream[ConsumerRecord[String, String]] = 
KafkaUtils.createDirectStream(
ssc,
LocationStrategies.PreferConsistent,
ConsumerStrategies.Subscribe[String, String](topics, kafkaParams, offsets))

//import org.apache.spark.streaming.dstream.{DStream, InputDStream} 导入这个包
//获取value值
val dataDStream: DStream[String] = data.map(_.value())
 

//打印输出,dataDStream默认打印10,这里要传入想要打印的行数
dataDStream.print(300)

//开启sparkStreaming
ssc.start()

//让其一直开启,等待关闭
ssc.awaitTermination()

}

4.数据消费情况
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号