當前位置: 首頁>>技術教程>>正文


Spark Streaming入門

Spark Streaming簡介

Spark Streaming是Spark核心API的擴展,可實現實時數據流的可擴展,高吞吐量,容錯流式處理。數據可以從諸如Kafka,Flume,Kinesis或TCP套接字的許多來源中獲取,並且可以使用由高級函數(如mapreducejoinwindow)表達的複雜算法進行處理。另外,處理後的數據可以推送到文件係統、數據庫,以及實時儀表板上用於展示。事實上,您還可以在數據流上應用Spark的機器學習和圖形處理算法。下圖是這些概念的圖示:
spark-streaming

在內部,它的工作原理如下圖所示。 Spark Streaming接收實時輸入數據流,並將數據分成批,然後由Spark引擎對其進行處理,以批量生成最終的結果流。
spark-streaming-2

Spark Streaming提供稱為離散流或DStream的高級抽象,它表示連續的數據流。可以從諸如Kafka,Flume和Kinesis等來源的輸入數據流中創建DStream,或者通過對其他DStream應用高級操作來創建。在內部,DStream表示為一係列RDD。

本指南介紹如何開始使用DStreams編寫Spark Streaming程序。您可以在Scala,Java或Python中編寫Spark Streaming程序(在Spark 1.2中引入),所有這些都在本指南中有示例介紹,不同語言有對應的代碼段。本文僅列出Scala版,其他版本參見:Java&Python Spark Streaming示例

注意:有一些API在Python中是不同的或不可用的。

Spark Streaming示例, Scala版

首先,我們將Spark Streaming類的名稱和StreamingContext的一些隱式轉換導入到我們的環境中,以便為我們需要的其他類(如DStream)添加有用的方法。 StreamingContext是所有流功能的主要入口點。我們創建一個帶有兩個執行線程的本地StreamingContext,並且間隔為1秒。

import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._ // not necessary since Spark 1.3

// Create a local StreamingContext with two working thread and batch interval of 1 second.
// The master requires 2 cores to prevent from a starvation scenario.

val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))

使用此上下文,我們可以創建一個DStream,它表示來自TCP源的流數據,指定為主機名(例如localhost)和端口(例如9999)。

// Create a DStream that will connect to hostname:port, like localhost:9999
val lines = ssc.socketTextStream("localhost", 9999)

這行DStream表示將從數據服務器接收的數據流。此DStream中的每個記錄都是一行文本。接下來,我們要將空格字符的行分割成單詞。

// Split each line into words
val words = lines.flatMap(_.split(" "))

flatMap是一個一對多的DStream操作,通過從源DStream中的每個記錄生成多個新記錄來創建新的DStream。在這種情況下,每一行將被分割成多個單詞,並將單詞流表示為單詞DStream。接下來,我們統計單詞數量。

import org.apache.spark.streaming.StreamingContext._ // not necessary since Spark 1.3
// Count each word in each batch
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)

// Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.print()

wordsDStream進一步映射(一對一變換)到(word,1)對的DStream,然後reduce獲得每批數據中的單詞的頻率。最後,wordCounts.print()將打印每秒產生的幾個計數。

請注意,當執行這些行時,Spark Streaming僅設置啟動時執行的計算,並且尚未開始實際處理。要在完成所有轉換設置之後開始處理,我們要調用

ssc.start()             // Start the computation
ssc.awaitTermination()  // Wait for the computation to terminate

完整的代碼可以在Spark Streaming示例NetworkWordCount中找到。

如果您已經下載並構建了Spark,則可以運行此示例,如下所示。您將首先需要運行Netcat(大多數類Unix係統中的一個小型實用程序)作為數據服務器

$ nc -lk 9999

然後,在不同的終端中,您可以通過下麵的命令啟動示例

$ ./bin/run-example streaming.NetworkWordCount localhost 9999

然後,在運行netcat服務器的終端中輸入的任何行將每秒計數並打印在屏幕上。它看起來是這麵這個樣子:

# TERMINAL 1:
# Running Netcat

$ nc -lk 9999

hello world
...
# TERMINAL 2: RUNNING NetworkWordCount

$ ./bin/run-example streaming.NetworkWordCount localhost 9999
...
-------------------------------------------
Time: 1357008430000 ms
-------------------------------------------
(hello,1)
(world,1)
...
本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3480.html,未經允許,請勿轉載。