美文网首页
SparkStreaming之Dstream入门

SparkStreaming之Dstream入门

作者: 大数据小同学 | 来源:发表于2020-08-28 07:58 被阅读0次

    WordCount案例实操

    1. 需求:使用netcat工具向9999端口不断的发送数据,通过SparkStreaming读取端口数据并统计不同单词出现的次数
    2. 添加依赖
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.11</artifactId>
        <version>2.1.1</version>
    </dependency>
    
    1. 编写代码
    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    import org.apache.spark.SparkConf
    object StreamWordCount {
      def main(args: Array[String]): Unit = {
        //1.初始化Spark配置信息
        val sparkConf = new SparkConf().setMaster("local[*]").setAppName("StreamWordCount")
        //2.初始化SparkStreamingContext
        val ssc = new StreamingContext(sparkConf, Seconds(5))
        //3.通过监控端口创建DStream,读进来的数据为一行行
        val lineStreams = ssc.socketTextStream("hadoop102", 9999)
        //将每一行数据做切分,形成一个个单词
        val wordStreams = lineStreams.flatMap(_.split(" "))
        //将单词映射成元组(word,1)
        val wordAndOneStreams = wordStreams.map((_, 1))
        //将相同的单词次数做统计
        val wordAndCountStreams = wordAndOneStreams.reduceByKey(_+_)
        //打印
        wordAndCountStreams.print()
        //启动SparkStreamingContext
        ssc.start()
        ssc.awaitTermination()
      }
    }
    
    1. 启动程序并通过NetCat发送数据:
    [liujh@hadoop102 spark]$ nc -lk 9999
    hello liujh
    

    注意:如果程序运行时,log日志太多,可以将spark conf目录下的log4j文件里面的日志级别改成WARN。

    WordCount解析

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


    image.png

    对数据的操作也是按照RDD为单位来进行的


    image.png
    计算过程由Spark engine来完成
    image.png

    DStream输出

    输出操作指定了对流数据经转化操作得到的数据所要执行的操作(例如把结果推入外部数据库或输出到屏幕上)。与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作,那么这些DStream就都不会被求值。如果StreamingContext中没有设定输出操作,整个context就都不会启动。
    输出操作如下:

    print():

    在运行流程序的驱动结点上打印DStream中每一批次数据的最开始10个元素。这用于开发和调试。在Python API中,同样的操作叫print()。

    saveAsTextFiles(prefix, [suffix]):

    以text文件形式存储这个DStream的内容。每一批次的存储文件名基于参数中的prefix和suffix。”prefix-Time_IN_MS[.suffix]”.

    saveAsObjectFiles(prefix, [suffix]):

    以Java对象序列化的方式将Stream中的数据保存为 SequenceFiles . 每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]". Python中目前不可用。

    saveAsHadoopFiles(prefix, [suffix]):

    将Stream中的数据保存为 Hadoop files. 每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]"。
    Python API Python中目前不可用。

    foreachRDD(func):

    这是最通用的输出操作,即将函数 func 用于产生于 stream的每一个RDD。其中参数传入的函数func应该实现将每一个RDD中数据推送到外部系统,如将RDD存入文件或者通过网络将其写入数据库。注意:函数func在运行流应用的驱动中被执行,同时其中一般函数RDD操作从而强制其对于流RDD的运算。
    通用的输出操作foreachRDD(),它用来对DStream中的RDD运行任意计算。这和transform() 有些类似,都可以让我们访问任意RDD。在foreachRDD()中,可以重用我们在Spark中实现的所有行动操作。
    比如,常见的用例之一是把数据写到诸如MySQL的外部数据库中。 注意:

    1. 连接不能写在driver层面;
    2. 如果写在foreach则每个RDD都创建,得不偿失;
    3. 增加foreachPartition,在分区创建。
    关注微信公众号
    简书:https://www.jianshu.com/u/0278602aea1d
    CSDN:https://blog.csdn.net/u012387141

    相关文章

      网友评论

          本文标题:SparkStreaming之Dstream入门

          本文链接:https://www.haomeiwen.com/subject/rrqsyhtx.html