第一個流處理程序sparkStreaming+Java
史上最簡單的spark教程
所有代碼示例地址:https://github.com/Mydreamandreality/sparkResearch
(提前聲明:文章由作者:張耀峯 結合自己生產中的使用經驗整理,最終形成簡單易懂的文章,寫作不易,轉載請註明)
(文章參考:Elasticsearch權威指南,Spark快速大數據分析文檔,Elasticsearch官方文檔,實際項目中的應用場景)
(幫到到您請點點關注,文章持續更新中!)
Git主頁 https://github.com/Mydreamandreality
sparkStreming 是什麼
start:讓我們先了解一下sparkStreaming的基本概念
- 在很多的應用中,我們需要即時處理收到的數據,比如實時的交易額,成交量,實時安全檢測,安全報警,總之就是需要實時處理的數據
- sparkstreaming就是spark爲這些應用而設計的模型
- sparkstreaming是彈性的,高吞吐,高容錯的實時數據流處理框架
- 它提供給我們一套和批處理非常相似的Api編寫流式計算程序
- sparkstreaming的數據源:
- kafka
- elasticsearch
- habse
- flume
- HDFS
- 等等
- 也可以通過window,map等高級函數組成的複雜算法處理
- 最終處理完的數據可以輸出到文件系統,或者數據庫等
數據處理流程如下圖
sparkstreaming內部工作原理
- 在sparkstreaming的內部,它接收實時輸入的數據並且把數據切分爲多個batch(一批),然後再處理分批流結果
數據內部流程如下
- sparkstreaming提供了一個高級抽象叫做Dstream,代表一個連續的數據流
- DStream可以從數據源輸入口創建,也可以基於Dstream進行創建
編寫我們的第一個案例
- 我們這裏還是maven的項目哈,首先引入jar包
<!--stream流處理-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.2.3</version>
</dependency>
-
需求
- 需求很簡單,從本地服務器的8080端口接收一行一行的數據,並且篩選出包含error的行,打印
-
代碼案例
-
[如果兄弟看過我之前寫得spark批處理教程.下面代碼就很好理解]
public static void main(String[] args) {
//創建兩個核心的本地線程,批處理的間隔爲1秒
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("sparkStreamIng");
JavaStreamingContext javaStreamingContext = new JavaStreamingContext(conf, Durations.seconds(1));
//創建一個連接到IP:localhost,PORT:8080的DStream
JavaReceiverInputDStream<String> dStream = javaStreamingContext.socketTextStream("localhost", 8080);
JavaDStream<String> errorLine = dStream.filter(new Function<String, Boolean>() {
@Override
public Boolean call(String v1) throws Exception {
return v1.contains("error");
}
});
//打印包含error的行
errorLine.print();
try {
//開始計算
javaStreamingContext.start();
//等待計算完成
javaStreamingContext.awaitTermination();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
- 在代碼中有少許的註釋方便大家理解,這裏再着重的解釋一下這個運行的邏輯
- 首先需要注意的是StreamingContext是所有流處理的主要入口點
- 看我們的代碼我們創建兩個核心的本地線程,批處理的間隔爲1秒
- 其次呢我們使用socketTextStream()函數實時從端口接收數據流,在這個離散流(Dstream)中的每一條記錄都是一行文本
- 之後就是我們很熟悉的代碼,看過我之前教程的兄弟應該是很容易就看懂了,使用filter()函數過濾包含有error的文本,只不過這裏的返回值變成了(JavaDStream)離散流,不是我們批處理中的RDD了
- 但是這個時候我們還只是設置了計算,並且實際的執行
- 只有啓動纔會真正的執行,所以我們使用streamingContext.start()函數啓動我們的流處理,然後print()函數就會打印每秒端口生成的文本信息中包含error數據的
運行我們的流處理程序
- 第一步當然還是打包我們的程序啦
- 因爲我們的程序是從端口接收實時數據
- 所以我們安裝一個給端口發送數據的工具 ncat
- 執行:yum install nmap-ncat.x86_64(注:我是centos系統64位)
- 安裝好之後顯示如下:
- 然後我們在控制檯輸入
nc -help
驗證是否安裝成功
運行
- 這裏運行我們的代碼
- 先進入我們的打包程序jar上傳的目錄
- 然後執行 spark-submit命令
/usr/local/spark/spark-2.2.3-bin-hadoop2.7/bin/spark-submit --master local[2] --executor-memory 1g --class SparkStreamDemo chapter17-1.0-SNAPSHOT.jar
- 運行的命令具體含義就不多說了,之前有一章是單獨講這個的,沒看的兄弟可以去看一下
- 運行效果如下圖
- 可以看到我們的流處理程序每秒都在計算一次
- 然後這個時候我們clone session一個cmd窗口
- 執行命令:
nc -lk 8080
- 當你輸入這個命令之後就會讓你向我們指定的8080端口傳輸內容
- 我們就先來個包含 error的單行文本
- 此處我輸入的是errortest(忽略第一行,是我之前測試的數據)
- 然後我們再進入spark程序這個窗體,發現打印了我們輸入的errortest這行文本
第一個流處理程序運行正常,完美~