Simple Log Service が MaxCompute テーブルにデータを出荷した後、パーティションごとにデータの完全性を確認する必要があります。次のセクションでは、パーティション内のデータが完全かどうかを確認するために使用できる方法について説明します。
方法 1:予約フィールド __partition_time__ をパーティションキー列として使用する
__partition_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 コンソールを使用してデータの完全性を確認する
API 操作、SDK、または Simple Log Service コンソールを使用して、指定したプロジェクトまたはログストアからデータ出荷タスクを取得します。次の例は、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 がデータを受信した時刻を示します。時刻 T より前に Simple Log Service が受信したデータが、使用されている MaxCompute テーブルに出荷されているかどうかを確認できます。taskLastDataReceiveTimeで示される時刻がT + 300 秒で示される時刻よりも前で、T + 300 秒より前に完了した各出荷タスクが成功状態にある場合、時刻 T より前に Simple Log Service が受信したデータは MaxCompute テーブルに出荷されます。300 秒の時間オフセットは、フォールトトレランスに使用されます。たとえば、Simple Log Service へのデータ送信でエラーが発生し、再試行が実行されます。出荷タスクが ready または running 状態の場合、MaxCompute テーブルに出荷するデータは完全ではありません。この場合、タスクが完了するまで待つ必要があります。
出荷タスクが failed 状態の場合、障害のトラブルシューティングを行い、タスクを再試行する必要があります。障害が出荷構成に関連している場合は、構成を変更できます。
MaxCompute パーティションに基づいてデータの完全性を概算する
たとえば、MaxCompute テーブルが 30 分間隔でパーティション分割され、データが Simple Log Service から MaxCompute に 30 分間隔で出荷されるとします。MaxCompute テーブルには、次のパーティションが含まれています。
2017_05_19_10_00 2017_05_19_10_302017_05_19_11_00 パーティションが MaxCompute テーブルにある場合、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__ をパーティションキー列として使用することをお勧めします。
詳細については、「制限」をご参照ください。