FLINKパラレルカウンターを達成

1、インスピレーションは、HadoopのMapReduceの計算フレームワークの概念を達成カウンタFLINKから来ています。

アキュムレータ実現パラレルインタフェースによってカウントFLINK。FLINK並列管理が実装されています。

パブリック インターフェースアキュムレータ<V、Rは延びシリアライズ> 延びシリアライズ、Cloneableを

JobExecutionResulによる計数結果getAccumulatorResult T取得方法。

図2の例では、通常のプロセスフローフィールドにようにNULL、スペース、タブなど空、空のフィールドを数えます。このシナリオは、より一般的です。

パブリック クラスEmptyFieldsCountAccumulator {
     プライベート 静的な 最終文字列EMPTY_FIELD_ACCUMULATOR =「空のフィールド」

    パブリック 静的 ボイドメイン(文字列引数[])スロー例外{
         最終 ParameterToolのparams = ParameterTool.fromArgs(引数)を、

        最終 ExecutionEnvironmentのENV = ExecutionEnvironment.getExecutionEnvironment()。

        // Webインタフェースで使用可能なパラメータを作る
        。)(env.getConfig setGlobalJobParameters(のparams); 

        // データがセットされます
        、最終的なデータセット<StringTriple>ファイル= getDataSet(ENV、のparams)を、

        // 空のフィールドを有するフィルタライン
        の最終データセット<StringTriple> filteredLines = file.filter(新しいEmptyFieldFilter())。

        // ここでは、フィルタ行...でさらに処理を行うことができ
        JobExecutionResult結果。
        // 出力濾過ライン
        場合(params.has( "出力" )){ 
            filteredLines.writeAsCsv(params.get( "出力" ))。
            // プログラムの実行 
            結果を= env.execute(「アキュムレータ例」)。
        } { 
            System.out.printlnは(「印刷stdoutになる。出力パスを指定するには、--outputを使用します。」); 
            filteredLines.print(); 
            結果 = env.getLastJobExecutionResult()。
        } 

        // その登録キーを介してアキュムレータ結果を得る
        最終的な一覧<整数> emptyFields = result.getAccumulatorResult(EMPTY_FIELD_ACCUMULATOR)。
        System.out.format( "列ごとに検出された空のフィールドの数:%Sの\ n" 、emptyFields)。
    } 

    @SuppressWarnings( "チェックしない" 、プライベート 静的データセット<StringTriple> getDataSet(ExecutionEnvironmentのENV、ParameterToolのparamsは){
        もし(params.has( "入力" )){
             戻り env.readCsvFile(params.get( "入力" ))
                    .fieldDelimiter( ";" 
                    .pojoType(StringTriple。クラス)。
        } { 
            するSystem.out.printlnは(「デフォルトの入力データ・セットとEmptyFieldsCountAccumulator例を実行します。」)。
            System.out.println( "ファイル入力を指定するには、--input使用してください。" );
            返すenv.fromCollectionを(getExampleInputTuples()); 
        } 
    } 

    プライベート 静的コレクション<getExampleInputTuples(){ 
        コレクション <StringTriple> inputTuples = 新規のArrayList <StringTriple> (); 
        inputTuples.add( StringTriple( "ジョン"、 "ドウ"、 "Fooの筋力。" )); 
        inputTuples.add( StringTriple( "ジョー"、 "ジョンソン"、 "" )); 
        inputTuples.add(新しい StringTriple(ヌル、 "ケイト・モーン"、 "バーブルバード" )); 
        inputTuples.add( StringTriple( "ティム"、 "Rinny"、 "" )); 
        inputTuples.add( StringTriple(」新しい StringTriple( "アリシア"、 "ジャクソン"、 "" )); 
        inputTuples.add( StringTriple( "アリシア"、 "ジャクソン"、 "" )); 
        inputTuples.add( StringTriple( "トム"、 "ジャクソン"、 "A" )); 
        inputTuples.add( StringTriple( "エイミー"、 "LI"、 "B" ));
        返すinputTuplesを。
    } 

    / ** 
     *この機能は、一つ以上の空のフィールドを持っているすべての着信タプルをフィルタリングします。
     * そうすることで、EmptyFieldsCountAccumulator番号のEMPTY_FIELD_ACCUMULATOR})。
     * / 
    パブリック 静的 最終的な クラス EmptyFieldFilterは延び RichFilterFunction <StringTriple> { 

        //は各フィルタ関数インスタンスに新しいアキュムレータを作成
         // アキュムレータに後でマージすることができる
        プライベート 最終 VectorAccumulator emptyFieldCounter = 新しい)VectorAccumulator(。

        @Override 
        公共 ボイドオープン(最終設定パラメータ)がスロー例外{
             スーパー.open(パラメータ)。

            //アキュムレータインスタンス登録する
            。getRuntimeContext()addAccumulator(EMPTY_FIELD_ACCUMULATOR、
                     この.emptyFieldCounter)を、
        } 

        @Override 
        パブリック ブールフィルタ(最終StringTripleさt){
             ブール containsEmptyFields = 

            // 空のものを探してタプルフィールドを反復
            するためにint型の POS = 0; POS <t.getArity(); POS ++ ){ 

                最終 Stringフィールド= t.getField(POS)。
                もし(フィールド== nullの ||。field.trim()のisEmpty()){ 
                    containsEmptyFieldsの = trueに; 

                    // フィールドが遭遇した空、アップデートでのIF
                     // とACC 
                    この.emptyFieldCounter.add(POS); 
                } 
            } 

            戻りますcontainsEmptyFields; 
        } 
    } 

    / ** 
     *このカウントとACCのベクトルを維持呼び出し{ @link #add(整数)インクリメント} 
     * <I> N - </ I>コンポーネント番目のベクトル管理の大きさのベクトルが自動的に
     *整数カウンタ入力ベクトル出力はリストには、プレス位置カウントフィールドには、リストのフィールド数がインデックス位置にある、値がカウント結果です
     * /
    パブリック 静的 クラス VectorAccumulatorは実装アキュムレータ<Integer型、ArrayListを<Integer型>> {
         // 存储计数器向量
        民間 最終のArrayList <Integer型> resultVectorを。

        パブリックVectorAccumulator(){
             この新規のArrayList <> ()); 
        } 

        公共 VectorAccumulator(のArrayList <整数> resultVector){
             この .resultVector = resultVector。
        } 

        プライベート ボイド updateResultVector(int型の位置、int型デルタは){
             // 位置ベクトルが与えられた場合には、コンテナを展開するだけでは不十分であり
            、一方この .resultVector.size()<= 位置){
                 この .resultVector.add(0 ); 
            } 

            最終 int型のコンポーネント= この.resultVector.get(位置);
             この .resultVector.set(位置、コンポーネント+ デルタ); 
        } 

        // 指定された位置に1を加算
        @Override
         公共 ボイド追加(整数位置){ 
            updateResultVector(位置、 1 ); 
        } 

        @Override 
        公衆ArrayList <整数> getLocalValue(){
             戻り 、この.resultVector; 
        } 

        @Override 
        公共 ボイドresetLocal(){
             この.resultVector.clear(); 
        } 

        @Override 
        公共 ボイドマージ(アキュムレータ<整数のArrayList <整数>> OTHER){
             / / マージインデックスに従って2つのベクトルカウンタコンテナ、コンテナをマージする
            最終のArrayList <整数> = otherVector ; other.getLocalValue()
             のためにINT I = 0;私はotherVector.size()<; I ++のを){ 
                updateResultVector(I、otherVectorを。 )(i)を取得します。
            } 
        } 

        @Override 
        公共アキュムレータ<整数のArrayList <整数>> クローン(){
             戻り 新しい VectorAccumulatorを(新規のArrayList <>(この.resultVector))。
        } 

        @Override 
        パブリック文字列のtoString(){
             戻り StringUtils.join(この .resultVectorを、 ':' ); 
        } 
    } 


    パブリック 静的 クラス StringTripleが延び Tuple3 <文字列、文字列、文字列> { 

        パブリックStringTriple(){} 

        公共StringTriple(文字列F0、F1文字列、文字列F2){
             スーパー(F0、F1、F2)。
        } 

    } 

}

 

 

 

おすすめ

転載: www.cnblogs.com/asker009/p/11220905.html