Log Serviceがログを収集した後、データの保存と分析のためにログをMaxComputeテーブルに送信できます。 このトピックでは、新しいバージョンのデータシッピングジョブを作成して、データをMaxComputeに送信する方法について説明します。
前提条件
プロジェクトと Logstore が作成済みである必要があります。 詳細については、「プロジェクトとLogstoreの作成」をご参照ください。
ログが収集されていること。 詳細については、「データ収集の概要」をご参照ください。
Log Serviceプロジェクトが存在するリージョンにMaxComputeパーティションテーブルが作成されます。 詳細については、「テーブルの作成」をご参照ください。
使用上の注意
新しいバージョンのデータ配送機能を使用して、中国 (北京) 、中国 (張家口) 、中国 (杭州) 、中国 (上海) 、中国 (深セン) 、中国 (深セン) 、中国 (香港) 、ドイツ (フランクフルト) 、マレーシア (クアラルンプール) 、米国 (バージニア) 、米国 (シリコンバレー) 、日本 (東京) 、シンガポール、インドネシア (ジャカルタ) 、英国 (ロンドン) 。 他のリージョンでこの機能を使用する場合は、
char型またはvarchar型のフィールド値が指定された長さを超える場合、値はMaxComputeに出荷された後に切り捨てられ、余分な部分は破棄されます。
たとえば、最大長が3に設定され、フィールド値が012345の場合、値がMaxComputeに出荷された後、値は012に切り捨てられます。
string型、char型、またはvarchar型のフィールド値が空の文字列の場合、値はMaxComputeに出荷された後にNullに変換されます。
datetime型のフィールド値は、YYYY-MM-DD HH:mm:ss形式である必要があります。 DDとHHの間に複数のスペースが存在できます。 datetime型のフィールド値が無効な形式の場合、値はMaxComputeに送信できますが、値はNullに変換されます。
日付タイプのフィールド値が無効な形式の場合、値はMaxComputeに送信できますが、値はNullに変換されます。
小数型のフィールド値の小数点の後の桁数が指定された制限を超えると、値は丸められ、切り捨てられます。 小数点以下の桁数が指定された制限を超えると, ログ全体がダーティデータとして破棄され, 失敗したログの数が増加します。
デフォルトでは、ダーティデータはデータ転送中に破棄されます。
ログに存在しない値がMaxComputeに送信された場合、値はデフォルト値またはNullに変換されます。
MaxComputeテーブルの作成時にデフォルト値が指定されている場合、ログに存在しない値は、MaxComputeに出荷された後にデフォルト値に変換されます。
MaxComputeテーブルの作成時にデフォルト値が指定されておらず、値Nullが許可されている場合、ログに存在しない値は、値がMaxComputeに出荷された後にNullに変換されます。
最大64のデータシッピングジョブを実行して、MaxComputeにデータを同時に発送できます。 1秒あたり最大10 MBのデータを各MaxComputeパーティションに書き込むことができます。
手順
Simple Log Serviceコンソールにログインします。
[プロジェクト] セクションで、目的のプロジェクトをクリックします。
を選択します。 [Logstores] タブで、管理するLogstoreを見つけ、[>] をクリックし、 を選択します。
ポインタをMaxComputeに移動し、[+] をクリックします。
[MaxComputeへのデータ配送] パネルで、パラメーターを設定し、[OK] をクリックします。
配送バージョンパラメーターを [新しいバージョン (推奨)] に設定します。 下表に、各パラメーターを説明します。
パラメーター
説明
ジョブ名
データ配布ジョブの名前。
表示名
データ配布ジョブの表示名。
ジョブの説明
データ配布ジョブの説明。
宛先リージョン
MaxComputeテーブルのプロジェクトが存在するリージョン。
MaxComputeエンドポイント
MaxComputeプロジェクトが存在するリージョンのエンドポイント。 詳細については、「エンドポイント」をご参照ください。
トンネルエンドポイント
MaxComputeプロジェクトが存在するリージョンのTunnelエンドポイント。 詳細については、「エンドポイント」をご参照ください。
MaxComputeプロジェクト名
MaxComputeテーブルが属するMaxComputeプロジェクト。
テーブル名
MaxComputeテーブルの名前。
Log Serviceでの読み取り権限
Logstoreからデータを読み取るためにMaxComputeデータ配布ジョブを許可するために使用されるメソッド。
デフォルトロール: MaxComputeデータシッピングジョブは、Logstoreからデータを読み取るためにAliyunLogDefaultRoleシステムロールを引き受けます。 詳細については、「デフォルトロールを使用したLogstoreからのデータの読み取り」をご参照ください。
カスタムロール: MaxComputeデータシッピングジョブは、Logstoreからデータを読み取るためのカスタムロールを引き受けます。
カスタムロールに、Logstoreからデータを読み取る権限を付与する必要があります。 次に、Log Serviceの読み取り権限フィールドにカスタムロールのAlibaba Cloudリソース名 (ARN) を入力します。 詳細については、「カスタムロールを使用したLogstoreからのデータの読み取り」をご参照ください。
MaxComputeでの書き込み権限
MaxComputeデータ配布ジョブがMaxComputeテーブルにデータを書き込むことを許可するために使用されるメソッド。
デフォルトロール: MaxComputeデータシッピングジョブは、MaxComputeテーブルにデータを書き込むためにAliyunLogDefaultRoleシステムロールを引き受けます。 詳細については、「デフォルトロールを使用したMaxComputeへのデータの書き込み」をご参照ください。
カスタムロール: MaxComputeデータ配布ジョブは、MaxComputeテーブルにデータを書き込むためのカスタムロールを引き受けます。
MaxComputeテーブルにデータを書き込む権限をカスタムロールに付与する必要があります。 次に、[MaxComputeへの書き込み権限] フィールドにカスタムロールのARNを入力します。
Log ServiceプロジェクトとMaxComputeプロジェクトが同じAlibaba Cloudアカウントに属している場合は、[Alibaba Cloudアカウント内のデータの出荷] に記載されている手順に従ってARNを取得します。
Log ServiceプロジェクトとMaxComputeプロジェクトが異なるAlibaba Cloudアカウントに属している場合は、[Ship data across Alibaba Cloud accounts] に記載されている手順に従ってARNを取得します。
AccessKeyペア: MaxComputeデータシッピングジョブは、RAMユーザーのAccessKeyペアを使用して、MaxComputeテーブルにデータを書き込みます。 詳細については、「RAMユーザーを使用したMaxComputeへのデータの書き込み」をご参照ください。
[自動認証] をクリックする
承認 をクリックして、MaxComputeにデータを書き込む権限をRAMロールに自動的に付与します。
重要RAMユーザーを使用して操作を実行する場合、RAMユーザーにはMaxComputeアカウントを管理する権限が必要です。
自動承認が失敗した場合、次のコマンドが返されます。 コマンドをMaxComputeコンソールにコピーして、手動で承認を完了できます。 詳細については、「カスタムロールを使用してMaxComputeにデータを書き込む」の「CLIを使用してRAMロールに権限を付与する」をご参照ください。
USE xxxxx; ADD USER RAM$xxxxx:`role/xxxxx`; GRANT CreateInstance ON PROJECT xxxxx TO USER RAM$xxxxx:`role/xxxxx`; GRANT Describe, Alter, update ON TABLE xxxxx TO USER RAM$xxxxx:`role/xxxxx`;
MaxCompute共通列
MaxComputeテーブルのログフィールドとデータ列の間のマッピング。 左側のフィールドに、MaxComputeテーブルのデータ列にマップするログフィールドの名前を入力します。 右側のフィールドに、列の名前を入力します。 詳細については、「データモデルマッピング」をご参照ください。
重要Log Serviceは、指定されたログフィールドとMaxComputeテーブル列の順序に基づいて、ログをMaxComputeに送信します。 これらの列の名前を変更しても、データ配布プロセスには影響しません。 MaxComputeテーブルのスキーマを変更する場合は、ログフィールドとMaxComputeテーブル列の間のマッピングを再設定する必要があります。
左側のフィールドで指定するログフィールドの名前には、二重引用符 ("") または一重引用符 (") を含めることはできません。 名前はスペースを含む文字列にすることはできません。
ログにrequest_timeなどの同じ名前の2つのフィールドが含まれている場合、log Serviceはいずれかのフィールドをrequest_time_0として表示します。 2つのフィールドは引き続きrequest_timeとしてLog Serviceに保存されます。 配送ルールを設定する場合、元のフィールド名request_timeのみを使用できます。
ログに同じ名前のフィールドが含まれている場合、log Serviceはいずれかのフィールドの値をランダムに送信します。 同じ名前のフィールドをログに含めないことをお勧めします。
MaxComputeパーティション列
MaxComputeテーブルのログフィールドとパーティションキー列の間のマッピング。 左側のフィールドに、MaxComputeテーブルのパーティションキー列にマップするログフィールドの名前を入力します。 右側のフィールドに、列の名前を入力します。 詳細については、「データモデルマッピング」をご参照ください。
説明パーティションキー列として、
_extract_others_
、__extract_others__
、または__extract_others_all__
を指定することはできません。パーティション形式
時間パーティションの形式。 パーティション形式の設定例とパラメーターの詳細については、「参照」をご参照ください。
説明このパラメーターは、MaxCompute Partition Columnの左フィールドを __partition_time__ に設定した場合にのみ有効になります。
秒単位の時間パーティション形式を指定しないことをお勧めします。 秒単位のタイムパーティション形式を指定すると、MaxComputeテーブルのパーティション数が60,000を超える可能性があります。
タイムゾーン
時間と時間パーティションのフォーマットに使用されるタイムゾーン。 詳細は、「タイムゾーン」をご参照ください。
出荷モード
データ出荷モード。 リアルタイムまたはバッチ配送を選択できます。
リアルタイム: Logstoreからデータをリアルタイムで読み取り、MaxComputeに送信します。
Batch Shipping: 現在の時刻より5〜10分早く生成されたデータをLogstoreから読み取り、そのデータをMaxComputeに一括で送信します。
詳細については、「配送モード」をご参照ください。
開始時間範囲
MaxComputeデータ送信ジョブが送信できるデータの時間範囲。 時間範囲は、ログが受信された時間によって異なります。 有効な値:
すべて: MaxComputeデータシッピングジョブは、ジョブが手動で停止されるまで、最初のログからLogstoreのデータを発送します。
[特定の時間から]: MaxComputeデータ送信ジョブは、指定された開始時間に受信されたログから、ジョブが手動で停止されるまで、Logstore内のデータを送信します。
特定の時間範囲: MaxComputeデータシッピングジョブは、指定された開始時刻に受信されたログから指定された終了時刻に受信されたログに、Logstore内のデータを送信します。
データシッピングジョブが作成された後、ログデータはLogstoreに書き込まれてから1時間後にMaxComputeに出荷されます。 ログデータの出荷後、MaxComputeでログデータを表示できます。 詳細については、「」をご参照ください。Simple Log ServiceからMaxComputeに出荷されるデータの完全性を確認するにはどうすればよいですか?
| log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+ | 10.10.*.* | 1642942213 | | 24/Jan/2022:20:50:13 +0800 | 10.10.*.* | 414579208 | {"url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1","user-agent":"aliyun-sdk-java"} | 2022_01_23_20_50 | 200 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+
データモデルマッピング
データ出荷ジョブがLog ServiceからMaxComputeにデータを出荷する場合、2つのサービス間のデータモデルマッピングが有効になります。 次のリストでは、使用上の注意事項と例を示します。
MaxComputeテーブルには、少なくとも1つのデータ列と1つのパーティションキー列が含まれます。
Log Serviceで __partition_time__ 、__source__ 、および __topic__ の予約フィールドを使用することを推奨します。
各MaxComputeテーブルは、最大60,000個のパーティションを持つことができます。 パーティションの数が上限を超えると、テーブルにデータを書き込むことができません。
システム予約フィールドの以前の名前 __extract_others__ は _extract_others_ です。 両方の名前を一緒に使用できます。
MaxComputeテーブルのパーティションキー列の値は、MaxComputeの予約語またはキーワードにすることはできません。 詳細については、「予約済みの単語とキーワード」をご参照ください。
MaxComputeテーブルのパーティションキー列の値を空の文字列にすることはできません。 パーティションキー列にマップされるフィールドは、予約フィールドまたはログコンテンツフィールドである必要があります。 古いバージョンのデータシッピングでは、cast関数を使用して、文字列型のフィールドをマップされたパーティションキー列の型に変換します。 変換の失敗により、パーティションキー列にマッピングされているフィールドの値が空の文字列になった場合、データの配布中にフィールドの値を記録したログが破棄されます。
log Serviceのログフィールドは、MaxComputeテーブルの1つのデータ列またはパーティションキー列にのみマッピングできます。 フィールド冗長性はサポートされていません。
次の表に、MaxComputeデータ列、パーティションキー列、およびLog Serviceフィールド間のマッピング関係を示します。 Log Serviceの予約フィールドの詳細については、「予約フィールド」をご参照ください。
MaxComputeの列タイプ | MaxComputeの列名 | MaxComputeのデータ型 | Log Serviceのフィールド名 | Log Serviceのフィールドタイプ | 説明 |
データ列 | log_source | String | __source__ | 予約フィールド | ログのソースです。 |
log_time | bigint | __time__ | 予約フィールド | ログのUNIXタイムスタンプ。 このフィールドは、データモデルのTimeフィールドに対応します。 | |
log_topic | String | __topic__ | 予約フィールド | ログのトピックです。 | |
time | String | time | Log contentフィールド | このフィールドはログから解析され、データモデルのキーと値のペアに対応します。 ほとんどの場合、Logtailを使用して収集されるデータの__time__フィールドの値は、timeフィールドの値と同じです。 | |
ip | String | ip | Log contentフィールド | このフィールドはログから解析されます。 | |
スレッド | String | スレッド | Log contentフィールド | このフィールドはログから解析されます。 | |
log_extract_others | String | __extract_others__ | 予約フィールド | 設定でマップされていない他のログフィールドは、キーと値のペアに基づいてJSONデータにシリアル化されます。 JSONデータは単一レベルの構造を使用し、JSONネスティングはログフィールドではサポートされていません。 | |
パーティションキー列 | log_partition_time | String | __partition_time__ | 予約フィールド | このフィールドは、ログ内の __time__ フィールドの値に基づいて計算されます。 フィールドのパーティションの粒度を指定できます。 |
status | String | status | Log contentフィールド | このフィールドはログから解析されます。 このフィールドの値は、パーティションの数が上限を超えないように列挙をサポートします。 |
配送モード
新しいバージョンのデータ配送機能は、次の配送モードをサポートしています。
リアルタイム: Logstoreからデータをリアルタイムで読み取り、MaxComputeに送信します。
バッチシッピング: 現在の時刻より5〜10分早く生成されたデータをLogstoreから読み取り、そのデータをバッチでMaxComputeに発送します。
[配送モード] パラメーターを [一括配送] に設定した場合、[開始時間範囲] セクションの [開始時間] または [終了時間] パラメーターを5分の倍数に設定できます。 たとえば、
2022-05-24 16:35:00
は有効な開始時間または終了時間ですが、2022-05-24 16:36:00
は有効ではありません。__receive_time__ フィールドのデータをバッチ出荷モードで出荷できます。 __receive_time__ フィールドの値は、log Serviceがログを受信した時刻を示します。 時間パーティション形式を使用して、__receive_time__フィールドの値形式を設定できます。 時間は30分まで正確にすることができます。 タイムパーティション形式の詳細については、「参照」をご参照ください。
__receive_time__フィールドのデータを送信する場合、このフィールドはMaxCompute Partition Columnパラメーターにのみ追加できます。
関連ドキュメント
__partition_time__ フィールド
ほとんどの場合、MaxComputeはデータを時間でフィルタリングするか、ログ時間フィールドをパーティションキー列として使用します。
Format
__partition_time__ フィールドの値は、Log Serviceの __time__ フィールドの値に基づいて計算されます。 値は、タイムゾーンとタイムパーティションの形式に基づいて生成される時間文字列です。 日付パーティションキー列の値は、1,800秒間隔で指定します。 これにより、1つのMaxComputeテーブルのパーティション数が制限を超えないようにします。
たとえば、log Serviceのログのタイムスタンプが27/Jan/2022 20:50:13 + 0800の場合、Log Serviceはタイムスタンプに基づいて __time__ フィールドの値を計算します。 値は1643287813のUNIXタイムスタンプです。 次の表に、さまざまな設定での時間パーティション列の値を示します。
パーティション形式
__partition_time__
% Y_% m_% d_% H_% M_00
2022_01_27_20_30_00
% Y_% m_% d_% H_% M
2022_01_27_20_30
% Y % m % d
20220127
使用状況
__partition_time__ フィールドを使用してデータをフィルタリングし、フルテーブルスキャンを防ぐことができます。 たとえば、次のクエリステートメントを実行して、2022年1月26日のログデータをクエリできます。
select * from {ODPS_TABLE_NAME} where log_partition_time >= "2022_01_26" and log_partition_time < "2022_01_27";
__extract_others__ および __extract_others_all__ フィールド
__extract_others__ フィールドの値には、__topic__ 、__tag __: * 、および __source__ フィールドを除く、マップされていないすべてのフィールドが含まれます。
__extract_others_all__ フィールドの値には、__topic___ 、__tag __: * 、__source__ フィールドなど、マップされていないすべてのフィールドが含まれます。