Log Service (SLS) は、ストレージと分析のためにログデータを MaxCompute (ODPS) に転送することをサポートしています。MaxCompute データ転送ジョブ (新バージョン) を作成して、データパイプラインをセットアップします。
前提条件
Log Service (SLS) でプロジェクトと Logstore を作成し、データ収集を設定済みであること。詳細については、「プロジェクトの管理」、「基本的な Logstore の作成」、および「データ収集の概要」をご参照ください。
SLS プロジェクトと同じリージョンに MaxCompute (ODPS) パーティションテーブルを作成済みであること。詳細については、「テーブルの作成」をご参照ください。
注意事項
ODPS へのデータ転送をサポートしているリージョンについては、「サポートされているリージョン」をご参照ください。
charまたはvarchar型のフィールドの値が指定された長さを超える場合、超過した部分は ODPS への転送時に切り捨てられます。たとえば、長さの制限が 3 でフィールド値が
012345の場合、ODPS への転送後、値は012になります。string、char、またはvarchar型のフィールドの値が空の文字列の場合、ODPS への転送後、その値は Null になります。datetime型のフィールドの値は、YYYY-MM-DD HH:mm:ssフォーマットである必要があります。DDとHHの間には複数のスペースが許可されます。無効なフォーマットは転送エラーを引き起こしませんが、ODPS への転送後、値は Null になります。date型のフィールドの値が無効なフォーマットである場合、データ転送ジョブはエラーを報告しませんが、ODPS への転送後、値は Null になります。10 進数フィールドの場合、値が定義されたスケールを超えると、システムはそれを四捨五入します。値が定義された精度を超えると、システムはログ全体をダーティデータとして破棄し、エラーカウントを増分します。
デフォルトでは、システムはデータ転送中にダーティデータを破棄します。
転送構成で指定されたフィールドがログに存在しない場合、ODPS での値はデフォルト値または Null になります。
ODPS テーブルの作成時にデフォルト値を指定した場合、フィールドにはデフォルト値が割り当てられます。
デフォルト値を指定せず、列が Null 値を許可する場合、フィールド値は Null になります。
ODPS の制限により、データ転送の最大同時実行数は 64 書き込み操作です。単一パーティションの最大スループットは 10 MB/s です。
操作手順
Log Service コンソールにログインします。
[プロジェクト] セクションで、目的のプロジェクトをクリックします。
タブで、ターゲット Logstore の左側にある > アイコンをクリックし、 を選択します。
ポインターを [MaxCompute (ODPS)] に合わせ、[+] アイコンをクリックします。
[MaxCompute へのデータ転送] パネルで、以下のパラメーターを設定し、[OK] をクリックします。
データ転送ジョブを作成した後、新しいジョブは通常約 10 分以内に MaxCompute にデータを転送します。その後、ODPS でデータをクエリできます。詳細については、「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 | +------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+
データモデルマッピング
SLS から ODPS テーブルにログを転送するには、2 つのサービスのデータモデルをマッピングする必要があります。以下のセクションでは、マッピングルールと例について説明します。
ODPS テーブルには、少なくとも 1 つのデータ列と 1 つのパーティションキー列が含まれている必要があります。
SLS の予約フィールドである __partition_time__、__source__、および __topic__ を使用することを推奨します。
ODPS テーブルは最大 60,000 のパーティションを持つことができます。この制限を超えると、テーブルにデータを書き込むことができません。
システム予約フィールド __extract_others__ は、以前は _extract_others_ という名前でした。古い名前は互換性のために引き続きサポートされています。
ODPS パーティションキー列の値は、ODPS の予約語またはキーワードであってはなりません。詳細については、「予約語とキーワード」をご参照ください。
ODPS パーティションテーブルのパーティションは空にできません。システム予約フィールドやログフィールドなどの特定のフィールドをパーティションキー列にマッピングする必要があります。マッピングされたフィールドの値は空または null であってはなりません。ログフィールドが文字列型の場合、パーティションキー列のデータ型に変換可能でなければなりません。変換に失敗し、パーティションキーが空になった場合、システムは転送中にそのログを破棄します。
SLS では、1 つのログフィールドは ODPS テーブルの 1 つの列 (データ列またはパーティションキー列のいずれか) にのみマッピングできます。フィールドの冗長性はサポートされていません。
以下の表は、ODPS 列と SLS フィールド間のマッピング関係の例を示しています。SLS の予約フィールドに関する詳細については、「予約フィールド」をご参照ください。
MaxCompute 列タイプ | 列名 (MaxCompute) | データ型 (MaxCompute) | ログフィールド名 (Log Service) | フィールドタイプ (Log Service) | 説明 |
データ列 | log_source | string | __source__ | 予約フィールド | ログのソース。 |
log_time | bigint | __time__ | 予約フィールド | UNIX タイムスタンプ形式のログの時間。これはデータモデルの時間フィールドに対応します。 | |
log_topic | string | __topic__ | 予約フィールド | ログのトピック。 | |
time | string | time | ログフィールド | ログコンテンツから解析されたフィールドで、データモデルのキーと値のペアに対応します。多くの場合、Logtail によって収集された | |
ip | string | ip | ログフィールド | ログコンテンツから解析されたフィールド。 | |
thread | string | thread | ログフィールド | ログコンテンツから解析されたフィールド。 | |
log_extract_others | string | __extract_others__ | 予約フィールド | システムは、マッピングされていない他のログフィールドをフラットなキーと値のペアの JSON オブジェクトにシリアル化します。ネストされた JSON オブジェクトはサポートされていません。 | |
パーティションキー列 | log_partition_time | string | __partition_time__ | 予約フィールド | SLS は、ログの __time__ フィールドからこの値を計算し、それを調整します。パーティションの粒度は設定可能です。 |
status | string | status | ログフィールド | ログコンテンツから解析されたフィールド。このフィールドの値を列挙することで、パーティション数が制限を超えないようにできます。 |
時間パーティションフォーマット
MaxCompute データ転送 (新バージョン) は、StrfTimeFormat と SimpleDateFormat の 2 つの時間パーティションフォーマットをサポートしています。時間パーティションフォーマットは、MaxCompute パーティションキー列のフィールドが __receive_time__ または __partition_time__ に設定されている場合にのみ有効です。
StrfTimeFormat
strftime は、日付と時刻をフォーマットする標準的な UNIX C ライブラリ関数です。% 文字で始まるフォーマットコードを使用して、時間パーティションを文字列に変換します。たとえば、%Y_%m_%d は年、月、日を表します。
新しい ODPS データ転送ジョブを作成する場合、StrfTimeFormat を使用する必要があります。
時間パーティションフォーマット | テーブルパーティションの例 |
%Y_%m_%d_%H_%M_00 | 2024_12_27_20_30_00 |
%Y_%m_%d_%H_%M | 2024_12_27_20_30 |
%Y_%m_%d_%H | 2024_12_27_20 |
%Y_%m_%d | 2024_12_27 |
%Y_%m | 2024_12 |
%Y | 2024 |
%Y%m%d%H%M | 202412272030 |
%Y%m%d%H | 2024122720 |
%Y%m%d | 20241227 |
%Y%m | 202412 |
SimpleDateFormat
Java の SimpleDateFormat 構文の時間フォーマット。例:yyyy-MM-dd HH:mm。詳細については、「Class SimpleDateFormat」をご参照ください。
SimpleDateFormat は、古いバージョンからの移行時の下位互換性のためにサポートされています。新しい MaxCompute タスクには StrfTimeFormat を使用してください。
レガシー移行タスクは、以下のパーティションフォーマットをサポートしています:
パーティション時間フォーマット | テーブルパーティションの例 |
yyyy-MM-ddHH:mm | 2024-12-2720-30 |
yyyy_MM_dd_HH_mm | 2024_12_27_20_30 |
yyyy_MM_dd_HH | 2024_12_27_20 |
yyyy-MM-dd HH:mm | 2024-12-27 20:30 |
yyyyMMddHHmm | 202412272030 |
yyyyMMddHH | 2024122720 |
yyyyMMdd | 20241227 |
yyyy_MM-dd_HH_mm | 2024_12-27_20_30 |
yyyy-MM-dd | 2024-12-27 |
参考情報
パーティションフィールドとして __receive_time__ を使用することを推奨します。ビジネス要件でログ時間による厳密なパーティション分割が必須の場合は、__partition_time__ を代わりに使用することもできますが、遅れて到着したデータが古いパーティションを上書きする、異常なタイムスタンプが未来のパーティションに書き込まれる、パーティションの完全性に遅延が生じるなどの関連リスクを明示的に受け入れる必要があります。
__partition_time__ フィールド
MaxCompute でデータをフィルターする一般的な方法は、ログ時間をパーティションキー列として使用することです。
フォーマット
__partition_time__ フィールドは、SLS の __time__ フィールドから派生します。タイムゾーンとパーティション時間フォーマットに基づいて時間文字列を生成します。単一の MaxCompute テーブルのパーティション制限を超えないようにするため、日付パーティションキーの値は 1800 秒 (30 分) 間隔に調整されます。
たとえば、SLS のログ時間が 27/Jan/2022 20:50:13 +0800 の場合、SLS は予約フィールド __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__ を使用してデータをフィルターすると、テーブル全体のスキャンを回避できます。たとえば、2024 年 12 月 26 日のログデータをクエリする場合:
select * from {ODPS_TABLE_NAME} where log_partition_time >= "2024_12_26" and log_partition_time < "2024_12_27";
__receive_time__フィールドMaxCompute でデータをフィルターする一般的な方法は、ログの到着時間をパーティションキー列として使用することです。
フォーマット
パーティション時間フォーマット
__receive_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
__extract_others__ および __extract_others_all__ フィールド
__extract_others__ フィールドには、ログフィールドからマッピングされていないすべてのフィールドが含まれますが、__topic__、__tag__:*、および __source__ は除外されます。
__extract_others_all__ フィールドには、ログフィールドからマッピングされていないすべてのフィールドが含まれ、__topic__、__tag__:*、および __source__ も含まれます。
アイコンをクリックすると展開されます。