web-dev-qa-db-ja.com

道路の平均速度を計算する

データエンジニアの面接に行ってきました。インタビュアーが私に質問しました。彼は私にいくつかの状況を与え、そのシステムのデータフローを設計するように頼みました。私はそれを解決しましたが、彼は私の解決策を嫌い、失敗しました。その課題を解決するためのより良いアイデアがあるかどうか知りたいのですが。

質問は:

私たちのシステムは4つのデータストリームを受信します。データには、車両ID、速度、地理位置情報の調整が含まれています。すべての車両は1分に1回データを送信します。特定の小川と特定の道路や車両などには何の関係もありません。コーディネートを受け付けて道路区間名を返す機能があります。 5分あたりの道路セクションごとの平均速度を知る必要があります。最後に、結果をKafkaに書き込みます。

enter image description here

だから私の解決策は:

まず、すべてのデータをKafkaクラスタの1つのトピックに書き込みます。緯度の最初の5〜6桁を経度の最初の5〜6桁に連結して区切られます。次に、データを読み取ります。構造化ストリーミングによって、各行に調整ごとに道路セクション名を追加し(そのために事前定義されたudfがあります)、道路セクション名でデータをまとめます。

データをKafkaで調整の最初の5桁から6桁で分割するため、調整をセクション名に変換した後は、大量のデータを正しいパーティションに転送する必要がないため、フルシャッフルをトリガーしないcolesce()操作を利用できます。

次に、エグゼキューターごとの平均速度を計算します。

プロセス全体は5分ごとに発生し、最後のKafkaシンクに追加モードでデータを書き込みます。

enter image description here

繰り返しになりますが、面接担当者は私の解決策を嫌いました。誰かがそれを改善する方法や完全に異なるより良いアイデアを提案できますか?

21
Alon

このソリューションで私が目にする主な問題は次のとおりです。

  • マップの6桁の正方形の端にある道路セクションには、複数のトピックパーティションにデータがあり、複数の平均速度があります。
  • Kafkaパーティションの取り込みデータサイズが不均衡である可能性があります(都市と砂漠)。車のIDの最初の数字でパーティション化することは、IMOの良いアイデアかもしれません。
  • 合体部分をたどったかどうかはわかりませんが、問題があるようです。

Kafka stream-> UDF-> groupby road section-> average-> write to Kafka stream。

0
David Taub

私のデザインは

  1. 道路の数
  2. 車両数
  3. 座標からの道路の計算コスト

任意の数にスケーリングしたい場合、デザインは次のようになります enter image description here

この設計に関する相互の懸念-

  1. 入力ストリームの永続的な状態を維持します(入力がkafkaの場合、Kafkaまたは外部で)を使用してオフセットを保存できます)
  2. 定期的にチェックポイントの状態を外部システムに(私は Flinkの非同期チェックポイントバリア を使用することをお勧めします)

この設計で可能ないくつかの実用的な拡張-

  1. 可能であれば、道路に基づいて道路セクションマッピング機能をキャッシュする
  2. 失敗したpingの処理(実際には、すべてのpingが使用できるわけではありません)
  3. 道路の曲率を考慮に入れる(方位と高度を考慮)
0
yugandhar