ストリーム処理とバッチ処理の Flink の Java 実装の予備調査

端午節の休暇中は夏が暑く、気温が 40 度を超える日が続きます。自宅で Flink 関連の知識を学び、今後の参考のために記録してください。
開発ツール:IntelliJ Idea
Flinkバージョン:1.13.0
今回は主にバッチ処理(DataSet API)とストリーム処理(DataStream API)の実装にFlinkを使用します。

最初のステップでは、プロジェクトを作成し、依存関係を追加します。

1) 新しいプロジェクトを作成する
[アイデア] を開き、新しい Maven プロジェクトを作成し、パッケージとプロジェクトに名前を付け、[OK] をクリックしてプロジェクトに入ります。
ここに画像の説明を挿入
2) 依存関係
を導入するpom.xmlファイルに依存関係 (Flink-java、flink-streaming、slf4j など) を追加するには、次のコードを参照できます。

<properties>
    <flink.version>1.13.0</flink.version>
    <java.version>1.8</java.version>
    <scala.binary.version>2.12</scala.binary.version>
    <slf4j.version>1.7.2</slf4j.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>${
    
    flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_${
    
    scala.binary.version}</artifactId>
        <version>${
    
    flink.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_${
    
    scala.binary.version}</artifactId>
        <version>${
    
    flink.version}</version>
    </dependency>
    <!-- 日志-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${
    
    slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${
    
    slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.16.0</version>
    </dependency>
</dependencies>

3) ログファイルの追加
リソースディレクトリにログファイルを追加しますlog4j.プロパティ, 以下に示す内容です。

log4j.rootLogger=error,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=@-4r [%t] %-5p %c %x - %m%n
2 番目のステップはデータセットを構築することです

プロジェクトの下に新規作成入力フォルダー、データセットを保存するために使用され、その下に新しいデータセットを作成します言葉.txtテストデータセットであるファイルを次の図に示します。
ここに画像の説明を挿入

3 番目のステップ、ビジネス コードを作成する

データセットの内容を読み取り、単語の単語数をカウントします。新しい BatchWordCout クラスを作成し、データ セットを読み取って印刷する 6 つの手順を紹介します。
方法 1.
バッチ処理 DataSet API の主な処理手順は、
1) 実行環境を作成する、
2) 環境からデータを読み取る、
3) データの各行をセグメント化し、バイナリ タイプのフラット マップに変換する、
4) グループ化する、です。 word ;
5) グループ内の統計の集計;
6) 結果の印刷
バッチ処理の DataSet API は次のように記述されます。

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.operators.FlatMapOperator;
import org.apache.flink.api.java.operators.UnsortedGrouping;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

public class BatchWordCount {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //1、创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        // 2、从环境中读取数据
        DataSource<String> lineDataSource = env.readTextFile("input/words.txt");
        // 3、将每行数据进行分词,转化成二元组类型 扁平映射
        FlatMapOperator<String,Tuple2<String,Long>> wordAndOneTuple = lineDataSource.flatMap((String line, Collector<Tuple2<String,Long>> out) -> {
    
    
            // 将每行文本进行拆分
            String[] words = line.split(" ");
            // 将每个单词转化成二元组
            for(String word : words){
    
    
                out.collect(Tuple2.of(word,1L));
            }
        }).returns(Types.TUPLE(Types.STRING,Types.LONG));
        // 4、按照word进行分组
         UnsortedGrouping<Tuple2<String,Long>> wordAndOneGroup =  wordAndOneTuple.groupBy(0);
         // 5、分组内进行聚合统计
        AggregateOperator<Tuple2<String, Long>> sum = wordAndOneGroup.sum(1);
        // 6、打印结果
        sum.print();

    }

コンソールの印刷効果を次の図に示します。
ここに画像の説明を挿入
Flink バージョン 1.12 以降では、DataSet API を直接使用すること、つまり、バッチ処理のタスクを送信するときに実行モードを BATCH に変更することが公式に推奨されています。
$bin/flink run -Dexecution.runtime-mode=BATCH バッチワードカウント.jar

方法 2. ストリーム処理
DataStream API ストリーム処理の処理手順はバッチ処理と似ていますが、主な違いは実行環境が異なることです。

import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

public class BatchSteamWordCount {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 1、创建流式执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 2、读取文件
        DataStreamSource<String> lineDataStreamSource = env.readTextFile("input/words.txt");
        // 3、转换计算
        SingleOutputStreamOperator<Tuple2<String, Long>> wordAndOneTuple = lineDataStreamSource.flatMap((String line, Collector<Tuple2<String, Long>> out) -> {
    
    
            // 将每行文本进行拆分
            String[] words = line.split(" ");
            // 将每个单词转化成二元组
            for (String word : words) {
    
    
                out.collect(Tuple2.of(word, 1L));
            }
        }).returns(Types.TUPLE(Types.STRING, Types.LONG));
        // 4、分组
        KeyedStream<Tuple2<String, Long>, Object> wordAndOneKeyedStream = wordAndOneTuple.keyBy(data -> data.f0);
        // 5、求和
        SingleOutputStreamOperator<Tuple2<String, Long>> sum = wordAndOneKeyedStream.sum(1);
        // 6、打印结果
        sum.print();
        // 7、启动执行
        env.execute();
    }
}

コンソール出力を次の図に示します。
ここに画像の説明を挿入
出力された結果から、マルチスレッドの実行が異常であることがわかります。数字の最初の列は、ローカル オペレーティング環境の CPU コアの数に関連しています。

参照文書

【1】https://www.bilibili.com/video/BV133411s7Sa?p=9&vd_source=c8717efb4869aaa507d74b272c5d90be

おすすめ

転載: blog.csdn.net/u012190388/article/details/131363414