初心者がflinkを学ぶために、IDEAでWordCountコードを記述し、次のようにエラーを実行します。
Exception in thread "main" java.lang.RuntimeException: No new data sinks have been defined since the last execution. The last execution refers to the latest call to 'execute()', 'count()', 'collect()', or 'print()'.
at org.apache.flink.api.java.ExecutionEnvironment.createProgramPlan(ExecutionEnvironment.java:1092)
at org.apache.flink.api.java.ExecutionEnvironment.createProgramPlan(ExecutionEnvironment.java:1072)
at org.apache.flink.api.java.ExecutionEnvironment.executeAsync(ExecutionEnvironment.java:969)
at org.apache.flink.api.java.ExecutionEnvironment.execute(ExecutionEnvironment.java:891)
at org.apache.flink.api.scala.ExecutionEnvironment.execute(ExecutionEnvironment.scala:509)
at com.fuyun.flink.WordCount$.main(WordCount.scala:42)
at com.fuyun.flink.WordCount.main(WordCount.scala)
コードは次のように表示されます。
package com.fuyun.flink
// 因为很多算子Java和Scala名称都一样,必须要显示导入scala所有包告知使用Scala语言的算子,不然会报错
import org.apache.flink.api.scala._
object BatchWordCount {
def main(args: Array[String]): Unit = {
// 定义输入输出文件路径
val input = "E:\\IDEAworkspace\\flinkLearning\\datas\\WordCount"
// 创建一个批处理的执行环境
val env:ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
// 读取离线文件
val inputDataSet:DataSet[String] = env.readTextFile(input)
// 对离线文件单词统计,不区分大小写
val counts = inputDataSet.flatMap(_.toLowerCase.split("\\s")) // 对元素转换为小写再进行分割
.filter(_.nonEmpty) // 过滤空值
.map((_, 1)) // 将元素组合成二元组
.groupBy(0) // 对第一个元素进行分组
.sum(1) // 对第二个元素求和
// 控制台答应结果
counts.print()
// 调用execute方法执行
env.execute("bath word count")
}
}
問題の原因と解決策:
エラーログから、最後の実行以降、新しいデータレシーバーが定義されていないことがわかります。「count()」、「collect()」、「print()」などのオフラインバッチ演算子には、シンク関数とトリガー関数の両方があります。
上記のprint()メソッドを呼び出しました。これは自動的に実行をトリガーするため、エグゼキュータの最後の行には実行するデータがありません。したがって、コードの最後の行を削除するだけで、print()メソッドを使用した後にexecute()メソッドを呼び出す必要はありません。