次のように、Spark Twitterをソースとして使用したストリーミングの例を実行しようとしています。
public static void main (String.. args) {
SparkConf conf = new SparkConf().setAppName("Spark_Streaming_Twitter").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaStreamingContext jssc = new JavaStreamingContext(sc, new Duration(2));
JavaSQLContext sqlCtx = new JavaSQLContext(sc);
String[] filters = new String[] {"soccer"};
JavaReceiverInputDStream<Status> receiverStream = TwitterUtils.createStream(jssc,filters);
jssc.start();
jssc.awaitTermination();
}
しかし、私は次の例外を受けています
Exception in thread "main" Java.lang.AssertionError: assertion failed: No output streams registered, so nothing to execute
at scala.Predef$.assert(Predef.scala:179)
at org.Apache.spark.streaming.DStreamGraph.validate(DStreamGraph.scala:158)
at org.Apache.spark.streaming.StreamingContext.validate(StreamingContext.scala:416)
at org.Apache.spark.streaming.StreamingContext.start(StreamingContext.scala:437)
at org.Apache.spark.streaming.api.Java.JavaStreamingContext.start(JavaStreamingContext.scala:501)
at org.learning.spark.TwitterStreamSpark.main(TwitterStreamSpark.Java:53)
この問題を修正する方法はありますか?
出力演算子が呼び出されると、ストリームの計算がトリガーされます。
DStreamに出力演算子がない場合、計算は呼び出されません。基本的に、ストリームで以下のいずれかのメソッドを呼び出す必要があります
print()
foreachRDD(func)
saveAsObjectFiles(prefix, [suffix])
saveAsTextFiles(prefix, [suffix])
saveAsHadoopFiles(prefix, [suffix])
http://spark.Apache.org/docs/latest/streaming-programming-guide.html#output-operations
最初に変換を適用し、必要に応じて関数を出力することもできます。
スレッド「メイン」の例外Java.lang.AssertionError:アサーションが失敗しました:出力ストリームが登録されていないため、何も実行されません
TL; DRprint
、saveAsTextFiles
などの使用可能な 出力演算子 のいずれかを使用しますforeachRDD
(または使用頻度が低いsaveAsObjectFiles
またはsaveAsHadoopFiles
)。
つまり、コードの次の行の間で出力演算子を使用する必要があります。
JavaReceiverInputDStream<Status> receiverStream = TwitterUtils.createStream(jssc,filters);
// --> The output operator here <--
jssc.start();
Spark公式ドキュメントの DStreamsでの出力操作 (私のものを強調表示)を引用:
出力操作を使用すると、DStreamのデータをデータベースやファイルシステムなどの外部システムにプッシュできます。出力操作では、実際に変換されたデータを外部システムで使用できるため、すべてのDStream変換の実際の実行をトリガーします(RDDのアクションと同様)。
ポイントは、出力演算子がないと「出力ストリームが登録されていないため、何も実行しない」です。
あるコメンターが気づいたように、出力変換を使用する必要があります。 print
を開始する前のforeachRDD
またはStreamingContext
。
内部的には、使用可能な出力演算子のいずれかを使用するときはいつでも、たとえばprint
またはforeach
、DStreamGraph
に 出力ストリームを追加 が要求されます。
新しいForEachDStreamが作成および登録される の後に登録を見つけることができます(これは 出力ストリームとして追加する に対して正確です)。
また、-wrongly-はこの問題を非難することに失敗しますが、実際の原因は非複数の数値です=ストリーミング入力からのスライドウィンドウ期間とRDD時間ウィンドウの間。 警告のみを記録します:修正すると、コンテキストの失敗が停止します:D