Simple Log ServiceがMaxComputeテーブルにデータを送信した後、パーティションごとにデータの完全性を確認する必要があります。 次のセクションでは、パーティション内のデータが完全であるかどうかを確認するために使用できる方法について説明します。
方法1: 予約済みフィールド __partition_time__
をパーティションキー列として使用する
__partition_time__
はログのtimeフィールドから取得します。 timeフィールドの値は、ログのタイムスタンプです。 タイムスタンプは、時間に指定した形式に基づいて__partition_time__の値を生成するために、最も近い時間に切り捨てられます。 ログのタイムスタンプは、ログが出荷された時刻でもなく、ログがSimple log Serviceに書き込まれた時刻でもありません。
たとえば、ログのタイムスタンプは2017-05-19 10:43:00、__partition_time__に指定する形式はyyyy_MM_dd_HH_mm
で、ログは1時間間隔で出荷されます。 この例では、ログがSimple log Serviceに書き込まれた時間に関係なく、ログがMaxComputeに出荷された後、ログは2017_05_19_10_00
パーティションに保存されます。 計算の詳細については、「MaxComputeへのログの送信 (旧バージョン) 」をご参照ください。
ログがリアルタイムでSimple Log Serviceに書き込まれ、履歴ログがSimple Log Serviceに書き込まれていない場合は、次のいずれかの方法でパーティションデータが完成しているかどうかを確認できます。
(推奨) API操作、SDK、またはSimple Log Serviceコンソールを使用してデータの完全性を確認する
GetShipperStatus、SDK、またはSimple Log Serviceコンソールを使用して、指定したプロジェクトまたはLogstoreからデータ配布タスクを取得します。 次の例は、API操作によって返されるタスクを示しています。 Simple Log Serviceコンソールは、返されたタスクを視覚化できます。
{ "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がデータを受信する時刻を示します。 Simple Log Serviceが時刻Tより前に受信したデータが、使用されているMaxComputeテーブルに送信されているかどうかを確認できます。taskLastDataReceiveTime
で示される時刻が、Tプラス300秒
で示される時刻より前であり、Tプラス300秒で示される時刻より前に完了した各出荷タスクが成功状態にある場合、Simple Log Serviceが時刻Tより前に受信したデータはMaxComputeテーブルに出荷されます。 300秒の時間オフセットは、フォールトトレランスのために使用される。 たとえば、Simple Log Serviceへのデータ送信でエラーが発生し、再試行が実行されます。配送タスクが準備完了または実行中の状態の場合、MaxComputeテーブルに配送するデータは完全ではありません。 この場合、タスクが完了するまで待つ必要があります。
配送タスクが失敗状態の場合は、失敗のトラブルシューティングを行い、タスクを再試行する必要があります。 失敗が出荷設定に関連している場合は、設定を変更できます。
MaxComputeパーティションに基づいてデータの完全性を大まかに評価する
たとえば、MaxComputeテーブルは30分間隔でパーティション分割され、データは30分間隔でSimple Log ServiceからMaxComputeに出荷されます。 MaxComputeテーブルには、次のパーティションが含まれます。
2017_05_19_10_00 2017_05_19_10_30
MaxComputeテーブルに2017_05_19_11_00パーティションが見つかった場合、2017_05_19_10_00および2017_05_19_10_30パーティションに格納されているデータは完了です。
この方法は使いやすく、API呼び出しを必要としません。 しかしながら、評価結果は不正確であり得る。
方法2: カスタムログフィールドをパーティションキー列として使用する
たとえば、ログに日付フィールドが含まれ、日付フィールドの値は20170518と20170519です。 データ配布ルールを設定すると、日付フィールドがパーティションキー列にマップされます。
この例では、日付フィールドの値とデータがSimple Log Serviceに書き込まれる時刻の違いに注意する必要があります。 次に、方法1とデータがSimple Log Serviceに書き込まれる時刻に基づいて、パーティションデータが完了しているかどうかを確認します。
出荷タスクは成功しましたが、MaxComputeテーブルのデータは完全ではありません。 どうすればよいですか。
この問題は、次の理由で発生する可能性があります。
パーティションキー列にマップされているSimple Log Serviceフィールドは存在しません。 この場合、パーティションキー列の値はnullで、MaxComputeテーブルでは使用できません。
パーティションキー列にマップされるSimple Log Serviceフィールドの値には、スラッシュ (/) またはその他の特殊文字が含まれます。 これらの文字はMaxComputeでは予約語であり、パーティションキー列では使用できません。
上記のいずれかの理由が存在する場合、システムは関連するログをスキップし、他のログを送信し続けます。 他のログのパーティションキー列にマッピングエラーが発生しなかった場合、これらのログは正常にパーティションに送信されます。
この問題を解決するには、パーティションキー列の設定を変更します。 予約済みフィールド __partition_time__
をパーティションキー列として使用することを推奨します。
詳細については、「制限事項」をご参照ください。