Simple Log Service (SLS) を使用すると、ログデータを MaxCompute に転送して、ストレージと分析を行うことができます。このトピックでは、MaxCompute データ転送ジョブ (新バージョン) の作成方法について説明します。
前提条件
SLS プロジェクトと Logstore が作成され、データ収集が完了していること。詳細については、「プロジェクトの管理」、「Logstore の作成」、「データ収集の概要」をご参照ください。
SLS プロジェクトが存在するリージョンに MaxCompute パーティションテーブルが作成されていること。詳細については、「テーブルの作成」をご参照ください。
注意事項
MaxCompute へのデータ転送をサポートしているリージョンについての詳細は、「サポートされているリージョン」をご参照ください。
`char` または `varchar` 型のフィールドの場合、値が指定された長さを超えると、データが MaxCompute に転送される際に超過した文字が切り捨てられます。
例えば、長さの制限が 3 でフィールド値が 012345 の場合、MaxCompute での値は 012 になります。
`string`、`char`、または `varchar` 型のフィールドの場合、空の文字列値は MaxCompute に転送されると `Null` になります。
`datetime` フィールドの場合、値は `YYYY-MM-DD HH:mm:ss` フォーマットである必要があります。DD と HH の間には複数のスペースが許可されます。フォーマットが正しくない値は転送エラーにはなりませんが、MaxCompute では `Null` になります。
`date` フィールドの場合、フォーマットが正しくない値は転送エラーにはなりませんが、MaxCompute では `Null` になります。
`decimal` フィールドの場合、小数点以下の桁数が指定された精度を超えると、値は四捨五入されます。整数部分の桁数が指定された精度を超えると、システムはログ全体をダーティデータとして破棄し、エラーカウントを増分します。
ダーティデータは、転送プロセス中にデフォルトで破棄されます。
ログに値が存在しない場合、MaxCompute ではデフォルト値または `Null` になることがあります。
MaxCompute テーブルの作成時にデフォルト値が指定されていた場合、MaxCompute での値はデフォルト値になります。
デフォルト値が指定されておらず、`Null` 値が許可されている場合、MaxCompute での値は `Null` になります。
MaxCompute の制限により、最大転送同時実行数は 64 です。つまり、最大 64 の同時実行ジョブが MaxCompute に書き込むことができます。単一の MaxCompute パーティションの最大トラフィックは 10 MB/s です。
操作手順
Simple Log Service コンソールにログインします。
[プロジェクト] セクションで、目的のプロジェクトをクリックします。
タブで、目的の Logstore の左側にある > をクリックし、 を選択します。
MaxCompute (旧称 ODPS) にポインターを合わせ、+ をクリックします。
MaxCompute への転送 パネルで、次のパラメーターを設定し、OK をクリックします。
転送ジョブを作成した後、ログデータは通常、Logstore に書き込まれてから 1 時間以内に MaxCompute にインポートされます。その後、MaxCompute でデータを表示できます。詳細については、「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 から MaxCompute テーブルにログを転送する場合、2 つのサービスのデータモデルをマッピングする必要があります。次の点にご注意ください:
MaxCompute テーブルには、少なくとも 1 つのデータ列と 1 つのパーティション列が含まれている必要があります。
予約フィールド __partition_time__、__source__、__topic__ を使用します。
MaxCompute テーブルは最大 60,000 パーティションを持つことができます。パーティション数が上限を超えると、テーブルにデータを書き込むことができなくなります。
システム予約フィールド __extract_others__ は、以前は _extract_others_ という名前でした。両方の名前は互換性があります。
MaxCompute パーティションキー列の値は、MaxCompute の予約語またはキーワードにすることはできません。詳細については、「予約語とキーワード」をご参照ください。
MaxCompute パーティションテーブルのパーティションは空にできません。MaxCompute パーティションキー列には、特定のフィールド (システム予約フィールドまたはログコンテンツフィールド) を設定する必要があります。古い転送ジョブの場合、文字列フィールドの値を対応するパーティション列の型に変換するには `cast` オペレーターが必要です。変換に失敗してパーティション列が空になった場合、ログは転送中に破棄されます。
SLS のログフィールドは、MaxCompute テーブルの 1 つの列 (データ列またはパーティション列) にのみマッピングできます。フィールドの冗長性はサポートされていません。
次の表に、MaxCompute のデータ列、パーティション列、および SLS フィールド間のマッピングを示します。SLS の予約フィールドの詳細については、「予約フィールド」をご参照ください。
MaxCompute 列の型 | 列名 (MaxCompute) | データ型 (MaxCompute) | ログフィールド名 (Simple Log Service) | フィールド型 (Simple Log Service) | 説明 |
データ列 | log_source | string | __source__ | 予約フィールド | ログのソース。 |
log_time | bigint | __time__ | 予約フィールド | UNIX タイムスタンプ形式のログ時間。これはデータモデルの Time フィールドに対応します。 | |
log_topic | string | __topic__ | 予約フィールド | ログのトピック。 | |
time | string | time | ログコンテンツフィールド | このフィールドはログから解析され、データモデルのキーと値のペアに対応します。多くの場合、Logtail によって収集されたデータの __time__ フィールドの値は、time フィールドの値と同じです。 | |
ip | string | ip | ログコンテンツフィールド | このフィールドはログから解析されます。 | |
thread | string | thread | ログコンテンツフィールド | このフィールドはログから解析されます。 | |
log_extract_others | string | __extract_others__ | 予約フィールド | 設定でマッピングされていない他のログフィールドは、キーと値のペアに基づいて JSON オブジェクトにシリアル化されます。JSON オブジェクトは単一レベルの構造を持ちます。ログフィールドのネストされた JSON オブジェクトはサポートされていません。 | |
パーティション列 | log_partition_time | string | __partition_time__ | 予約フィールド | このフィールドは、ログの __time__ フィールドの値に基づいて計算され、アライメントされます。パーティションの粒度は設定可能です。 |
status | string | status | ログコンテンツフィールド | このフィールドはログから解析されます。このフィールドの値は列挙をサポートしており、パーティション数が上限を超えないようにします。 |
時間パーティションフォーマット
MaxCompute (新バージョン) へのデータ転送では、`StrfTimeFormat` と `SimpleDateFormat` の 2 つの時間パーティションフォーマットがサポートされています。これらのフォーマットは、MaxCompute パーティションキー列のフィールドが __partition_time__ または `__receive_time__` に設定されている場合にのみ適用されます。
StrfTimeFormat
`strftime` は、UNIX C 標準ライブラリの関数で、日付と時刻をフォーマットします。この関数を使用して、時間パーティションを指定されたフォーマットの文字列に変換できます。フォーマットルールは、`%` 文字で始まるフォーマット指定子によって指定されます。例えば、`%Y_%m_%d` は年-月-日フォーマットを表します。
新しい MaxCompute ジョブを作成する場合、`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
これは、yyyy-MM-dd HH:mm のような Java の `SimpleDateFormat` 構文に基づく時間フォーマットです。構文の詳細については、「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 |
参考情報
__partition_time__ フィールド
ログ時間をパーティションフィールドとして使用して時間でデータをフィルタリングすることは、MaxCompute で一般的な方法です。
フォーマット
__partition_time__ フィールドの値は、SLS の __time__ フィールドの値に基づいて計算されます。タイムゾーン設定と時間パーティションフォーマットに基づいて時間文字列が生成されます。単一の MaxCompute テーブルのパーティション制限を超えないようにするため、日付パーティション列の値は 30 分 (1800 秒) 間隔にアライメントされます。
例えば、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 で一般的な方法です。
フォーマット
時間パーティションフォーマット
__recetive_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__ を含む、ログ内のすべての未マッピングフィールドが含まれます。
転送モードの説明
現在、MaxCompute (新バージョン) へのデータ転送は、リアルタイム転送とバッチ転送の 2 つのモードをサポートしています。
リアルタイム転送:Logstore からリアルタイムでデータを読み取り、MaxCompute に転送します。
バッチ転送:現在時刻より 5〜10 分前の Logstore からデータを読み取り、MaxCompute に転送します。
[転送モード] を [バッチ転送] に設定した後、[開始時刻範囲] で [開始時刻] または [終了時刻] を設定する場合は、時間を 5 分間隔にアライメントする必要があります。例えば、
2022-05-24 16:35:00は有効な設定ですが、2022-05-24 16:36:00は無効な設定です。さらに、バッチ転送は __receive_time__ フィールドの転送をサポートしています。__receive_time__ フィールドは、ログが SLS によって受信された時刻を示します。このフィールドのフォーマットは、時間パーティションフォーマットを使用して設定でき、最大 30 分の精度です。時間パーティションフォーマットの詳細については、「時間パーティションフォーマット」をご参照ください。
このフィールドを転送する場合、[MaxCompute のパーティションキー列] にのみ追加できます。
をクリックして詳細を表示します: