Spark的认识(四)

Spark(四) 5、RDD的转换算子 5.1 Value类型 5.1.1 map案例 作用:返回一个新的 RDD,该 RDD 由每一个输入元素经过 func 函数转换后组成 需求:创建一个 1-10 数组的 RDD,将所有元素*2 形成新的 RDD 1)创建 scala> var source = sc.parallelize(1 to 10) ​ source: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[8] at par 阅读详情

Spark的认识(四)

1、本文内容

  • 1、掌握SparkStreaming底层原理

  • 2、掌握Dstream常用操作

  • 3、掌握SparkStreaming整合flume

  • 4、掌握SparkStreaming整合kafka

2、SparkStreaming概述

2.1 什么是sparkStreaming

  • Spark Streaming makes it easy to build scalable fault-tolerant streaming applications.

  • SparkStreaming是可以非常容易的构建一个可扩展、具有容错机制的流式应用程序

2.2 sparkStreaming特性

  • 1、易用性

    • 可以像开发离线批处理一样去编写流式处理程序,还是可以使用java、scala、Python等不同的语言开发

  • 2、容错性

    • sparkStreaming可以实现恰好一次语义(数据被处理且只被处理一次)

    • sparkStreaming可以实现在不需要额外代码的情况下,来实现丢失的job

  • 3、可以融合到spark生态系统

    • sparkstreaming可以和离线批处理和交互式查询相结合

3、sparkStreaming原理

3.1 sparkStreaming计算原理

Spark Streaming 是基于spark的流式批处理引擎,其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流。

3.2 sparkStreaming计算流程

sparkStreaming是以某一个时间间隔的批处理,按照批处理的时间间隔进行划分,划分出了很多个短小的批处理作业,每一个段数据在这里就是一个Dstream,Dstream内部是由当前该批次的数据,内部的数据是通过rdd进行封装,也就是说Dstream中封装了rdd,rdd里面有很多个分区,分区里面才是真正的数据。
​
后期Dstream做大量的transformation操作,最终都转换成了对它内部的rdd也就是对应的transformation。

3.3 sparkStreaming容错性

Dstream中内部封装了rdd,这个时候后期对它做大量操作的时候,如果某个rdd的分区数据丢失了,可以通过rdd的血统进行重新计算恢复得到。
​
通过血统在进行重新计算恢复得到丢失的数据的时候需要一定条件:就是保证数据源端安全性
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
​
恢复数据:  血统+原始的数据进行恢复

3.4 sparkStreaming的实时性

storm是来一条数据就处理一条,实时性比较高
sparkStreamning是以某一时间间隔处理,延迟比较高,实时性比较低
​
后期再处理一些实时的应用的场景,具体使用哪一种框架去实现,一定要结合当前这个业务需求:
比如说 公司领导对实时性要求比较高,从数据生成到看到结果数据需要非常快的时间,这个时候优先考虑storm框架
公司领导对实时性要求不是特别高,从数据生成到看到结果数据可以允许有一定的延迟,这个时候就可以考虑使用sparkStreaming框架。

4、DStream

4.1 什么是Dstream

Discretized Stream是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流。在内部实现上,DStream是一系列连续的RDD来表示。每个RDD含有一段时间间隔内的数据。

4.2 Dstream操作分类

  • 1、transformation(转换)

    • 可以把一个Dstream转换生成一个新的Dstream。它也是延迟加载,不会立即触发任务的运行

    • 类似于rdd的中transformation

  • 2、outputOperation(输出)

    • 它会触发任务的真正运行

    • 类似于rdd的中action

5、Dstream操作实战

  • 引入依赖

            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-streaming_2.11</artifactId>
                <version>2.1.3</version>
            </dependency>

5.1 通过sparkStreaming接受socket数据实现单词统计

  • 1、代码开发

    package demo.socket
    ​
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    ​
    //todo:利用sparkStreaming接受socket数据实现单词统计
    object SparkStreamingSocket {
      def main(args: Array[String]): Unit = {
        //1、创建SparkConf对象
          val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingSocket").setMaster("local[2]")
    ​
        //2、创建SparkContext对象
          val sc = new SparkContext(sparkConf)
          sc.setLogLevel("warn")
    ​
        //3、创建StreamingContext,需要2个 参数,第一个是SparkContext对象,第二个是批处理时间间隔
          val ssc = new StreamingContext(sc,Seconds(5))
    ​
        //4、接受socket数据
           val socketTextStream: ReceiverInputDStream[String] = ssc.socketTextStream("node1",9999)
    ​
        //5、切分每一行获取所有的单词
          val words: DStream[String] = socketTextStream.flatMap(_.split(" "))
    ​
        //6、每个单词计为1
          val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    ​
        //7、相同单词出现的1累加
          val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_+_)
    ​
        //8、打印
          result.print()
    ​
        //9、开启流式计算
          ssc.start()
          ssc.awaitTermination()
      }
    }
    ​

5.2 通过sparkStreaming接受socket数据实现所有批次单词统计的结果累加

  • 1、代码开发

    package demo.socket
    ​
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.{SparkConf, SparkContext}
    ​
    //todo:利用sparkStreaming接受socket数据实现所有批次单词统计结果累加
    object SparkStreamingSocketTotal {
    ​
      //currentValues:表示在当前批次中相同的单词出现的所有的1(hadoop---->List(1,1,1,1))
      //historyValues:表示每一个单词在之前所有批次中出现总次数
    ​
         //Option类型:可以表示可能存在或者不存在的值   存在Some,  不存在None
      def updateFunc(currentValues:Seq[Int],historyValues:Option[Int]):Option[Int] = {
           val newValue: Int = currentValues.sum  +  historyValues.getOrElse(0)
           Some(newValue)
      }
    ​
      def main(args: Array[String]): Unit = {
          //1、创建SparkConf
          val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingSocketTotal").setMaster("local[2]")
    ​
          //2、创建SparkContext
          val sc = new SparkContext(sparkConf)
          sc.setLogLevel("warn")
    ​
         //3、创建StreamingContext
          val ssc = new StreamingContext(sc,Seconds(5))
    ​
           //设置checkpoint目录,主要的作用:用于保存之前批次每一个单词出现的总次数
            ssc.checkpoint("./socket")
    ​
         //4、接受socket数据
          val socketTextStream: ReceiverInputDStream[String] = ssc.socketTextStream("node1",9999)
    ​
        //5、切分每一行获取所有的单词
          val words: DStream[String] = socketTextStream.flatMap(_.split(" "))
    ​
        //6、每个单词计为1
          val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    ​
        //7、相同单词出现的1累加
          val result: DStream[(String, Int)] = wordAndOne.updateStateByKey(updateFunc)
    ​
        //8、打印
          result.print()
    ​
        //9、开启流式计算
          ssc.start()
          ssc.awaitTermination()
      }
    }
    ​

 

5.3 通过sparkStreaming接受socket数据,利用reduceByKeyAndWindow来实现单词统计

  • 1、代码开发

    package demo.socket
    
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    
    //todo:利用reduceByKeyAndWindow来实现单词统计
    object SparkStreamingSocketWindow {
      def main(args: Array[String]): Unit = {
        //1、创建SparkConf对象
        val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingSocketWindow").setMaster("local[2]")
    
        //2、创建SparkContext对象
        val sc = new SparkContext(sparkConf)
        sc.setLogLevel("warn")
    
        //3、创建StreamingContext,需要2个 参数,第一个是SparkContext对象,第二个是批处理时间间隔
        val ssc = new StreamingContext(sc,Seconds(5))
    
        //4、接受socket数据
        val socketTextStream: ReceiverInputDStream[String] = ssc.socketTextStream("node1",9999)
    
        //5、切分每一行获取所有的单词
        val words: DStream[String] = socketTextStream.flatMap(_.split(" "))
    
        //6、每个单词计为1
        val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    
        //7、相同单词出现的1累加
           //需要3个参数
    //    reduceFunc: (V, V) => V,   它就是一个函数
    //    windowDuration: Duration,  窗口的长度
    //    slideDuration: Duration    窗口的滑动时间间隔,表示每隔多久计算一次
        val result: DStream[(String, Int)] = wordAndOne.reduceByKeyAndWindow((x:Int,y:Int)=>x+y,Seconds(5),Seconds(10))
    
        //8、打印
        result.print()
    
        //9、开启流式计算
        ssc.start()
        ssc.awaitTermination()
      }
    }
    
    

5.4 通过sparkStreaming使用开窗函数来统计一定内的热门词汇

  • 1.代码开发

    package demo.socket
    
    import org.apache.spark.rdd.RDD
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.{SparkConf, SparkContext}
    
    //todo:利用开窗函数来实现一定时间内的热门词汇
    object SparkStreamingSocketWindowHotWords {
      def main(args: Array[String]): Unit = {
          //1、创建SparkConf
          val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingSocketWindowHotWords").setMaster("local[2]")
    
          //2、创建SparkContext
          val sc = new SparkContext(sparkConf)
          sc.setLogLevel("warn")
    
         //3、创建StreamingContext
          val ssc = new StreamingContext(sc,Seconds(5))
    
        //4、接受socket数据
        val socketTextStream: ReceiverInputDStream[String] = ssc.socketTextStream("node1",9999)
    
        //5、切分每一行获取所有的单词
        val words: DStream[String] = socketTextStream.flatMap(_.split(" "))
    
        //6、每个单词计为1
        val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    
        //7、相同单词出现的1累加
        val result: DStream[(String, Int)] = wordAndOne.reduceByKeyAndWindow((x:Int,y:Int)=>x+y,Seconds(10),Seconds(10))
    
        //按照单词出现的次数降序排列
        val sortDstream: DStream[(String, Int)] = result.transform(rdd => {
          //按照单词次数降序
          val sortRDD: RDD[(String, Int)] = rdd.sortBy(_._2, false)
          //取出次数最多的前3位
          val top3: Array[(String, Int)] = sortRDD.take(3)
          println("---------------top3--------------start")
          top3.foreach(println)
          println("---------------top3--------------end")
          sortRDD
        })
    
        //8、打印
        sortDstream.print()
    
        //9、开启流式计算
        ssc.start()
        ssc.awaitTermination()
      }
    }
    
    

6、sparkStreaming整合flume

6.1 Poll拉模式整合

  • 1、需要将spark-streaming-flume-sink_2.11-2.1.3.jar放入到flume的lib目录下,同时还需要把flume自带的scala依赖2.10改为2.11

  • 2、修改flume配置文件

    • vim flume-poll-spark.conf

      a1.sources = r1
      a1.sinks = k1
      a1.channels = c1
      
      #source
      a1.sources.r1.channels = c1
      a1.sources.r1.type = spooldir
      a1.sources.r1.spoolDir = /root/data
      a1.sources.r1.fileHeader = true
      
      
      #channel
      a1.channels.c1.type =memory
      a1.channels.c1.capacity = 20000
      a1.channels.c1.transactionCapacity=5000
      
      
      #sinks
      a1.sinks.k1.channel = c1
      a1.sinks.k1.type = org.apache.spark.streaming.flume.sink.SparkSink
      a1.sinks.k1.hostname=node1
      a1.sinks.k1.port = 8888
      a1.sinks.k1.batchSize= 2000
      
  • 3、引入依赖

            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-streaming-flume_2.11</artifactId>
                <version>2.1.3</version>
            </dependency>
    
  • 4、代码开发

    package demo.flume
    
    import java.net.InetSocketAddress
    
    import org.apache.spark.storage.StorageLevel
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.streaming.flume.{FlumeUtils, SparkFlumeEvent}
    
    //todo:利用sparkStreaming整合flume-------Poll拉模式整合
    object SparkStreamingFlumePoll {
      def main(args: Array[String]): Unit = {
        //1、创建SparkConf对象
        val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingFlumePoll").setMaster("local[2]")
    
        //2、创建SparkContext对象
        val sc = new SparkContext(sparkConf)
        sc.setLogLevel("warn")
    
        //3、创建StreamingContext,需要2个 参数,第一个是SparkContext对象,第二个是批处理时间间隔
        val ssc = new StreamingContext(sc,Seconds(5))
    
        //4、通过拉模式接受flume的数据
       val pollingStream: ReceiverInputDStream[SparkFlumeEvent] = FlumeUtils.createPollingStream(ssc,"node1",8888)
    
         //接受多台flume收集到的数据
    //        val addresses=List(new InetSocketAddress("node1",8888),new InetSocketAddress("node2",8888),new InetSocketAddress("node3",8888))
    //       val stream: ReceiverInputDStream[SparkFlumeEvent] = FlumeUtils.createPollingStream(ssc,addresses,StorageLevel.MEMORY_AND_DISK_SER_2)
    //
        //5、获取flume中数据  flume中数据传输的最小单元是一个event:{"headers":xxxxx,"body":xxxxxx}
             //获取body中的数据
        val data: DStream[String] = pollingStream.map(x=>new String(x.event.getBody.array()))
    
        //6、切分每一行获取所有的单词
        val words: DStream[String] = data.flatMap(_.split(" "))
    
        //7、每个单词计为1
        val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    
        //8、相同单词出现的1累加
        val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_+_)
    
        //9、打印
        result.print()
    
        //10、开启流式计算
        ssc.start()
        ssc.awaitTermination()
    
      }
    }
    
    

6.2 Push推模式整合

  • 1、编写flume的配置文件

    • vim flume-push-spark.conf

      #push mode
      a1.sources = r1
      a1.sinks = k1
      a1.channels = c1
      #source
      a1.sources.r1.channels = c1
      a1.sources.r1.type = spooldir
      a1.sources.r1.spoolDir = /root/data
      a1.sources.r1.fileHeader = true
      #channel
      a1.channels.c1.type =memory
      a1.channels.c1.capacity = 20000
      a1.channels.c1.transactionCapacity=5000
      #sinks
      a1.sinks.k1.channel = c1
      a1.sinks.k1.type = avro
      #是sparkStreaming应用程序所在的ip地址和端口
      a1.sinks.k1.hostname=192.168.25.48
      a1.sinks.k1.port = 8888
      a1.sinks.k1.batchSize= 2000
      
  • 2、代码开发

    package demo.flume
    
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.streaming.flume.{FlumeUtils, SparkFlumeEvent}
    
    //todo:sparkStreaming整合flume-------Push推模式
    object SparkStreamingFlumePush {
      def main(args: Array[String]): Unit = {
        //1、创建SparkConf对象
        val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingFlumePush").setMaster("local[2]")
    
        //2、创建SparkContext对象
        val sc = new SparkContext(sparkConf)
        sc.setLogLevel("warn")
    
        //3、创建StreamingContext,需要2个 参数,第一个是SparkContext对象,第二个是批处理时间间隔
        val ssc = new StreamingContext(sc,Seconds(5))
    
        //4、接受flume中的数据
        val stream: ReceiverInputDStream[SparkFlumeEvent] = FlumeUtils.createStream(ssc,"192.168.25.48",8888)
    
        //5、获取flume中数据  flume中数据传输的最小单元是一个event:{"headers":xxxxx,"body":xxxxxx}
        //获取body中的数据
        val data: DStream[String] = stream.map(x=>new String(x.event.getBody.array()))
    
        //6、切分每一行获取所有的单词
        val words: DStream[String] = data.flatMap(_.split(" "))
    
        //7、每个单词计为1
        val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    
        //8、相同单词出现的1累加
        val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_+_)
    
        //9、打印
        result.print()
    
        //10、开启流式计算
        ssc.start()
        ssc.awaitTermination()
    
      }
    
    }
    
    

7、SparkStreaming整合kafka

  • 引入依赖

            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
                <version>2.1.3</version>
            </dependency>
    

7.1 KafkaUtils.createStream

  • 1、代码开发

    package demo.kafka
    
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.streaming.kafka.KafkaUtils
    
    import scala.collection.immutable
    
    //todo:sparkStreaming整合kafka -------基于receiver接收器,使用了kafka高层次消费者api(消息的偏移量由zk去维护)
    object SparkStreamingKafkaReceiver {
      def main(args: Array[String]): Unit = {
        //1、创建SparkConf对象
        val sparkConf: SparkConf = new SparkConf()
                                  .setAppName("SparkStreamingKafkaReceiver")
                                  .setMaster("local[4]")
          //开启WAL日志,作用:保证数据源端的安全性,后期某些rdd的分区数据丢失了,是可以通过 血统+原始数据进行恢复
                                    .set("spark.streaming.receiver.writeAheadLog.enable","true")
    
        //2、创建SparkContext对象
        val sc = new SparkContext(sparkConf)
        sc.setLogLevel("warn")
    
        //3、创建StreamingContext,需要2个 参数,第一个是SparkContext对象,第二个是批处理时间间隔
        val ssc = new StreamingContext(sc,Seconds(5))
    
           //设置checkpoint目录,用于保存接受到的数据   实际工作中是指向HDFS目录
            ssc.checkpoint("./spark-receiver")
    
        //4、接受kafka中topic的数据
            //指定zk服务地址
            val zkQuorum="node1:2181,node2:2181,node3:2181"
           //指定消费者组id
           val groupId="spark-receiver"
           //指定topic相关信息  key:topic名称  value:表示一个receiver接收器使用多少个线程消费topic数据
            val topics=Map("itcast" ->1)
           //(String, String): 第一个String就是消息的key,第二个String就是消息的value
          //val kafkaDstream: ReceiverInputDStream[(String, String)] = KafkaUtils.createStream(ssc,zkQuorum,groupId,topics)
    
        //构建了3个receiver接收器去接受数据,加快数据的接受速度
        val kafkaDstreamList: immutable.IndexedSeq[ReceiverInputDStream[(String, String)]] = (1 to 3).map(x => {
          val kafkaDstream: ReceiverInputDStream[(String, String)] = KafkaUtils.createStream(ssc, zkQuorum, groupId, topics)
          kafkaDstream
        })
         //ssc.union方法 把多个receiver接受器产生的Dstream汇总成一个Dstream
          val totalKafkaDstream: DStream[(String, String)] = ssc.union(kafkaDstreamList)
    
    
        // kafkaDstream.print()
    
        //5、获取topic中的真实数据
          val data: DStream[String] = totalKafkaDstream.map(_._2)
    
        //6、切分每一行获取所有的单词
        val words: DStream[String] = data.flatMap(_.split(" "))
    
        //7、每个单词计为1
        val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    
        //8、相同单词出现的1累加
        val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_+_)
    
        //9、打印
        result.print()
    
        //10、开启流式计算
        ssc.start()
        ssc.awaitTermination()
      }
    }
    
    
  • 2、总结

    第一种方式使用了receiver接受器去接受数据,后期可以使用多个receiver接收器来加快接受的速度,使用了kafka高层次的消费者api,就是消息的偏移量由zk去维护。
    默认会出现数据的丢失,可以启动WAL日志将接受到的数据同步写入到分布式文件系统HDFS上,保证数据源端它的安全性,后面就可以使用血统+原始数据,来重新计算恢复得到丢失的数据。
    
    开启WAL日志:
    set("spark.streaming.receiver.writeAheadLog.enable","true")
    需要设置数据保存目录:
    ssc.checkpoint("目录")
    
    这种方式可以解决数据不丢失的问题,但是它解决不了数据被处理且只被处理一次。在这里由于更新偏移量到zk没有成功,导致数据正常消费成功了,没有把这个消费的标识记录下来,最后导致数据的重复消费。
    
    

7.2 KafkaUtils.createDirectStream

  • 1、代码开发

    package demo.kafka
    
    import kafka.serializer.StringDecoder
    import org.apache.spark.streaming.dstream.{DStream, InputDStream}
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.streaming.kafka.KafkaUtils
    
    //todo:sparkStreaming整合kafka -------使用消费者低级api(消息的偏移量不在由zk去维护,由客户端程序自己去维护)
    object SparkStreamingKafkaDirect {
      def main(args: Array[String]): Unit = {
        //1、创建SparkConf对象
        val sparkConf: SparkConf = new SparkConf()
          .setAppName("SparkStreamingKafkaDirect")
          .setMaster("local[4]")
    
        //2、创建SparkContext对象
        val sc = new SparkContext(sparkConf)
        sc.setLogLevel("warn")
    
        //3、创建StreamingContext,需要2个 参数,第一个是SparkContext对象,第二个是批处理时间间隔
        val ssc = new StreamingContext(sc,Seconds(5))
    
          //设置checkpoint目录 用于保存消息消费的偏移量
          ssc.checkpoint("./spark-direct")
    
        //4、接受kafka中的数据
            val kafkaParams=Map("bootstrap.servers" ->"node1:9092,node2:9092,node3:9092","group.id" ->"spark-direct")
            val topics=Set("itcast")
    
          //通过下面这种方式获取得到的Dstream它内部的rdd分区数跟kafka中topic的分区数相等。
        val kafkaDstream: InputDStream[(String, String)] = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder](ssc,kafkaParams,topics)
    
        //5、获取topic中的真实数据
        val data: DStream[String] = kafkaDstream.map(_._2)
    
        //6、切分每一行获取所有的单词
        val words: DStream[String] = data.flatMap(_.split(" "))
    
        //7、每个单词计为1
        val wordAndOne: DStream[(String, Int)] = words.map((_,1))
    
        //8、相同单词出现的1累加
        val result: DStream[(String, Int)] = wordAndOne.reduceByKey(_+_)
    
        //9、打印
        result.print()
    
        //10、开启流式计算
        ssc.start()
        ssc.awaitTermination()
      }
    }
    

7.3 打成jar包 集群运行

spark-submit --master spark://node1:7077 --class cn.itcast.kafka.SparkStreamingKafkaDirect --executor-memory 1g --total-executor-cores 2 spark_class12-1.0-SNAPSHOT.jar

对于实时处理来说什么情况下是比较理想的状态? 在当前批次时间内就把上一个批次的数据处理完成。
每隔10s去处理上一个10s的数据

第一个10s的数据                  -------------------------------------> 1分钟
第二个10s的数据              -------------------------------------> 1分钟
第三个10s的数据         -------------------------------------> 1分钟
.....
后面来的批次数据,一直会等待,会出现数据积压。

在企业中,我们正常通过本地开发代码程序,可以通过指定master为local,先本地测试,测试后数据没问题,可以把程序打成jar提交到集群中运行。
访问:master主机名:8080

可以先来一些资源参数进行测试:
 --executor-memory 5g --total-executor-cores 10
 --executor-memory 5g --total-executor-cores 20
 --executor-memory 10g --total-executor-cores 20
 --executor-memory 10g --total-executor-cores 30
请关注我的公众号:

 

Spark学习总结-入门 Spark是一个高效的分布式计算系统,发源于美国加州大学伯克利分校AMPLab的集群计算平台。Spark立足于内存计算,相比Hadoop MapReduce,Spark在性能上要高100倍,而且Spark提供了比Hadoop更上层的API,同样的算法在Spark中实现往往只有Hadoop的1/10或者1/100的长度。 立即下载

相关推荐

Transformer模型详解(图解最完整版)

Transformer由论文提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。Transformer 与 RNN 不同,可以比较好地并行训练。

2501_91695094的博客 2703

认识Spark

Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发的通用内存并行计算框架Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于大搜索、直达号、百度大数据等业务;

2302_80385233的博客 905

告别里程焦虑:手把手教你用MATLAB/Simulink仿真电动车AMT换挡规律(附代码)

本文详细介绍了如何使用MATLAB/Simulink仿真电动车AMT换挡规律,帮助解决里程焦虑问题。通过搭建完整的仿真系统,包括电机MAP图处理、Stateflow逻辑实现和动力性与经济性换挡曲线生成,优化电动车换挡策略以提升续航与性能。附带的代码示例和实用技巧使开发者能够快速上手并验证仿真结果。

weixin_26757925的博客 306

终极无敌大数据技术之认识spark

这些开发者一般有基本的软件工程概念,比如封装、接口设计以及面向对象的编程思想,他们通常有计算机专业的背景,并且能使用工程技术来设计和搭建软件系统,以实现业务用例。spark是一个用来实现快速,通用的集群计算平台spark适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理,迭代算法,交互式查询,流处理。通用性强:在Spark的基础上,Spark还提供了包括Spark SQL、Spark Streaming、MLib及GraphX在内的多个工具库,我们可以在一个应用中无缝的使用这些工具库。

Liangchaowei1229的博客 849

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5558

告别高延迟!用RV1106+4G模块+libdatachannel搭建低功耗WebRTC监控,保姆级避坑指南

本文详细介绍了如何利用RV1106低功耗处理器、4G模块和libdatachannel库构建嵌入式WebRTC监控系统,解决高延迟问题。通过硬件选型、系统优化和核心代码实现,提供了一套完整的低功耗实时视频传输方案,特别适合智能安防和工业物联网应用。

weixin_42527401的博客 193

Spark一些个人总结

随着大数据技术的发展,一些更加优秀的组件被提了出来,比如现在最常用的Spark组件,基于RDD原理在大数据处理中占据了越来越重要的作用。在此我们探索了Spark的原理,以及其在大数据开发中的重要作用。...

hhfhhf12345678的博客 5042

HFSS仿真3dB微带双分支定向耦合器学习笔记

设计一个3dB微带双分支定向耦合器,各端口微带线特性阻抗为50Ω,中心频率为5GHz,介质基板的介电常数9.6,基板厚度为0.8mm这里重点讲解HFSS的操作,关于理论知识后面文章更新。

qq_36521926的博客 7770

spark基本认识

一、spark认识 Spark是用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集,Spark官网上介绍,它具有运行速度快、易用性好、通用性强和随处运行等特点。 二、spark特点 1)运行速度快 spark在内存中对数据进行迭代计算,数据由内存读取是hadoop MapReduce的100倍。Spark是基于内存的迭代计算...

晓风岚月 1268

数字IC后端时钟树综合实战:OCC电路优化与时钟树平衡策略

本文深入探讨了数字IC后端设计中时钟树综合的关键挑战,重点分析了OCC电路时钟树优化的必要性。通过实战案例,详细阐述了如何通过手动干预、时钟分组与分段长树等策略,避免工具自动平衡导致的时序违例和资源浪费,从而有效实现时钟树平衡并提升设计质量。

weixin_29306261的博客 331

构建一个基于Simulink的LC滤波器仿真模型

需求分析LC滤波器(Inductor-Capacitor Filter)是一种常见的无源滤波器,广泛应用于电力电子、通信、音频处理等领域。其主要作用是平滑输入信号中的高频谐波成分,保留低频或直流成分,从而提高输出信号的质量。在电力电子系统中,LC滤波器常用于逆变器、整流器等设备的输出端,以减少开关噪声和电磁干扰(EMI),确保输出电压和电流的稳定性。本项目将基于Simulink平台,开发一个完整的LC滤波器仿真模型,涵盖从电源输入到滤波输出的整个过程,并通过PI控制器实现对滤波效果的闭环控制。

MHD0815的博客 741

带你深入浅出,彻底了解什么是Spark?

        大数据专业,或者人工智能,深度学习方向的小伙伴们一定对Spark这个名词不陌生吧~不认识也没有关系,今天Alice为大家带来关于Spark的一个详细介绍。 文章目录激动人心的Spark发展史Spark为什么流行?1:优秀的数据模型和计算抽象2:完善的生态圈3.Spark VS HadoopSpark使...

大数据梦想家 1万+

抖音 webmssdk 签名算法解析:X-Dynosaur / X-Gnarly / X-Bogus 生成原理

它只依赖设备指纹/环境编码与随机数,与 query 内容无关,因此可以独立于 Dynosaur/Gnarly 生成。

猫敷雪 200

spark(四)

spark(四)一、RDD转换算子1、单Value类型1.1、repartition1.2、sortBy2、双 Value 类型2.1、intersection2.2、union2.3、subtract2.4、zip3、Key - Value 类型3.1、partitionBy3.2、reduceByKey3.3、groupByKey3.4、aggregateByKey3.5、foldByKey3.6、combineByKey3.7、sortByKey3.8、join3.9、leftOuterJoin3.1

Smiling_lzy的博客 2134

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spark学习之路(四)——Spark on Standalone

1、任务提交流程: ①spark-submit提交任务给Master; ②Master收到任务请求后,通过LaunchDriver向Worker请求启动Driver; ③Worker收到请求后,启动Driver; ④Driver启动后,向Master注册应用(Application)信息; ⑤Master收到注册Application信息后,根据资源情况向Worker发送LaunchExecuto...

Rong_Robot的博客 389

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spark[四]——Spark并行度

Spark[四]——Spark并行度     Spark并行度指在Spark作业中,各个Stage中task的数量,也就代表了Spark作业在各个阶段的并行度。     合理设置并行度可以从以下几个方面考虑:1.充分利用任务资源,即并行度略高于分配给CPU资源数( = num-Executors * 每个Executor使用的core);2.平均每个Partition的大小不要过于小,一般在百兆左右最合适;3.根据实际机器分配给

qq_35583915的博客 835

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

四、配置spark

进入spark的conf目录 [root@master conf]#cd /usr/cstor/spark/conf 复制文件 [root@master conf]# cp slaves.template slaves 编辑配置文件,把文件里面的localhost删除 [root@master conf]# vim slaves slave1 slave2 复制文件 [root@master conf]# cpspark-env.sh.template spark-...

wgq18586361686的博客 1750

四, Spark运行架构

四, Spark 运行架构 4.1 整体架构 Spark框架的核心是一个计算引擎, 整体来说, 它采用了主-从master-slave的结构 下图是Spark执行时的基本结构, Driver表示master: 负责管理整个集群中的作业任务调度 Executor是slave: 负责实际执行任务 Spark Apllication的运行架构由两部分组成: Driver program(SparkContext)和Excutor, Spark Application一般都是在集群中运行, 比如Sp

菜菜的大数据开发の路 1915

Spark RDD算子【四】

Spark RDD常用算子

freefish_yzx的博客 612

四、spark的shuffle

1、shuffle过程 1.1)、shuffle过程 如下图: 了解Spark的shuffle过程: shuffle操作是在Spark操作中调用了一些特殊的算子才会触发的一种操作, shuffle操作会导致大量的数据在不同的节点之间进行传输,因此,shuffle过程 是Spark中最复杂、最消耗性能的一种操作。 比如: reduceByKey算子会将上一个RDD中的每个key对应的所有value...

murphyZ的博客 633

Spark学习(四)之Spark运行流程

文章目录一、Spark中的基本概念二、Spark的运行流程 一、Spark中的基本概念 (1)Application:表示你的应用程序 (2)Driver:表示main()函数,创建SparkContext。由SparkContext负责与ClusterManager通信,进行资源的申请,任务的分配和监控等。程序执行完毕后关闭SparkContext (3)Executor:某个Applicati...

thyyyyyyy的博客 624

【Spark】(四) Spark调优总结

文章目录一、开发调优1、避免创建重复的RDD2、尽可能复用用一个RDD3、对多次使用的RDD进行持久化4、尽量避免使用shuffle类算子5、使用map-side预聚合的shuffle操作6、使用高性能的算子7、广播大变量。8、使用Kryo优化序列化性能。9、优化数据结构。10、对数据进行压缩。11、合并小文件。 Spark的瓶颈一般来自于集群(standalone, yarn, mesos, ...

weixin_42804692的博客 608

hadoop spark hive 集群配置(四)spark

spark master 1. 编写hosts vi /etc/hosts 10.117.0.12 master 10.117.0.12 slave1 10.117.0.15 slave2 分发hosts scp -r /etc/hosts slave1:/etc/ scp -r /etc/hosts slave2:/etc/ 2. 安装解压scala并配置profil...

weixin_40732953的博客 268

Spark四之Spark SQL

文章目录Spark SQL一、Spark SQL概述1.什么是DataFrame2.什么是DataSet二、Spark SQL编程1.DataFrame读取json文件1.1 创建DataFrame1.2 SQL风格语法 [重点]1.3 DSL风格语法1.4 RDD转换为DataFrame[重要]1.5 DataFrame转换为RDD2.DataSet2.1 创建DataSet2.2 RDD转换为DataSet2.3DataFrame转换为DataSet2.4 DataSet转换为RDD3.DataFra

FY_07170424的博客 1121

四 搭建Spark HA集群

一、搭建好集群 二、 1、在虚拟机master上安装配置ZooKeeper (1)解压zookeeper安装包 执行命令tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local,将zookeeper安装包解压到指定目录 (2)配置zookeeper环境变量 执行命令:vim /etc/profile export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.5 export PATH=$ZOOKEEPER_HOM.

weixin_55988146的博客 207

四 Spark Spark的Java操作实现

编译Spark源码 一 centos7 mav安装 wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz tar -zxvf apache-maven-3.3.9-bin.tar.gz mv apache-maven-3.3.9 /usr/local...

张金玉的专栏 1481
上一篇: Spark的认识(三)
下一篇: Spark的shuffle和原理分析
JunMoXiaoPro
博客等级 码龄10年 10粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值