在Linux上安裝Flink以及編寫打包WordCount程序

在Linux上安裝Flink以及編寫打包WordCount程序

0. 預備知識

想要了解任何Apache下的平臺框架,官網一直都是一個不錯的學習途徑。

  • Flink是什麼

    Apache Flink 是一個框架和分佈式處理引擎,用於在無邊界和有邊界數據流上進行有狀態的計算。Flink 能在所有常見集羣環境中運行,並能以內存速度和任意規模進行計算。

    • 無界流和有界流

      任何類型的數據都可以形成一種事件流。信用卡交易、傳感器測量、機器日誌、網站或移動應用程序上的用戶交互記錄,所有這些數據都形成一種流。

      • 無界流:有定義流的開始,但沒有定義流的結束。它們會無休止地產生數據。無界流的數據必須持續處理,需要以特定順序攝取事件(如事件發生的順序),並且數據被攝取之後需要立刻處理。

      • 有界流:有定義流的開始,也有定義流的結束。有界流可以在攝取所有數據後再進行計算。有界流所有數據可以被排序,所以並不需要有序攝取。有界流處理通常被稱爲批處理。

  • 應用場景

    • 實時數倉與ETL

    • 實時報表分析

    • 實時智能推薦

    • 流數據分析

  • 基本組件

    Flink架構體系基本上分三層(自頂向下)

    • API&Libraries層 : 提供支撐流計算和批計算的接口,同時在此基礎上抽象出不同的應用類型的組件庫。
    • Runtime核心層:Flink分佈式計算框架的核心實現層,支持分佈式Stream作業的執行、JobGraph到ExecutionGraph的映射轉換、任務調度等。將DataStream和DataSet轉成同意的可執行的Task Operator。
    • 物理部署層: 目前Flink支持本地、集羣、雲、容器部署,Flink通過蓋層能夠支持不同平臺的部署,用戶可以根據需要選擇使用對應的部署模式。

    Flink集羣

    • Client客戶端 負責將任務提交到集羣,與JobManager構建Akka連接,然後將任務提交到JobManager,通過和JobManager之間進行交互獲取任務執行狀態。
    • JobManager 負責整個Flink集羣任務的調度以及資源的管理。
    • TaskManager 相當於整個集羣的Slave節點,負責具體的任務執行和對應任務在每個節點上的資源申請與管理。

1. 下載安裝

本案例相關的運行環境

  • 系統: Ubuntu 18.04
  • Java環境: Java8
  • Flink-7.6.1
  • Maven-3.3.9

1.1 安裝Flink

到Flink官網(https://flink.apache.org/downloads.html)下載安裝包,這裏我們選擇的版本是flink-1.9.1-bin-scala_2.11.tgz,如果官網網速太慢也可以點擊我分享的雲盤鏈接(鏈接:https://pan.baidu.com/s/1TtwXJxfBjjuY4bULoikttg 密碼:0e0y)進行下載。默認下載文件在用戶主目錄的Downloads中。然後,使用如下命令進行解壓:

cd /home/silver/Downloads
sudo tar -zxvf flink-1.9.1-bin-scala_2.11.tgz -C /usr/local

修改目錄名稱,並設置權限,命令如下:

cd /usr/local
sudo mv ./ flink-1.9.1 ./flink
sudo chown -R silver:silver ./flink

Flink對於本地模式是開箱即用的,如果要修改Java運行環境,可以修改“/usr/local/flink/conf/flink-conf.yaml”文件中的env.java.home參數,設置爲本地Java的絕對路徑。
使用如下命令添加環境變量:

vim ~/.bashrc

在.bashrc文件中添加如下內容:

export FLNK_HOME=/usr/local/flink
export PATH=$FLINK_HOME/bin:$PATH

保存並退出.bashrc文件,然後執行如下命令讓配置文件生效:

source ~/.bashrc

使用如下命令啓動Flink:

cd /usr/local/flink
./bin/start-cluster.sh

使用jps命令查看進程:

/usr/local/flink$ jps
13936 Jps
13400 StandaloneSessionClusterEntrypoint
13854 TaskManagerRunner

如果能夠看到TaskManagerRunner和StandaloneSessionClusterEntrypoint這兩個進程,就說明啓動成功。
Flink的JobManager同時會在8081端口上啓動一個Web前端,可以在瀏覽器中輸入“http://localhost:8081”來訪問。

1.2 檢查安裝是否成功_自帶WordCount測試樣例

Flink安裝包中自帶了測試樣例,這裏可以運行WordCount樣例程序來測試Flink的運行效果,具體命令如下:

cd /usr/local/flink/bin
./flink run /usr/local/flink/examples/batch/WordCount.jar

執行成功,可以看到如下輸出結果:

2. 編程實現WordCount程序

2.1 安裝Maven

Ubuntu中沒有自帶安裝Maven,需要手動安裝Maven。可以訪問Maven官網下載安裝文件,官網下載鏈接:http://apache.fayea.com/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip。 如果官網下載慢,也可以使用我分享的雲盤鏈接下載:(鏈接:https://pan.baidu.com/s/1SDOldLVjZ3sb3ONww-lfpA 密碼:awbc)。

下載完成之後,解壓並安裝

sudo unzip ~/Downloads/apache-maven-3.3.9-bin.zip -d /usr/local
cd /usr/local
sudo mv apache-maven-3.3.9/ ./maven
sudo chown -R hadoop ./maven

2.2 編寫代碼

Flink程序構成

編寫 Flink 程序一般經過如下幾個步驟:

​ 1)獲取執行環境( ExecutionEnvironment );

​ 2)加載/創建初始數據集;

​ 3)在數據集上進行各種轉換操作,生成新的數據集;

​ 4)指定計算結果輸出方式;

​ 5)開始執行。

首先在用戶主文件夾(/home/用戶名)下創建一個文件夾flinkapp作爲應用程序根目錄:

cd ~ #進入用戶主文件夾
mkdir -p ./flinkapp/src/main/java

然後,使用vim編輯器在“./flinkapp/src/main/java”目錄下建立三個代碼文件,即:

  • WordCountData.java --> 提供將要處理分析的原始數據
  • WordCountTokenizer.java --> Tokenizer分詞器
  • WordCount.java --> 主函數

####WordCountData.java

WordCountData.java用於提供原始數據。這裏我們處理的數據源類型是有界數據源,利用DataSet API對String[]中的數據進行批處理。(流處理程序用DataStream API)

package cn.stu.silver;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
 
public class WordCountData {
    public static final String[] WORDS=new String[]{"To be, or not to be,--that is the question:--", "Whether \'tis nobler in the mind to suffer", "The slings and arrows of outrageous fortune", "Or to take arms against a sea of troubles,", "And by opposing end them?--To die,--to sleep,--", "No more; and by a sleep to say we end", "The heartache, and the thousand natural shocks", "That flesh is heir to,--\'tis a consummation", "Devoutly to be wish\'d. To die,--to sleep;--", "To sleep! perchance to dream:--ay, there\'s the rub;", "For in that sleep of death what dreams may come,", "When we have shuffled off this mortal coil,", "Must give us pause: there\'s the respect", "That makes calamity of so long life;", "For who would bear the whips and scorns of time,", "The oppressor\'s wrong, the proud man\'s contumely,", "The pangs of despis\'d love, the law\'s delay,", "The insolence of office, and the spurns", "That patient merit of the unworthy takes,", "When he himself might his quietus make", "With a bare bodkin? who would these fardels bear,", "To grunt and sweat under a weary life,", "But that the dread of something after death,--", "The undiscover\'d country, from whose bourn", "No traveller returns,--puzzles the will,", "And makes us rather bear those ills we have", "Than fly to others that we know not of?", "Thus conscience does make cowards of us all;", "And thus the native hue of resolution", "Is sicklied o\'er with the pale cast of thought;", "And enterprises of great pith and moment,", "With this regard, their currents turn awry,", "And lose the name of action.--Soft you now!", "The fair Ophelia!--Nymph, in thy orisons", "Be all my sins remember\'d."};
    public WordCountData() {
    }
    public static DataSet<String> getDefaultTextLineDataset(ExecutionEnvironment env){
        return env.fromElements(WORDS);
    }
}

WordCountTokenizer.java

package cn.stu.silver;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
 
 
public class WordCountTokenizer implements FlatMapFunction<String, Tuple2<String,Integer>>{
 
    public WordCountTokenizer(){}
 
 
    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
        String[] tokens = value.toLowerCase().split("\\W+");
        int len = tokens.length;
 
        for(int i = 0; i<len;i++){
            String tmp = tokens[i];
            if(tmp.length()>0){
                out.collect(new Tuple2<String, Integer>(tmp,Integer.valueOf(1)));
            }
        }
    }
}

WordCount.java

package cn.stu.silver;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.utils.ParameterTool;
 
 
public class WordCount {
 
    public WordCount(){}
 
    public static void main(String[] args) throws Exception {
        ParameterTool params = ParameterTool.fromArgs(args);
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        env.getConfig().setGlobalJobParameters(params);
        Object text;
        //如果沒有指定輸入路徑,則默認使用WordCountData中提供的數據
        if(params.has("input")){
            text = env.readTextFile(params.get("input"));
        }else{
            System.out.println("Executing WordCount example with default input data set.");
            System.out.println("Use -- input to specify file input.");
            text = WordCountData.getDefaultTextLineDataset(env);
        }
 
        AggregateOperator counts = ((DataSet)text).flatMap(new WordCountTokenizer()).groupBy(new int[]{0}).sum(1);
        //如果沒有指定輸出,則默認打印到控制檯
        if(params.has("output")){
            counts.writeAsCsv(params.get("output"),"\n", " ");
            env.execute();
        }else{
            System.out.println("Printing result to stdout. Use --output to specify output path.");
            counts.print();
        }
 
    }
}

Maven 配置文件pom.xml (一定要加!還需要注意添加的路徑)

首先返回到~/flinkapp路徑

cd ~/flinkapp
sudo vim pom.xml

輸入i進入編輯模式,輸入以下配置:

<project>
    <groupId>cn.stu.silver</groupId>
    <artifactId>simple-project</artifactId>
    <modelVersion>4.0.0</modelVersion>
    <name>Simple Project</name>
    <packaging>jar</packaging>
    <version>1.0</version>
    <repositories>
        <repository>
            <id>jboss</id>
            <name>JBoss Repository</name>
            <url>http://repository.jboss.com/maven2/</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.11</artifactId>
<version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>1.9.1</version>
        </dependency>
    </dependencies>
</project>

2.3 使用Maven打包成Java程序

爲了保證Maven能夠正常運行,先執行如下命令檢查整個應用程序的文件結構:

cd ~/flinkapp
find .

文件結構如下:

注意pom.xml並不跟之前的三個.java程序在同一路徑下,而是直接和src處於同級目錄/文件

.
./src
./src/main
./src/main/java
./src/main/java/WordCountData.java
./src/main/java/WordCount.java
./src/main/java/WordCountTokenizer.java
./pom.xml

將整個應用程序打包成JAR包

cd ~/flinkapp    #一定把這個目錄設置爲當前目錄
/usr/local/maven/bin/mvn package

打包成功,屏幕會返回"BUILD SUCCESS"信息,如下:

2.4 通過Flink run命令運行程序

最後,可以將生成的JAR包通過flink run命令提交到Flink中運行(請確認已經啓動Flink),命令如下:

/usr/local/flink/bin/flink run --class cn.stu.silver.WordCount ~/flinkapp/target/simple-project-1.0.jar

執行結果:

Referrence

Flink安裝與編程實踐

Flink官方文檔-基礎API概念

Flink基本API的使用

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