コンパイラーの実装ガイドライン
このトピックでは、開発者がコンパイラーを実装する際に考慮すべき重要な警告の一覧を示します。 開発者がこれらのガイドラインを考慮して、コンパイラーのパフォーマンスが低下したり、正しく動作しなくなったりする可能性を減らすことが重要です。
ドライバを設定して実行します
は Driver
、 Spark での分散処理を制御します。 Spark が実行するタスクを定義することは、開発者が処理ライブラリにアクセスするための主要なエントリポイントです。
を設定する Driver
に DriverSetup
は、開発者がインターフェイスの子のいずれかを実装する必要があります。 ここでは、コンパイラーをインスタンス化し、最終的にブロードキャスト変数を準備し、すべてをワイヤリングして適合させるコードを示します。
この目的のためにDriverBuilder
を使用して、DriverSetupWithBuilder
インターフェイスを実装することをお勧めします。 開発者は、を実装して手動でドライバータスクを設定することもでき DriverSetupManual
ます。
パイプラインの実行を支援 PipelineRunner
するために、ライブラリは特性を提供します。この特性は、コマンド ラインを解析し、パイプライン API とのシームレスな統合をサポートする Scala のメインメソッドを実装します。
Scala 開発者は、PipelineRunner
とDriverSetup
の適切な子を混合する Scala オブジェクトを 1 つ作成します。 選択したインターフェイスから取得した抽象メソッドを実装した後、そのオブジェクトはパイプライン API または手動でコマンド ラインから直接実行できます。
Java 開発者 は、 Java バインディングからPipelineRunner
を使用します。 の現在の実装では、は直接公開 Driver
されません。 DriverSetupWithBuilder
開発者が実装しているインターフェイスがすでに混合されている抽象クラスです。
決定論
Spark は、フィルタ、マップ、 groupBy 、 reduceByKey などのさまざまな RDD 変換に渡される関数の決定論に依存しています。 などがあります。 これらの関数は、次のように、引数に複数回適用できます。
- タスクが失敗し、再試行された場合
- 永続性がないか、または以前に計算された RDD パーティションがキャッシュから削除されたために、同じ RDD パーティションがタスクによって複数回計算された場合
Spark が正しく動作するには、これらの関数が確定的に動作することが必要です。つまり、同じ入力パラメータに関数を適用すると、常に同じ結果が返されます。
同様に、データ プロセッシング ライブラリおよびインクリメンタル・コンパイルでは、データ処理を確定的に行う必要があります。同じ入力バージョンで同じ入力カタログで複数回実行する場合、タスクはまったく同じコミットを生成する必要があります。 つまり、作成されたパーティションとそのペイロードが同一である必要があります。
カタログには、ペイロードのチェックサムが含まれています。 そのため、変更されたペイロードのみを適切にアップロードするには、処理ロジックを決定論的にし、入力が変更されなかった場合に同じ出力を生成する必要があります。
ただし、多くの Scala コンテナでは、要素の確定的な順序付けは保証されていません。 たとえば、Seq
は決定論を約束しますが、Iterable
、Map
、Set
、などのコンテナは約束しません。 これらのコンテナを処理するコードは、順序に関係なく同じ結果を生成するため、要素の順序に依存してはなりません。
この課題の解決策は実装固有ですが、通常はコンテナー要素の安定した並べ替えや、などの通勤的な変形の適用が含ま sum
れます。
RDD の永続性ポリシー
これは 、 RDD ベースのパターンにのみ適用されます。
実行者と一部のコンパイラは RDD レベルで動作します。つまり、各実行者またはコンパイラが実装する関数から RDD が渡されます。 渡されて返される DDs の永続性について、共通のポリシーを定義することが重要です。 そうしないと、 Spark が例外をスローするリスクがあります。一部の DDs が異なるストレージレベルで 2 回持続する可能性があるためです。
このポリシーは次のとおりです。
- 各実行関数に渡された DDs は、実装によって保持されることなく、効率的に複数回再利用できることが保証されます。 実装 で は、渡された DDs は保持されません。 これらはすでにライブラリによって保持されているか、または複数回効率的に再利用できることが保証されています。 したがって、渡された DDs が、または同等であることが保証されているにもかかわらず、実装
require
またはassert
その DDs が永続化されないものとします。 - 各実行関数によって返される DDs は、永続化する必要はありません。 実装に役立つ場合は永続化できますが、必須ではありません。 処理中のライブラリは、まだ永続化されていない場合に、戻された RDD を保持できます。