Simple Log Service から MaxCompute にデータを転送する際は、パーティションレベルでデータの完全性を検証します。このチェックにより、MaxCompute テーブルの特定のパーティションのすべてのデータが配信されたことを確認します。
データ完全性の検証
予約済みフィールド
__partition_time__ フィールドの使用
__partition_time__ の値は、ログの time フィールドから派生します。Simple Log Service は、指定された時刻フォーマット文字列に基づいてログのイベント時間を切り捨てることで、この値を計算します。イベント時間とは、データが転送されたりサーバーに書き込まれたりした時間ではなく、ログの実際の時間です。
例えば、ログのイベント時間が 2017-05-19 10:43:00 で、パーティションのフォーマット文字列が yyyy_MM_dd_HH_mm に設定され、データが 1 時間ごとに転送される場合、MaxCompute はサーバーへの書き込み時間に関係なく、このログを 2017_05_19_10_00 パーティションに保存します。この計算の詳細については、「MaxCompute へのログの転送 (レガシー)」をご参照ください。
既存データではなくリアルタイムでログを書き込んでいる場合は、以下のいずれかの方法を使用して、パーティション内のデータが完全であるかを確認します。
-
API、SDK、またはコンソールを使用します。これは推奨される方法です。
API、SDK、またはコンソールを使用して、特定のプロジェクトと Logstore の転送タスクを取得します。API はタスクのリストを返し、コンソールはそれを可視化します。以下は API 応答の例です。
{ "count" : 10, "total" : 20, "statistics" : { "running" : 0, "success" : 20, "fail" : 0 } "tasks" : [ ... { "id" : "abcdefghijk", "taskStatus" : "success", "taskMessage" : "", "taskCreateTime" : 1448925013, "taskLastDataReceiveTime" : 1448915013, "taskFinishTime" : 1448926013 }, { "id" : "xfegeagege", "taskStatus" : "success", "taskMessage" : "", "taskCreateTime" : 1448926813, "taskLastDataReceiveTime" : 1448930000, "taskFinishTime" : 1448936910 } ] }taskLastDataReceiveTimeは、Simple Log Service がデータを受信した時刻を示します。このパラメーターを使用して、時刻 T より前のすべてのデータが MaxCompute テーブルに配信されたかどうかを判断できます。-
時刻
T + 300sより前のtaskLastDataReceiveTimeを持つすべての転送タスクのステータスがsuccessであれば、時刻 T より前のデータは完全であると見なすことができます。300 秒のバッファーは、一時的なエラーによるリトライの可能性を考慮したものです。 -
いずれかのタスクが
readyまたはrunning状態の場合、データ配信はまだ進行中です。これらのタスクが完了するまで待機してください。 -
いずれかのタスクが失敗した場合は、原因を調査して問題を解決し、タスクをリトライしてください。問題を修正するために、転送タスクの構成を変更する必要がある場合があります。
-
-
MaxCompute パーティションに基づいて完全性を推定する
例えば、MaxCompute テーブルをパーティション分割し、転送タスクを 30 分ごとに実行すると、次のようなパーティションが表示されます。
2017_05_19_10_00 2017_05_19_10_302017_05_19_11_00 パーティションが作成されると、それ以前のすべてのパーティション (11:00 より前) のデータは完全であると見なすことができます。
この方法はより簡単で API を必要としませんが、精度は低く、おおよその推定しかできません。
カスタムフィールド
このメソッドの仕組み
例えば、ログには 20170518 や 20170519 などの値を持つ date フィールドが含まれている場合があります。転送ルールを構成する際に、この date フィールドをパーティションキー列にマッピングできます。
この場合、date フィールドの値とログの書き込み時間の差も考慮する必要があります。完全性を検証するには、データ受信時刻に依存する「予約済みフィールドをパーティションキー列として使用してデータ完全性を検証する」で説明されている方法と組み合わせます。
トラブルシューティング
タスクは成功するがデータが欠落している場合
転送タスクが成功したにもかかわらず、MaxCompute テーブルにデータが欠落している場合は、次のいずれかの原因が考えられます。
-
パーティションキー列にマッピングされている Simple Log Service のソースフィールドが存在しない。これにより、パーティションキーの値が
nullになりますが、これは MaxCompute では許可されていません。 -
パーティションキー列にマッピングされている Simple Log Service フィールドの値に、スラッシュ (
/) やその他の特殊文字が含まれている。MaxCompute はこれらの文字を予約語として扱うため、パーティションキーの値での使用を禁止しています。
これらの問題が発生すると、転送タスクは無効なログをスキップして処理を続行します。タスクは、他の有効なログを正しいパーティションに配信します。
したがって、タスクのステータスが success であっても、フィールドマッピングが正しくないとデータ損失が発生する可能性があります。これを解決するには、パーティション列の構成を修正してください。パーティション分割には、予約済みフィールドである __partition_time__ を使用することを推奨します。
詳細については、「制限事項」をご参照ください。