データエンジニアの面接に行ってきました。インタビュアーが私に質問しました。彼は私にいくつかの状況を与え、そのシステムのデータフローを設計するように頼みました。私はそれを解決しましたが、彼は私の解決策を嫌い、失敗しました。その課題を解決するためのより良いアイデアがあるかどうか知りたいのですが。
質問は:
私たちのシステムは4つのデータストリームを受信します。データには、車両ID、速度、地理位置情報の調整が含まれています。すべての車両は1分に1回データを送信します。特定の小川と特定の道路や車両などには何の関係もありません。コーディネートを受け付けて道路区間名を返す機能があります。 5分あたりの道路セクションごとの平均速度を知る必要があります。最後に、結果をKafkaに書き込みます。
だから私の解決策は:
まず、すべてのデータをKafkaクラスタの1つのトピックに書き込みます。緯度の最初の5〜6桁を経度の最初の5〜6桁に連結して区切られます。次に、データを読み取ります。構造化ストリーミングによって、各行に調整ごとに道路セクション名を追加し(そのために事前定義されたudfがあります)、道路セクション名でデータをまとめます。
データをKafkaで調整の最初の5桁から6桁で分割するため、調整をセクション名に変換した後は、大量のデータを正しいパーティションに転送する必要がないため、フルシャッフルをトリガーしないcolesce()操作を利用できます。
次に、エグゼキューターごとの平均速度を計算します。
プロセス全体は5分ごとに発生し、最後のKafkaシンクに追加モードでデータを書き込みます。
繰り返しになりますが、面接担当者は私の解決策を嫌いました。誰かがそれを改善する方法や完全に異なるより良いアイデアを提案できますか?
このソリューションで私が目にする主な問題は次のとおりです。
Kafka stream-> UDF-> groupby road section-> average-> write to Kafka stream。
私のデザインは
任意の数にスケーリングしたい場合、デザインは次のようになります
この設計に関する相互の懸念-
この設計で可能ないくつかの実用的な拡張-