3

ゲームからのイベント ロギングに bigquery の使用を開始しました。

appengine ノードからイベントを収集し、タスク キューに配置されるチャンクにまとめてエンキューします。

次に、バックエンドがこのキューを処理し、イベントを bigquery にアップロードします。

現在、あるゲームから約 6,000 万件、別のゲームから約 600 万件の毎日のイベントを保存しています。

また、これらのイベントを処理してさまざまなゲーム KPI を収集する cron ジョブも作成しました。(つまり、2 日目のリテンション、アクティブ ユーザーなど)

すべてが順調に進みましたが、ここで厄介な問題に直面します。

======== 質問 1 ======================================= =======

何らかの理由で、キュー タスクの削除が失敗することがあります。それほど頻繁ではありませんが、バーストで発生することがよくあります。

TransientFailureException がおそらく原因です...プロセス イベントをバッチ モードで削除しているため、おそらくそうです。つまり...

List<Boolean> Queue.deleteTask(List<TashHandle> taskstoDelete)

...ということで、タスクの削除に失敗した理由は実際にはわかりません。

本日、失敗した削除を再度削除しようとする再試行コードを追加しました。

この種の問題に対処するためのベスト プラクティスはありますか?

========= 質問 2 ====================================== ================

重複検出

次の SQL は、 または小さいゲームの重複を見つけることに成功しましたが、大きいゲームのリソースを超えています。

SELECT DATE(ts) date, SUM(duplicates) - COUNT(duplicates) as duplicates
FROM (
  SELECT ts, eventId, userId, count(*) duplicates
  FROM [analytics_davincigameserver.events_app1_v2_201308]
  GROUP EACH BY ts, eventId, userId
  HAVING duplicates > 1
)
GROUP EACH BY date

より大きなゲームでも重複を検出する方法はありますか? つまり、bigquery が毎日 6,000 万行を処理し、重複を見つけることができるクエリです。

前もって感謝します!

4

1 に答える 1

1

質問 2 の場合 (この手順と混乱の機会をスキップするために、別の質問にした方がよいでしょう):

内部クエリまたは外部クエリでリソースが使い果たされていますか?

これは機能しますか?

SELECT ts, eventId, userId, count(*) duplicates
FROM [analytics_davincigameserver.events_app1_v2_201308]
GROUP EACH BY ts, eventId, userId
HAVING duplicates > 1

カーディナリティを減らすとどうなりますか?タイムスタンプでグループ化しているので、グループ化するには異なるバケットが多すぎる可能性があると思います。これはうまくいきますか?

SELECT ts, eventId, userId, count(*) duplicates
FROM [analytics_davincigameserver.events_app1_v2_201308]
WHERE ABS(HASH(ts) % 10) = 1
GROUP EACH BY ts, eventId, userId
HAVING duplicates > 1
于 2013-09-16T01:40:58.863 に答える