Spark流教程 :使用 Apache Spark 的Twitter情緒分析
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 流功能
- 擴充套件: Spark Streaming 可以輕鬆擴充套件到數百個節點。
- 速度:它實現了低延遲。
- 容錯: Spark 能夠有效地從故障中恢復。
- 整合: Spark 整合了批處理和實時處理。
- 業務分析: 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 Streaming 基礎
- 流上下文
- 資料流
- 快取
- 累加器、廣播變數和檢查點
流上下文
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 上的一些流行轉換:
- map(func) map( func ) 通過將源 DStream 的每個元素傳遞給函式func 來返回一個新的 DStream 。
- flatMap(func) flatMap( func ) 與 map( func )類似,但每個輸入項都可以對映到 0 個或多個輸出項,並通過將每個源元素傳遞給函式func 來返回一個新的 DStream 。
- filter(func) filter( func ) 通過僅選擇func返回 true的源 DStream 的記錄來返回一個新的 DStream 。
- reduce(func) reduce( func ) 通過使用函式func聚合源 DStream 的每個 RDD 中的元素,返回單元素 RDD 的新 DStream 。
- 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 進行情感分析的公司已應用相同的方法來實現以下目標:
- 提升客戶體驗
- 獲得競爭優勢
- 獲得商業智慧
- 振興一個失敗的品牌
相關文章
- Apache 流框架 Flink,Spark Streaming,Storm對比分析(1)Apache框架SparkORM
- Apache 流框架 Flink,Spark Streaming,Storm對比分析(2)Apache框架SparkORM
- Apache 流框架 Flink,Spark Streaming,Storm對比分析(一)Apache框架SparkORM
- Apache 流框架 Flink,Spark Streaming,Storm對比分析(二)Apache框架SparkORM
- 使用Apache Spark和Apache Hudi構建分析資料湖ApacheSpark
- Apache Spark Dataframe Join語法教程ApacheSpark
- tomaztk/Spark-for-data-engineers:面向資料工程師的Apache Spark學習教程Spark工程師Apache
- Apache Spark 2一些使用案例ApacheSpark
- 教程:Apache Spark SQL入門及實踐指南!ApacheSparkSQL
- Apache Spark Day3ApacheSpark
- 三種大資料流處理框架選擇比較:Apache Kafka流、Apache Spark流和Apache Flink - quora大資料框架ApacheKafkaSpark
- Apache Spark和Hive有用的功能ApacheSparkHive
- Apache Spark有哪些侷限性ApacheSpark
- 帶有Apache Spark的Lambda架構ApacheSpark架構
- Spark SQL 教程: 通過示例瞭解 Spark SQLSparkSQL
- Spark SQL 教程: 透過示例瞭解 Spark SQLSparkSQL
- Spark RPC框架原始碼分析(三)Spark心跳機制分析SparkRPC框架原始碼
- Apache Spark常見的三大誤解ApacheSpark
- Spark的Shuffle總結分析Spark
- docker下的spark使用DockerSpark
- Flume+Spark+Hive+Spark SQL離線分析系統SparkHiveSQL
- Apache Spark:分割槽和分桶 - NiveditaApacheSpark
- Apache Kyuubi 助力 CDH 解鎖 Spark SQLApacheSparkSQL
- 【譯】Using .NET for Apache Spark to Analyze Log DataApacheSpark
- 快取Apache Spark RDD - 效能調優快取ApacheSpark
- 面向Apache Spark的Kotlin預覽版簡介ApacheSparkKotlin
- Spark 原始碼分析系列Spark原始碼
- spark 原始碼分析之十八 -- Spark儲存體系剖析Spark原始碼
- spark 原始碼分析之十五 -- Spark記憶體管理剖析Spark原始碼記憶體
- 【技術乾貨】程式碼示例:使用 Apache Spark 連線 TDengineApacheSpark
- Spark之spark shellSpark
- Spark GraphX簡介與教程Spark
- Apache Kyuubi & Celeborn,助力 Spark 擁抱雲原生ApacheSpark
- Apache Spark有何用途?有何特點?ApacheSpark
- hive on spark:return code 30041 Failed to create Spark client for Spark session原因分析及解決方案探尋HiveSparkAIclientSession
- Apache Spark SQL的高階Join連線技術ApacheSparkSQL
- spark 原始碼分析之十六 -- Spark記憶體儲存剖析Spark原始碼記憶體
- Spark系列 - (3) Spark SQLSparkSQL