FLINKアプリケーションアーキテクチャの開発入門

FLINKプログラムは、特定のプログラミングモードに従ってください。データストリームAPIと実質的に同じデータセットのAPIプログラムの構造を有しています。プログラムフローのサンプルコードなどのテキストファイルへの単語頻度統計。

package com.realtime.flink.streaming
import org.apache.flink.apijava.utils.ParameterTool
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment, _}

object WordCount {
    def main(args: Array[String]) {
        //第一步:设定执行环境
        val env = SreamExecutionEnvironment.getExecutionEnvironment
       //第二步:指定数据源地址,开始读取数据
        val text = env.readTextFile("file:///path/file") 
      //第三步:对数据集指定转换操作逻辑
      val counts : DataStream[(String, int)]  = text
          .flatMap(_.toLowerCase.split(" ")) 
          .fliter(_.nonEmpty)
          .map(_, 1)
          .sum(1)
      //第四步:指定计算结果输出位置
      if (params.has("output")) {
          counts.writeAsText(params.get("output"))
      } else {
        println("Printing resule to stdout. Use --output to specify output path.")
        counts.print()
      }
      //第五步:指定名称并触发流式任务
      env.execute("Streaming WordCount")
    }
}

FLINKプログラム全体の合計は、5つのステップに分けられます。

1. FLINK実行環境

異なる実行環境では、アプリケーションの種類を決定します。

環境を処理し、ExecutionEnvironmentバルクデータをストリーミングするためのStreamExecutionEnvironmen。

3通りの方法で環境を取得します。

  • ストリーム処理:

    //设定Flink运行环境,如果在本地启动则创建本地环境,如果在集群启动就创建集群环境
    StreamExecutionEnvironment.getExecutionEnvironment
    //指定并行度创建本地执行环境
    StreamExecutionEnvironment.createLocalEnvironment(5)
    //指定远程JobManager ip和RPC 端口以及运行程序所在的jar包和及其依赖包
    StreamExecutionEnvironment.createRemoteEnvironment("JobManagerHost", 6021, 5, "/user/application.jar")

    リモートコピープログラムを指定して、リモートクラスタJobManager RPC接続から直接ネイティブコードを作成するための第三の方法は、JobManagerノード、リモート環境で実行FLINKアプリケーション、ローカルのクライアントに対応したプログラムへのjarファイルを実行します。

  • バッチ:

  //设定Flink运行环境,如果在本地启动则创建本地环境,如果在集群启动就创建集群环境
 ExecutionEnvironment.getExecutionEnvironment
  //指定并行度创建本地执行环境
  ExecutionEnvironment.createLocalEnvironment(5)
  //指定远程JobManager ip和RPC 端口以及运行程序所在的jar包和及其依赖包
 ExecutionEnvironment.createRemoteEnvironment("JobManagerHost", 6021, 5, "/user/application.jar")

必要性は、実行環境に対応する異なる環境を導入する際に、異なる言語で開発されたノートFLINKアプリケーション

2.初期化データ

  • 実行環境を作成した後、ExecutionEnvironmentの必要性は、データの初期化のための異なるデータ・アクセス・インタフェースを提供するために、外部でDataStreamにデータを変換します またはデータセット データがセット。

  • FLINKは、バッチおよびリアルタイムデータコネクタを備え、外部コネクタから読み出された各種データを提供し、FLINKシステムは、他のサードパーティシステム、外部データへの直接アクセスに接続することができます。

  • 以下のコードはflle readTextFile()メソッドによって読み取られる:// pathfileデータパスとでDataStreamに変換しました データがセット。

val text: DataStream[String] = env.readTextFlie("flle://pathfile")

分散データ・セットにローカルファイルからでDataStream [文字列]データセットにファイル、完全な変換を読み出し

3.変換を実行します

データセット上の各種操作の変換は、それぞれが機能インタフェースを実装することによって定義演算子を完了するために、処理ロジック各データ内に実装され、異なるオペレータ、オペレータによって達成されます。

データストリームAPIとデータセットAPIのような多くの変換演算子、提供マップ、flatMap、フィルタ、keyByに、ユーザは、論理関数の各々がオペレータによって実行し、データ変換操作オペレータインターフェイスに適用される定義する必要があります。

 val counts: DataStream[String, Int] = text
     .flatMap(_.toLowerCase.split(" "))  //执行flatMap操作
     .filter(_.nonEmpty) //过滤空字段
     .map((_, 1) //执行map转换操作,转换成key - value 接口
     .keyBy(0) // 按照指定key对数据重分区
     .sum(1) /执行求和运算操作

関数定義FLINK計算ロジックは、以下の方法の完了により定義することができます。

1.クラス関数インタフェースを作成することによって達成しました

//实现MapFunction接口
 class MyMapFunction extends MapFunction[String, String] {
     override def map(t: String): String {
         t.toUpperCase()
     }
 }
 
 val dataStream: DataStream[String] = env.fromElements("hello", flink)
 //将MyMapFunction实现类传入进去
 dataStream.map(new MyMapFunction)

集中化されたデータ列を達成するためのデータ処理の完了は大文字に変換しました

匿名クラスを作成することにより、機能インタフェースを実装する2。

 val dataStream: DataStream[String] = env.fromElements("hello", flink)
 //通过创建MapFunction匿名实现类来定义map函数的计算逻辑
 dataStream.map(new MapFunction[String, String] {
     //实现对输入字符串大写转换
      override def map(t: String): String{
         t.toUpperCase()
     }
 })

RichFunctionインタフェースを実装すること3。

FLINK RichFunctionは、より高度なデータ処理シナリオのためのインタフェースを提供し、そこRichFunctionインターフェースオープン、クローズ、getRuntimeContext setRuntimeContextと内部状態データ、キャッシュシステムを取得し、MapFunctionは同様に、RichFunctionサブクラスもRichMapFunction。

//定义匿名类实现RichMapFunction接口,完成对字符串到整形数字的转换
 dataStream.map(new RichMapFunction[String, Int] {
     //实现对输入字符串大写转换
      override def map(in: String):Int = (in.toInt)
 })

パーティション・キーを指定します。4.

いくつかの演算子は、指定されたキーの変換を必要とする、共通のオペレータが有する:.参加、コグループ、GROUPBYデータストリームが主経路データに同一のパイプライン内の同じキーに、対応するデータセットまたはデータセットKeyedStreamとGroupDataSetに変換する必要があります

1.指定された場所フィールド

//DataStream API聚合计算

val dataStream : DataStream[(String,Int)] = env.fromElements(("a", 1),("c", 2))

//根据第一个字段重新分区,然后对第二个字段进行求和计算
val result = dataStream.keyBy(0).sum(1)
//DataSet API 聚合计算
val dataSet = env.fromElements(("a", 1),("c", 2))
//根据第一个字段进行数据重分区
val groupDataSet : GroupDataSet[(String , Int)] = dataSet.groupBy(0)
//求取相同key值第二个字段的最大值
groupDataSet.max(1)

に応じて、フィールドの名前を指定します。2.

データ構造の所望のタイプの名前を使用することでDataStreamタプルクラスまたはクラスのPOJOでなければなりません

val personDataSet = env.fromElements(new Person("Alex", 18), new Person("Peter", 43))
//指定name字段名称来确定groupBy 字段
 personDataSet.groupBy("name").max(1)

プログラムタプルのフィールド名のデータ・タイプは、通常、計算された位置のインデックスフィールドから起動した場合は、最初から計算されます0

val personDataStream = env.fromElements(new Person("Alex", 18), new Person("Peter", 43))
//通过名称指定第一个字段
personDataStream.keyBy("_1")

//通过位置指定第一个字段
personDataStream.keyBy(0)

ネストされた複雑なデータ構造:

class NestedClass {
    var id: int,
    tuples: (Long, Long, String)){
        def this() {
            this(0, (0, 0, " "))
        }
    }

class CompelexClass(var nested: NestedClass, var tag: String) {
    def this() {
        this(null, " ")
    }
}

「ネストされた」とは、全体NestedClassは、すべてのフィールドに、コールIDフィールド「タグ」GET CompelexClassタグフィールド、呼び出しは「nested.id」NestedClassを取得し、最初のフィールド元祖でGET NestedClassタプル「nested.tuples._1」と呼ぶオブジェクト取得

3.キーがセレクタで指定されています

定義されてKeySelector、その後のgetKey複製方法、指定されたキーから取得したPersonオブジェクト名。

case class Person(name: String, age: Int)
var person = env.fromElements(Person("hello", 1), Person("Flink", 3) )
//
val keyed: KeyedStream[WC] = person.keyBy(new KeySelector[Person, String](){
    override def getKey(person: Person): String = person.name
})

5.出力

データ変換動作の後に、典型的には、外部のシステムまたは基本的なデータ出力方法にコンソール.Flink添加に出力され、システムは、多くのコネクタで定義され、クラスDataSink AddSinkを(呼び出すことによって、ユーザ定義の出力システムのオペレータを追加します)、外部システムにこのデータを出力することができます。

//将数据输出到文件中
counts.writeAsText("file://path/to/savefile")
//将数据输出控制台
counts.print()

プログラムのトリガ

代わりに、すべての計算論理演算の定義、ExecutionEnvironmentを調整する必要がプログラムの実行をトリガする()メソッドを実行し、execute()メソッドは、型JobExecutionResultの結果を返し、JobExecutionResultアキュムレータは、時間、プログラムの実行の他の指標を含んでいます。

注:でDataStreamが表示コールにexecute()メソッドをアプリケーションのニーズをストリーミング、そうでない場合は、アプリケーションが実行されることはありませんが、オペレータのためのFLINKのDataSet APIの出力がすでにコール表示する必要がなくなり、()メソッドを実行するための呼び出しを含む、それ以外のプログラムが存在します。例外。

//调StreamExecutionEnvironment的execute()方法来执行流式应用程序
env.execute("App Name")

概要

;初期化データ、変換動作を行う、キー指定されたパーティション、いくつかの実装では、トリガ出力の詳細など、開発モデルの内部実行環境取得:この論文では、アプリケーション開発FLINKステップ5に記載されています。

おすすめ

転載: www.cnblogs.com/bigdata1024/p/12006450.html