SparkStreaming消费Kafka消息的简单示例

Kafka是基于发布/订阅的消息系统,是一个分布式流平台。支持多个生产者和多个消费者,作为消息中间件,Kafka解耦了生产者和消费者,彼此透明,不需要在他们之间建立任何直接的连接,数据从生产者流入Kafka再从Kafka流入消费者。Spark Streaming是Spark核心API的一个扩展,提供高性能高容错性的流数据处理能力。

SparkStreaming消费Kafka消息的简单示例_第1张图片

支持包括Kafka,Flume,HDFS/S3,Kinesis,Twitter,TCPSockets等作为数据源。数据经过处理后可以存入HDFS,数据库或展示到仪表盘上。SparkStreaming还可以合影包括SparkMLlib,SparkGraphx等Spark等其它组件无缝结合,得益于Spark的各个组件都是基于同样的Spark Core。

下面是一个简单的示例,利用sparkStream处理kafka中的数据。例子中部署的是kafka0.8.x的版本。例子是通过Direct Approach(No Receivers)的方式来融合Spark Streaming和Kafka。没有使用Receiver-Based的方式。后续再整理一下两种融合方式的区别和优劣。Spark融合Kafka0.10与0.8点Direct Approach方式类似。本文主要是记录一个示例,一些细节和理论部分留着以后再整理吧。

一、配置

 JDK1.8
kafka_2.11-0.8.2.0
Spark-2.3.0-bin-hadoop2.7 

二、示例代码

import kafka.serializer.StringDecoder
import org.apache.spark.sql.SparkSession
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
/*
* spark消费kafka例子
*
* 2018/5/13
*/
object SparkKafkaTest {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder().appName("spark_kafka").master("local[*]").getOrCreate()
    val batchDuration = Seconds(5) //时间单位为秒
    val streamContext = new StreamingContext(spark.sparkContext, batchDuration)
    streamContext.checkpoint("/Users/eric/SparkWorkspace/checkpoint")
    val topics = Array("behaviors").toSet
    val kafkaParams = Map[String, String]("metadata.broker.list" -> "localhost:9092")
    val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](streamContext, kafkaParams, topics)
    stream.foreachRDD(rdd => {
      rdd.foreach(line => {
        println("key=" + line._1 + "  value=" + line._2)
      })
    })
    streamContext.start()  //spark stream系统启动
    streamContext.awaitTermination() //
  }
}

三、pom文件


  4.0.0
  com.eric.spark
  spark-learning
  1.0-SNAPSHOT
  2008
  
      2.11.8
      2.3
      2.11
      compile
  

  
    
      scala-tools.org
      Scala-Tools Maven2 Repository
      http://scala-tools.org/repo-releases
    
  

  
    
      scala-tools.org
      Scala-Tools Maven2 Repository
      http://scala-tools.org/repo-releases
    
  

  
    
      log4j
      log4j
      1.2.17
    
    
      org.scala-lang
      scala-library
      ${scala.version}
    
    
    
      org.apache.spark
      spark-core_2.11
      2.3.0
    
    
    
      org.apache.spark
      spark-sql_2.11
      2.3.0
    
    
    
      org.apache.spark
      spark-hive_2.11
      2.3.0
    
    
    
      org.apache.spark
      spark-mllib_2.11
      2.3.0
    
    
    
      org.apache.spark
      spark-streaming-kafka-0-8_2.11
      2.3.0
    

    
      junit
      junit
      4.4
      test
    
    
      org.specs
      specs
      1.2.5
      test
    
  

  
    src/main/scala
    src/test/scala
    
      
        org.scala-tools
        maven-scala-plugin
        
          
            
              compile
              testCompile
            
          
        
        
          ${scala.version}
          
            -target:jvm-1.5
          
        
      
      
        org.apache.maven.plugins
        maven-eclipse-plugin
        
          true
          
            ch.epfl.lamp.sdt.core.scalabuilder
          
          
            ch.epfl.lamp.sdt.core.scalanature
          
          
            org.eclipse.jdt.launching.JRE_CONTAINER
            ch.epfl.lamp.sdt.launching.SCALA_CONTAINER
          
        
      
    
  
  
    
      
        org.scala-tools
        maven-scala-plugin
        
          ${scala.version}
        
      
    
  

四、创建一个topic

SparkStreaming消费Kafka消息的简单示例_第2张图片

五、运行测试代码并向自定义topic输入消息,查看打印结果


SparkStreaming消费Kafka消息的简单示例_第3张图片

对通过kafka-console-producer写入behaviors主题的消息进行简单的打印。

你可能感兴趣的:(分布式)