Spark流教程 :使用 Apache Spark 的Twitter情緒分析

banq發表於2021-12-29

Spark Streaming 是核心 Spark API 的擴充套件,它支援實時資料流的可擴充套件、高吞吐量、容錯流處理。Spark Streaming 可用於流式傳輸實時資料,並且可以實時進行處理。Spark Streaming 不斷增長的使用者群由 Uber、Netflix 和 Pinterest 等家喻戶曉的名字組成。

在實時資料分析方面,Spark Streaming 提供了一個單一平臺來攝取資料以進行快速實時處理。通過這個部落格,我將向您介紹 Spark Streaming 這個令人興奮的新領域,我們將通過一個完整的用例, 使用 Spark Streaming 進行Twitter 情緒分析。

 

什麼是流媒體?

資料流是一種傳輸資料的技術,以便它可以作為穩定和連續的流進行處理。隨著網際網路的發展,流媒體技術變得越來越重要。

為什麼是 Spark Streaming?

我們可以使用 Spark Streaming 從 Twitter、股票市場和地理系統等各種來源流式傳輸實時資料,並執行強大的分析來幫助企業。 

Spark Streaming 概述

Spark Streaming用於處理實時流資料。它是對核心 Spark API 的有用補充。Spark Streaming 支援實時資料流的高吞吐量和容錯流處理。

基本的流單元是 DStream 這基本上是一系列 RDD 來處理實時資料。

Spark 流功能

  1. 擴充套件: Spark Streaming 可以輕鬆擴充套件到數百個節點。
  2. 速度:它實現了低延遲。
  3. 容錯: Spark 能夠有效地從故障中恢復。
  4. 整合:  Spark 整合了批處理和實時處理。
  5. 業務分析: Spark Streaming用於跟蹤客戶的行為,可用於業務分析

 

Spark Streaming 工作流

Spark Streaming 工作流有四個高階階段。第一個是從各種來源流式傳輸資料。這些源可以是用於實時流式傳輸的流資料來源,例如 Akka、Kafka、Flume、AWS 或 Parquet。第二種來源包括 HBase、MySQL、PostgreSQL、Elastic Search、Mongo DB 和用於靜態/批處理流的 Cassandra。一旦發生這種情況,Spark 可用於通過其 MLlib API 對資料執行機器學習。此外,Spark SQL 用於對這些資料執行進一步的操作。最後,流輸出可以儲存到各種資料儲存系統中,如 HBase、Cassandra、MemSQL、Kafka、Elastic Search、HDFS 和本地檔案系統。

Spark流教程 :使用 Apache Spark 的Twitter情緒分析

 

 

Spark Streaming 基礎

  1. 流上下文
  2. 資料流
  3. 快取
  4. 累加器、廣播變數和檢查點

 

流上下文

Streaming Context使用 Spark 中的資料流。它註冊一個Input DStream以產生一個Receiver物件。它是 Spark 功能的主要入口點。Spark 提供了許多可從上下文訪問的源的預設實現,例如 Twitter、Akka Actor 和 ZeroMQ。

StreamingContext 物件可以從 SparkContext 物件建立。SparkContext 表示與 Spark 叢集的連線,可用於在該叢集上建立 RDD、累加器和廣播變數。

import org.apache.spark._
import org.apache.spark.streaming._
var ssc = new StreamingContext(sc,Seconds(1))

 

資料流

Discretized Stream (DStream) 是 Spark Streaming 提供的基本抽象。它是一個連續的資料流。它是從資料來源或通過轉換輸入流生成的已處理資料流接收的。

在內部,一個 DStream 由一系列連續的 RDD 表示,每個 RDD 包含來自某個間隔的資料。

  • 輸入 DStreams:

 輸入 DStreams是表示從流源接收的輸入資料流的 DStreams。 

每個輸入 DStream 都與一個 Receiver 物件相關聯,該物件從源接收資料並將其儲存在 Spark 的記憶體中以供處理。

  • DStreams 上的轉換:

任何應用在 DStream 上的操作都會轉化為對底層 RDD 的操作。轉換允許修改來自輸入 DStream 的資料,類似於 RDD。DStreams 支援許多普通 Spark RDD 上可用的轉換。 

以下是 DStreams 上的一些流行轉換:

  1. map(func)    map( func ) 通過將源 DStream 的每個元素傳遞給函式func 來返回一個新的 DStream  。
  2. flatMap(func)    flatMap( func ) 與 map( func )類似,但每個輸入項都可以對映到 0 個或多個輸出項,並通過將每個源元素傳遞給函式func 來返回一個新的 DStream  。
  3. filter(func)    filter( func ) 通過僅選擇func返回 true的源 DStream 的記錄來返回一個新的 DStream 。
  4. reduce(func)    reduce( func ) 通過使用函式func聚合源 DStream 的每個 RDD 中的元素,返回單元素 RDD 的新 DStream 。
  5. groupBy(func)  groupBy( func ) 返回新的 RDD,它基本上由一個鍵和該組的相應專案列表組成。

  • 輸出 DStreams: 

輸出操作允許將 DStream 的資料推送到外部系統,如資料庫或檔案系統。輸出操作觸發所有 DStream 轉換的實際執行。

 

  • 快取

DStreams允許開發人員在記憶體中快取/持久化流的資料。如果 DStream 中的資料將被多次計算,這很有用。這可以使用 DStream 上的persist()方法來完成。對於通過網路接收資料的輸入流(如Kafka、Flume、Sockets等), 預設永續性級別設定為將資料複製到兩個節點以實現容錯。

 

累加器、廣播變數和檢查點

  • 累加器: 累加器是僅通過關聯和交換操作新增的變數。它們用於實現計數器或總和。在 UI 中跟蹤累加器對於瞭解執行階段的進度很有用。Spark 本身支援數字累加器。我們可以建立命名或未命名的累加器。
  • 廣播變數: 廣播變數允許程式設計師在每臺機器上快取一個只讀變數,而不是隨任務一起傳送它的副本。它們可用於以有效的方式為每個節點提供大型輸入資料集的副本。Spark 還嘗試使用有效的廣播演算法來分發廣播變數以降低通訊成本。
  • 檢查點: 檢查點類似於遊戲中的檢查點。它們使其 24/7 全天候執行,並使其能夠適應與應用程式邏輯無關的故障。

 

用例 – Twitter 情緒分析

現在我們已經瞭解了 Spark Streaming 的核心概念,讓我們使用 Spark Streaming 解決一個現實生活中的問題。

問題陳述: 設計一個 Twitter 情緒分析系統,在其中我們為危機管理、服務調整和目標營銷填充實時情緒。

情感分析的應用:

  • 預測一部電影的成功
  • 預測政治競選成功
  • 決定是否投資某家公司
  • 定向廣告
  • 檢視產品和服務

Spark Streaming 實現:

下面是虛擬碼:

//Import the necessary packages into the Spark Program
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.SparkContext._
...
import java.io.File
 
object twitterSentiment {
 
def main(args: Array[String]) {
if (args.length < 4) {
System.err.println("Usage: TwitterPopularTags <consumer key> <consumer secret> " + "<access token> <access token secret> [<filters>]")
System.exit(1)
}
 
StreamingExamples.setStreamingLogLevels()
//Passing our Twitter keys and tokens as arguments for authorization
val Array(consumerKey, consumerSecret, accessToken, accessTokenSecret) = args.take(4)
val filters = args.takeRight(args.length - 4)
 
// Set the system properties so that Twitter4j library used by twitter stream
// Use them to generate OAuth credentials
System.setProperty("twitter4j.oauth.consumerKey", consumerKey)
...
System.setProperty("twitter4j.oauth.accessTokenSecret", accessTokenSecret)
 
val sparkConf = new SparkConf().setAppName("twitterSentiment").setMaster("local[2]")
val ssc = new Streaming Context
val stream = TwitterUtils.createStream(ssc, None, filters)
 
//Input DStream transformation using flatMap
val tags = stream.flatMap { status => Get Text From The Hashtags }
 
//RDD transformation using sortBy and then map function
tags.countByValue()
.foreachRDD { rdd =>
val now = Get current time of each Tweet
rdd
.sortBy(_._2)
.map(x => (x, now))
//Saving our output at ~/twitter/ directory
.saveAsTextFile(s"~/twitter/$now")
}
 
//DStream transformation using filter and map functions
val tweets = stream.filter {t =>
val tags = t. Split On Spaces .filter(_.startsWith("#")). Convert To Lower Case
tags.exists { x => true }
}
 
val data = tweets.map { status =>
val sentiment = SentimentAnalysisUtils.detectSentiment(status.getText)
val tagss = status.getHashtagEntities.map(_.getText.toLowerCase)
(status.getText, sentiment.toString, tagss.toString())
}
 
data.print()
//Saving our output at ~/ with filenames starting like twitters
data.saveAsTextFiles("~/twitters","20000")
 
ssc.start()
ssc.awaitTermination()
 }
}

推文情緒的輸出根據它們的建立時間儲存到資料夾和檔案中。此輸出可以根據需要儲存在本地檔案系統或 HDFS 上。

使用 Spark Streaming 進行情感分析的公司已應用相同的方法來實現以下目標:

  1. 提升客戶體驗
  2. 獲得競爭優勢
  3. 獲得商業智慧
  4. 振興一個失敗的品牌

 

相關文章