web-dev-qa-db-ja.com

Sparkにコードを実行させるにはどうすればよいですか?

遅延評価のために実行する必要がないと思われる場合でも、どうすればSparkにmapの呼び出しを実行させることができますか?

Map呼び出しでcache()を配置しようとしましたが、それでもトリックは実行されません。私のマップメソッドは、実際に結果をHDFSにアップロードします。だから、役に立たないわけではありませんが、Sparkはそう考えています。

28
MetallicPriest

短い答え:

強制的にSpark=変換を実行するには、結果を要求する必要があります。場合によっては、単純なcountアクションで十分です。

TL; DR:

OK、RDD操作を確認しましょう。

RDDsは、2種類の操作をサポートします。

  • transformations-既存のデータセットから新しいデータセットを作成します。
  • actions-データセットで計算を実行した後、ドライバープログラムに値を返します。

たとえば、mapは、各データセット要素を関数に渡し、結果を表す新しいRDDを返す変換です。一方、reduceは、何らかの関数を使用してRDDのすべての要素を集約し、ドライバープログラムに最終結果を返すアクションです(ただし、分散データセットを返すreduceByKeyもあります) )。

Spark)のすべての変換はlazyであり、は結果を正しく計算しない離れています

代わりに、一部のベースデータセット(ファイルなど)に適用された変換を覚えているだけです。 変換は、アクションが結果をドライバープログラムに返す必要がある場合にのみ計算されます。この設計により、Spark=をより効率的に実行できます。たとえば、mapで作成されたデータセットがreduceで使用され、reduceの結果のみをドライバーに返すことがわかります。より大きなマップされたデータセット。

デフォルトでは、変換された各RDDは、アクションを実行するたびに再計算されます。ただし、RDD(またはpersist)メソッドを使用してcacheをメモリに保持することもできます。この場合、Sparkは要素を保持しますクラスターを使用すると、次にクエリを実行するときに、より高速にアクセスできます。ディスク上のRDDsの永続化や、複数のノード間での複製もサポートされています。

結論

Spark= mapへの呼び出しを実行するように強制するには、結果を要求する必要があります。場合によってはcountアクションで十分です。

参照

33
eliasah

Spark transformations 行うべきことのみを記述します。実行をトリガーするには、 action が必要です。

あなたの場合、より深い問題があります。 HDFSにデータを保存するなど、何らかの副作用を引き起こすことが目標である場合、使用する正しい方法はforeachです。これはアクションであり、明確なセマンティクスを備えています。 mapと異なり、重要なことは、参照の透明性を意味するものではありません。

14
zero323