史上最簡單的spark教程第十七章-快速開發部署第一個sparkStreaming+Java流處理程序


第一個流處理程序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這行文本
    在這裏插入圖片描述

第一個流處理程序運行正常,完美~

感興趣的兄弟可以關注,完整代碼都在git上,有問題留言交流,持續更新中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章