spark2.2.0 kafka 0.10.2.1的createDirectStream第一次尝试

1、这里简单记录一下 kafka的简单操作命令

     创建Topic
     $ bin/kafka-topics.sh --create --topic make2 --zookeeper make.spark.com:2181/kafka_10 --replication-factor 3 --partitions 3 --config max.message.bytes=12800000 --config flush.messages=1 --config segment.bytes=10240--partitions 5 --replication-factor 3 

     查看当前kafka集群中Topic的情况
     $ bin/kafka-topics.sh --zookeeper make.spark.com:2181/kafka_10 --list

     查看Topic的详细信息
     $ bin/kafka-topics.sh --zookeeper make.spark.com:2181/kafka_10 --describe --topic make2

     修改Topic信息
    $ bin/kafka-topics.sh --zookeeper make.spark.com:2181/kafka_10 --alter --topic make1 --config max.message.bytes=128000
     $ bin/kafka-topics.sh --zookeeper make.spark.com:2181/kafka_10 --alter --topic make1 --delete-config max.message.bytes
     $ bin/kafka-topics.sh --zookeeper make.spark.com:2181/kafka_10 --alter --topic make1 --partitions 10 
    $ bin/kafka-topics.sh --zookeeper make.spark.com:2181/kafka_10 --alter --topic make1 --partitions 3 ## 分区数量只允许增加,不允许减少

     删除Topic(简单的删除,只是标记删除)
    $bin/kafka-topics.sh --delete --topic make1 --zookeeper make.spark.com:2181/kafka_10
    ## Note: This will have no impact if delete.topic.enable is not set to true.## 默认情况下,删除是标记删除,没有实际删除这个Topic;如果运行删除Topic,两种方式:
方式一:通过delete命令删除后,手动将本地磁盘以及zk上的相关topic的信息删除即可  ls /kafka/brokers/topics
方式二:配置server.properties文件,给定参数delete.topic.enable=true,表示允许进行Topic的删除
注意:一般来说,topic创建了之后就不要随意的删除和修改信息

测试Kafka集群的消息传递功能
1. 启动服务
2. 启动数据生产者
$ bin/kafka-console-producer.sh --broker-list make.spark.com:9092,make.spark.com:9093,make.spark.com:9094 --topic make1
3. 启动数据消费者
$ bin/kafka-console-consumer.sh --topic make1 --zookeeper make.spark.com:2181/kafka_10

## 不接收consumer启动前kafka中的数据
$ bin/kafka-console-consumer.sh --topic make1--zookeeper make.spark.com:2181/kafka_10

## 从头开始接收kafka的数据(全部都接收)
$ bin/kafka-console-consumer.sh --topic make1--zookeeper make.spark.com:2181/kafka_10 --from-beginning 

 

2、这里为我创建createDirectStream的具体代码和测试

首先我们创建一个object -> PropertiesUtil_ka_str  放在我们的工具类下面 代码如下

package Utils

import java.util.Properties

/**
  * Properties的工具类
  *
  * Created by make on 2018-08-07 23:30
  */
object PropertiesUtil_ka_str {

  /**
    *
    * 获取配置文件Properties对象
    *
    * @author make 
    * @return java.util.Properties
    */
  def getProperties() :Properties = {
    val properties = new Properties()
    //读取源码中resource文件夹下的ka_str.properties配置文件
    val reader = getClass.getResourceAsStream("/ka_str.properties")
    properties.load(reader)
    properties
  }

  /**
    *
    * 获取配置文件中key对应的字符串值
    *
    * @author make 
    * @return java.util.Properties
    */
  def getPropString(key : String) : String = {
    getProperties().getProperty(key)
  }

  /**
    *
    * 获取配置文件中key对应的整数值
    *
    * @author make 
    * @return java.util.Properties
    */
  def getPropInt(key : String) : Int = {
    getProperties().getProperty(key).toInt
  }

  /**
    *
    * 获取配置文件中key对应的布尔值
    *
    * @author make 
    * @return java.util.Properties
    */
  def getPropBoolean(key : String) : Boolean = {
    getProperties().getProperty(key).toBoolean
  }

}

我们的配置文件ka_str.properties如下

# kafka configs
kafka.bootstrap.servers=make.spark.com:9092,make.spark.com:9093,make.spark.com:9094
kafka.topic.source=kafka_stream_01
#kafka.topic.sink=spark-sink-test
kafka.group.id=kafka_stream

然后为我们的 kafka_stream.scala的代码 如下

package spark_stream

import Utils.{PropertiesUtil, PropertiesUtil_ka_str, SparkUtil}
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.dstream.{DStream, InputDStream}
import org.apache.spark.streaming.kafka010.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}

import org.apache.spark.streaming.kafka010.ConsumerStrategies._
import org.apache.spark.streaming.kafka010.LocationStrategies._

object kafka_stream {
  def main(args: Array[String]): Unit = {
    val sc =SparkUtil.createSparkContext(true,"kafka_stream")

    val ssc = new StreamingContext(sc,Seconds(5))


    //设置相关参数

   val  topics: String = PropertiesUtil_ka_str.getPropString("kafka.topic.source")
   val brokers = PropertiesUtil_ka_str.getPropString("kafka.bootstrap.servers")

    //具体写法参照 http://spark.apache.org/docs/2.2.0/streaming-kafka-0-10-integration.html
    val topicarr = topics.split(",")
    val kafkaParams: Map[String, Object] = Map[String,Object](
      "bootstrap.servers" -> brokers,
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "group.id" -> PropertiesUtil.getPropString("kafka.group.id"),
      "auto.offset.reset" -> "latest",
      "enable.auto.commit" -> (false: java.lang.Boolean)
    )
    
    val kafka_streamDStream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream(
      ssc,
      PreferConsistent,
      //Subscribe的构造函数为三个参数,但是可以省略offsets 源码可以看到
      Subscribe[String,String](topicarr,kafkaParams))
    //最后的格式为((offset,partition,value),1),这样的数据类型 
    // 可以看到每条数据的偏移量和所在的分区
    val resDStream: DStream[((Long, Int, String), Int)] = kafka_streamDStream.map(line =>
      (line.offset(), line.partition(), line.value())).flatMap(t =>{
        t._3.split(" ").map(word => (t._1,t._2,word))
    })
      .map(k => ((k._1,k._2,k._3),1))
      .reduceByKey(_ + _)

    resDStream.print()

    ssc.start()
    ssc.awaitTermination()

  }


}

3、我们在kafka 上创建一个和我们配置文件相同的 topic 以及对应的 生产者   如下

bin/kafka-topics.sh --create --topic kafka_stream_01 --zookeeper make.spark.com:2181/kafka_10 --replication-factor 2 --partitions 3

bin/kafka-console-producer.sh --broker-list make.spark.com:9092,make.spark.com:9093,make.spark.com:9094 --topic kafka_stream_01

 

然后启动我们的程序,可以看到我们的,实时处理的数据结果,达到了我们要求,可以看到偏移量,以及所在的分区

spark2.2.0 kafka 0.10.2.1的createDirectStream第一次尝试_第1张图片

以上,初识kafka

你可能感兴趣的:(kafka,spark)