Spark Streaming之WordCount

1. 概要

Spark Streaming是Spark的流处理框架,具有可扩展性、高吞吐率、失败恢复机制。Spark Streaming可以接入许多source,包括Kafka、Flume、HDFS/S3、Kinesis、Sockets;可以使用复杂算法来处理数据,包括map、reduce、join、window等;处理过后的数据可以输出到文件系统、数据库、或者输出到界面。另外,还可以把Spark的机器学习和图处理作用在数据流上。

Spark Streaming之WordCount_第1张图片
Paste_Image.png

Spark Streaming仍然是基于批处理的,是采用了微批处理(Micro-Batch)技术,它源源不断的接受source的数据,并把数据分成批,通过Spark引擎生成批形态的流。

Spark Streaming之WordCount_第2张图片
Paste_Image.png

Spark Streaming 提供了高度抽象的discretized stream(DStream,离散的流),代表了连续的数据流,一个DStream就是一系列的RDD(分布式数据集)。如你所知,Spark对数据的操作是基于RDD的,所有对DStream的操作,都会转化成对RDD的操作。

Spark Streaming之WordCount_第3张图片
Paste_Image.png

2. 运行Spark Streaming WordCount

Spark自带了一些例子,jar包和源码都在$SPARK_HOME/examples目录,这里我们要运行的就是Spark Streaming的例子NetworkWordCount。顾名思义,NetworkWordCount这个程序就是从tcp sockets中读取数据,并做WordCount,时间间隔是1秒,结果输出在屏幕上。

为了运行NetworkWordCount,首先我们需要运行一个netcat server。

nc -lk 9999

然后,另开一个shell窗口,进入$SPARK_HOME目录,提交NetworkWordCount任务。

cd $SPARK_HOME
bin/run-example org.apache.spark.examples.streaming.NetworkWordCount\
       localhost 9999

之后,在netcat server窗口,输入一些文字,并回车,例如输入:

hello spark hello world

我们就可以在Spark 运行窗口观察到如下的信息

(hello,2)
(world,1)
(spark,1)

3. NetworkWordCount源码

package org.apache.spark.examples.streaming

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

/**
 * WordCount,接受UTF-8格式的单词,使用空格分割收到的文本,以1秒为一批。
 *
 * 运行WordCount程序之前,我们需要先启动一个 Netcat server,命令如下:
 *    `$ nc -lk 9999`
 * 然后运行以下命令:
 *    `$ bin/run-example org.apache.spark.examples.streaming.NetworkWordCount\
 *         localhost 9999`
 */
object NetworkWordCount {
  
  def main(args: Array[String]) {
    // 处理参数
    if (args.length < 2) {
      System.err.println("Usage: NetworkWordCount  ")
      System.exit(1)
    }
    // 设置日志级别
    StreamingExamples.setStreamingLogLevels()

    // 创建Spark上下文,并以1秒内收到的数据作为一批
    val sparkConf = new SparkConf().setAppName("NetworkWordCount")
    val ssc = new StreamingContext(sparkConf, Seconds(1))

    // 创建了一个DStream,从Socket中接受数据。
    val lines = ssc.socketTextStream(args(0), args(1).toInt, 
                                  StorageLevel.MEMORY_AND_DISK_SER)
    // 以空格把收到的每一行数据分割成单词
    val words = lines.flatMap(_.split(" "))
    // 在本批次内计单词的数目
    val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
    // 打印每个RDD中的前10个元素到控制台
    wordCounts.print()
    ssc.start() // 启动计算
    ssc.awaitTermination() // 等待计算结束
  }
}

(完)

你可能感兴趣的:(Spark Streaming之WordCount)