一.消费的是某个主题中全部数据
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.数据消费情况