spark学习代码笔记和问题解决03:spark streaming

 

 

Spark Streaming重点知识

//************* Spark Streaming是什么
1、SPark Streaming是Spark中一个组件,基于Spark Core进行构建,用于对流式进行处理,类似于Storm。
2、Spark Streaming能够和Spark Core、Spark SQL来进行混合编程。
3、Spark Streaming我们主要关注:
      1、Spark Streaming 能接受什么数据? kafka、flume、HDFS、Twitter等。
      2、Spark Streaming 能怎么处理数据? 无状态的转换(前面处理的数据和后面处理的数据没啥关系)、有转换转换(前面处理的数据和后面处理的数据是有关系的,比如叠加关系)

//************* Spark Streaming是怎么实现的
1、Spark Streaming 采用“微批次”架构。
2、对于整个流式计算来说,数据流你可以想象成水流,微批次架构的意思就是将水流按照用户设定的时间间隔分割为多个水流段。一个段的水会在Spark中转换成为一个RDD,所以对水流的操作也就是对这些分割后的RDD进行单独的操作。每一个RDD的操作都可以认为是一个小的批处理(也就是离线处理)。

//************* Spark Streaming DStream是啥
1、DStream是类似于RDD和DataFrame的针对流式计算的抽象类。在源码中DStream是通过HashMap来保存他所管理的数据流的。K是RDD中数据流的时间,V是包含数据流的RDD。
2、对于DStream的操作也就是对于DStream他所包含的所有以时间序列排序的RDD的操作。

//************* Spark Streaming 怎么用
1、通过StreamingContext来进入Spark Streaming。可以通过已经创建好的SparkContext来创建SparkStreaming。

 

nc -lk 9999

2、自定义Receiver
    1、你需要新建一个Class去继承Receiver,并给Receiver传入一个类型参数,该类型参数是你需要接收的数据的类型。
    2、你需要去复写Receiver的方法: onStart方法(在Receiver启动的时候调用的方法)、onStop方法(在Receiver正常停止的情况下调用的方法)
    3、你可以在程序中通过streamingContext.receiverStream( new CustomeReceiver)来调用你定制化的Receiver。

 



import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.receiver.Receiver

import java.io.{BufferedReader, InputStreamReader}
import java.net.Socket
import java.nio.charset.StandardCharsets


class CustomerReceiver(host:String,post:Int) extends Receiver[String](StorageLevel.MEMORY_AND_DISK){
  override def onStart(): Unit = {
    new Thread("customerThread"){
      override def run():Unit = {receive()}
    }.start()
  }

  def receive(): Unit = {
    var socket = new Socket(host,post)

    val reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),StandardCharsets.UTF_8))

    var lines = reader.readLine()

    while(!isStopped()&&lines!=null){
      store(lines)
      lines = reader.readLine()
    }

    reader.close()
    socket.close()


  }


  override def onStop(): Unit = {

  }
}


import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

object CustomerRec {
  def main(args:Array[String]): Unit ={
    val conf = new SparkConf().setMaster("local[4]").setAppName("NetworkWordCount")
    val ssc = new StreamingContext(conf,Seconds(1))
    val lines = ssc.receiverStream(new CustomerReceiver("HA3VM01",9999))

    val words = lines.flatMap(_.split(" "))
    val pairs = words.map(word => (word,1))
    val wordCount = pairs.reduceByKey(_ + _)
    wordCount.print()
    ssc.start()
    ssc.awaitTermination()
  }
}

RDD数据源

 1、你可以通过StreamingContext.queueStream(rddQueue)这个方法来监控一个RDD的队列,所有加入到这个RDD队列中的新的RDD,都会被Streaming去处理。



import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

object StreamingWordCount extends App{
  val sparkConf = new SparkConf().setAppName("StreamingWordCount").setMaster("local[4]")

  val ssc = new StreamingContext(sparkConf,Seconds(1))

  val lines = ssc.socketTextStream("HA3VM01",9999)

  val words = lines.flatMap(_.split(" "))

  val pairs = words.map((_,1))

  val result = pairs.reduceByKey(_+_)

  result.print()

  ssc.start()

  ssc.awaitTermination()


}

与kafka

三台机器启动kafka

bin/kafka-server-start.sh config/server.properties

创建话题

bin/kafka-topics.sh --create --zookeeper ha3vm01:2181,ha3vm02:2181,ha3vm03:2181 --replication-factor 2 --partitions 2 --topic source

bin/kafka-topics.sh --create --zookeeper ha3vm01:2181,ha3vm02:2181,ha3vm03:2181 --replication-factor 2 --partitions 2 --topic target

bin/kafka-console-consumer.sh --zookeeper ha3vm01:2181,ha3vm02:2181,ha3vm03:2181 --from-beginning --topic source

bin/kafka-console-producer.sh --broker-list ha3vm01:9092,ha3vm02:9092,ha3vm03:9092 --topic source

bin/kafka-console-consumer.sh --zookeeper ha3vm01:2181,ha3vm02:2181,ha3vm03:2181 --from-beginning --topic target



import org.apache.commons.pool2.impl.{GenericObjectPool, GenericObjectPoolConfig}
import org.apache.kafka.clients.producer.KafkaProducer
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import shaded.parquet.org.codehaus.jackson.map.deser.std.StringDeserializer
object createKafkaProducerPool{
  def apply(brokerList:String,topic:String): GenericObjectPool[KafkaProducerProxy] ={
    val producerFactory = new BaseKafkaProducerFactory(brokerList,defaultTopic = Option(topic))
    val poolProducerFactory = new PooledKafkaProducerAppFactory(producerFactory)
    val poolConfig = {
      val c = new GenericObjectPoolConfig
      val maxNumProducers = 10
      c.setMaxTotal(maxNumProducers)
      c.setMaxIdle(maxNumProducers)
    }
    new GenericObjectPool[KafkaProducerProxy](poolProducerFactory,poolConfig)
  }
}

object KafkaStreaming {


  def main(args: Array[String]): Unit ={
    val conf = new SparkConf().setMaster("local[4]").setAppName("NetworkWordCount")
    val ssc = new StreamingContext(conf,Seconds(1))
    val brobrokers = "ha3vm01:9092,ha3vm02:9092,ha3vm03:9092"
    val sourcetopic = "source"
    val targettopic = "target"
    var group = "con-consumer-group"
    val kafkaParam = Map(
      "zookeeper"->brobrokers,
      "key.deserializer"->classOf[StringDeserializer],
      "value.deserializer"->classOf[StringDeserializer],
      "group.id"->group,
      "auto.offset.reset"->"latest",
      "enable.auto.commit"->(false:java.lang.Boolean)


    )

    var stream = KafkaUtils.createDirectStream[String,String](ssc,LocationStrategies.PreferConsistent,ConsumerStrategies.Subscribe[String,String](Array(sourcetopic),kafkaParam))
    stream.map(s => ("id:" + s.key(),">>>>:" + s.value())).foreachRDD(rdd=>{
      rdd.foreachPartition(partitionOfRecords=>{
        val pool = createKafkaProducerPool(brobrokers,targettopic)
        val p = pool.borrowObject()
        partitionOfRecords.foreach{message=>System.out.println(message._2):p.send(message._2,Option(targettopic))}
        pool.returnObject(p)
      })
    })
    ssc.start()
    ssc.awaitTermination()
  }

}

这个教学视频中没有给出完整的画面,看不到全部代码



import org.apache.commons.pool2.{BasePooledObjectFactory, PooledObject}
import org.apache.commons.pool2.impl.DefaultPooledObject
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}

import java.util.Properties

case class KafkaProducerProxy(brokerList:String,config:Properties = new Properties(),defaultTopic:Option[String] = None,producer:Option[KafkaProducer[String,String]]){
  type Key = String
  type Val = String
  require(brokerList == null || !brokerList.isEmpty,"Must set broker list")
  private val p = producer getOrElse {
    var props: Properties = new Properties();
    props.put("zookeeper", brokerList);
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    new KafkaProducer[String, String](props)
  }

  private def toMessage(value:Val,key:Option[Key] = None,topic:Option[String] = None): ProducerRecord[Key,] ={

  }

  def send(key:Key,value:Val,topic:Option[String] = None): Unit ={
    p.send(toMessage(value,Option(key),topic))
  }

  def send(value:Val,topic:Option[String] = None): Unit ={
    send(null,value,topic)
  }

  def send(value:Val,topic:Option[String] = None): Unit ={
    send(null,value,topic)
  }

  def shutdown(): Unit = p.close()

}

abstract class KafkaProducerFactory(brokerList:String,config:Properties = new Properties(),defaultTopic:Option[String] = None)
class BaseKafkaProducerFactory(brokerList:String,config:Properties = new Properties(),defaultTopic:Option[String] = None) extends KafkaProducerFactory(brokerList,config,defaultTopic){
  override def newInstance() = new KafkaProducerProxy(brokerList,config,defaultTopic)
}
class PooledKafkaProducerAppFactory(val factory: KafkaProducerFactory) extends BasePooledObjectFactory[KafkaProducerProxy] with Serializable {
  override def create(): KafkaProducerProxy = factory.newInstance()
  override def wrap(obj:KafkaProducerProxy): PooledObject[KafkaProducerProxy] = new  DefaultPooledObject(obj)

  override def destroyObject(p: PooledObject[KafkaProducerProxy]): Unit = {
    p.getObject.shutdown()
    super.destroyObject(p)
  }
}

无状态转换,

有状态转换,

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kafka和Spark Streaming大数据领域中非常重要的技术,它们可以协同工作,实现实时数据处理和分析。Kafka是一个分布式的消息队列系统,可以高效地处理海量数据流,而Spark Streaming则是一个基于Spark的流处理框架,可以实现实时数据处理和分析。在学习Kafka和Spark Streaming时,需要掌握它们的基本概念、原理和使用方法,以及如何将它们结合起来实现实时数据处理和分析。同时,还需要了解Kafka和Spark Streaming的优缺点,以及如何优化它们的性能和可靠性。 ### 回答2: Kafka是一个高性能,可扩展的分布式消息系统。它通过将消息划分成一个或多个主题,然后将这些主题划分成一个或多个分区来进行实现。Kafka是由LinkedIn开发的,由Apache基金会进行管理。它的主要设计目标是支持分布式处理,如流处理和批处理等。Kafka通过使用Zookeeper来进行节点管理和故障转移,能够快速处理海量的数据。Kafka采用发布/订阅模式,支持多个消费者订阅同一个主题,每个消费者可以读取主题的所有分区数据,也可以选择读取其中的某个分区。 Spark Streaming是一个流处理框架,它能够利用Spark的分布式处理能力来对实时数据进行处理。Spark Streaming采用微批处理的方式,将实时数据流切片成一段一段的,并通过并行处理的方式进行计算。Spark Streaming的数据源可以是Kafka、Flume或者TCP sockets等。与Kafka相比,Spark Streaming更适合于需要进行实时计算的场景,例如:实时日志分析、实时推荐、实时风控等。同时,Spark Streaming还能够与Spark的批处理进行无缝对接,实现流处理与批处理的统一计算引擎。Spark Streaming支持机器学习、图计算等高级计算库,能够为用户提供更强大的计算能力。 学习Kafka和Spark Streaming的过程中,需要掌握Java、Scala等编程语言基础知识,并具备分布式系统的相关知识。对于Kafka,需要了解其基本概念、架构、API等,理解消息系统、发布/订阅模式、分区等内容。对于Spark Streaming,需要掌握其基本概念、流式计算流程、数据源等,同时也要熟悉Spark的RDD、DataFrame等相关知识。在学习中,需要结合实际项目,进行代码实践和调试,同时不断学习、思考和总结,以加深对Kafka和Spark Streaming的理解和应用。 ### 回答3: Kafka是由Apache SoftWare Foundation开发的一种分布式发布/订阅消息系统。其主要目的是为数据传输提供一种高吞吐量、低延迟的解决方案。Kafka提供了一种可靠的、持久化的、实时的数据传输方式,适用于众多的场景,如:日志收集、数据传输、消息系统等。 Kafka的特点: 1、高吞吐量:Kafka可以支持非常高的数据传输吞吐量,同时保持低延迟和高稳定性。 2、可扩展性:Kafka可以轻松扩展以适应更大的数据需求,并可以在运行时添加新的主题分区。 3、持久化:Kafka保证数据能够可靠地在分布式集群中传输,同时保证数据不会丢失或者被意外删除。 4、多样化的客户端:Kafka提供了多种语言的客户端接口,以满足不同的开发需求。 SparkStreaming 是由Apache Spark社区发展的一个实时数据处理框架。它用于将实时数据流分成小批处理,可以跨越不同的时间窗口进行计算。Spark Streaming提供了与Spark非常相似的编程模型,同时支持不同的输入源,包括社交媒体、传感器、消息队列等。 SparkStreaming的特点: 1、处理速度快:它可以支持毫秒级别的处理速度,并且可以在分布式系统中实现高吞吐量。 2、支持多种数据源:Spark Streaming可以从多种类型的数据源中读取数据,如HDFS、Flume、Kafka等。 3、编程简单:Spark Streaming提供了与Spark相似的编程模式,使得开发人员可以将Spark StreamingSpark整合在一起进行处理。 4、高容错性:Spark Streaming在分布式环境中实现了高可靠性和容错性,使得它可以支持大规模的实时数据处理需求。 总之,Kafka和Spark Streaming这两个工具是在大数据处理领域中非常重要的工具。它们可以很好地相互结合,支持大规模的实时数据处理和分析,进而为企业提供更好更快的数据处理方案。如果你对这两个技术感兴趣,可以从官方文档和教程开始学习,逐步掌握它们的定义、特点、应用场景和基本使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值