私は、テキストファイルとmysqlの両方のレコードを読み込み、それらを照合しようとする単純なパイプラインを持っています。つまり、DBに存在しないレコードを挿入し、DBのレコードをファイルで更新し、ファイルに存在しないDB内のレコードに追加します。SparkにBeam Tasksを均等に分配する方法は?
スパークで2Mレコードを実行したときに生じる問題は以下の通りです:
私の勘では、次のコードは、ここではその不均衡
final TupleTag<FileRecord> fileTag = new TupleTag<>();
final TupleTag<MysqlRecord> mysqlTag = new TupleTag<>();
PCollection<KV<Integer, CoGbkResult>> joinedRawCollection =
KeyedPCollectionTuple.of(fileTag, fileRecords)
.and(mysqlTag, mysqlRecords)
.apply(CoGroupByKey.create());
を生産していることであるスパークです実行者DAG可視化
最終的に、1人のワーカーはメモリ不足になります。私はSparkでネイティブに、作業者間で作業負荷を分散させるのに役立つPartitionersを指定できます。しかし、どのようにビームでそれを行うのですか?
EDIT:
私は、複数のPCollectionsにそれを分割し、後でそれらを平らになるようJDBCIoが正しく1つのクエリを配布することができなかったことを疑いました。私はMysqlからはるかに速く読んだが、最終的には同じ問題に遭遇した。
実際には、この不均衡の原因は、多くのレコードを持つMySQLからの読んだステップだからです。 JDBCIOはおそらく1つのSELECTクエリを配布しないので、その競合を参照します。私はそれを分割しようとしましょう。 – nambrot