収集されたログは、Simple Log Service コンソールでリアルタイムにクエリでき、ビジネスインテリジェンス( BI )分析とデータマイニングのために MaxCompute に送信できます。このトピックでは、Simple Log Service コンソールでログを MaxCompute に送信する方法について説明します。
MaxCompute へのログ送信の旧バージョンは廃止されました。新バージョンを参照してください。
前提条件
MaxCompute がアクティブ化され、MaxCompute テーブルが作成されていること。詳細については、「テーブルの作成」をご参照ください。
制限事項
データ送信ジョブは、Alibaba Cloud アカウントを使用してのみ作成できます。RAM ユーザーを使用してデータ送信ジョブを作成することはできません。
複数のログストアから 1 つの MaxCompute テーブルにログを送信しないでください。複数のログストアから 1 つの MaxCompute テーブルにログを送信すると、MaxCompute テーブルの既存のデータが上書きされる可能性があります。
現在の日付の 14 日前に生成されたログは、データ送信ジョブで自動的に破棄されます。_time_ フィールドは、ログが生成された時点を指定します。
データ型が DECIMAL、DATETIME、DATE、または TIMESTAMP のログを MaxCompute に送信することはできません。詳細については、「MaxCompute V2.0 データ型エディション」をご参照ください。
次の表に、MaxCompute へのデータ送信をサポートするリージョンを示します。Simple Log Service が他のリージョンにデプロイされている場合は、DataWorks を使用してデータを同期してください。詳細については、「Data Integration を使用して LogHub データソースから宛先にデータを同期する」をご参照ください。
Simple Log Service プロジェクトが存在するリージョン
MaxCompute プロジェクトが存在するリージョン
中国(青島)
中国(上海)
中国(北京)
中国(北京)および中国(上海)
中国(張家口)
中国(上海)
中国(フフホト)
中国(上海)
中国(杭州)
中国(上海)
中国(上海)
中国(上海)
中国(深圳)
中国(深圳)および中国(上海)
中国(香港)
中国(上海)
ステップ 1:データ送信ジョブを作成する
Simple Log Service コンソールにログインします。
Projects セクションで、管理するプロジェクトをクリックします。
を選択します。[ログストア] タブで、管理するログストアを見つけ、[>] をクリックし、 を選択します。
MaxCompute (旧 ODPS) LogShipper ページで、[有効化] をクリックします。
[送信の注意事項] ダイアログボックスで、[送信] をクリックします。
[MaxCompute にデータを送信] パネルで、送信ルールを設定し、[OK] をクリックします。
次の表にパラメータを示します。
パラメータ
説明
[リージョンの選択]
MaxCompute がサポートされているリージョンは、Simple Log Service プロジェクトが存在するリージョンによって異なります。詳細については、制限事項を参照してください。
[送信ジョブ名]
データ送信ジョブの名前。
[MaxCompute プロジェクト名]
MaxCompute プロジェクトの名前。
[テーブル名]
MaxCompute テーブルの名前。
[MaxCompute 共通列]
ログフィールドと MaxCompute テーブルのデータ列間のマッピング。左側のフィールドに、MaxCompute テーブルのデータ列にマップするログフィールドの名前を入力します。右側のフィールドに、列の名前を入力します。詳細については、データモデルマッピングを参照してください。
重要Simple Log Service は、指定されたログフィールドと MaxCompute テーブル列の順序に基づいて、ログを MaxCompute に送信します。これらの列の名前を変更しても、データ送信プロセスには影響しません。MaxCompute テーブルのスキーマを変更する場合は、ログフィールドと MaxCompute テーブル列間のマッピングを再構成する必要があります。
左側のフィールドに指定するログフィールドの名前に、二重引用符( "" )または一重引用符( '' )を含めることはできません。名前は、スペースを含む文字列にすることはできません。
ログにrequest_time など、同じ名前のフィールドが 2 つ含まれている場合、Log Service は一方のフィールドを request_time_0 として表示します。2 つのフィールドは、Log Service には request_time として保存されます。送信ルールを設定する場合、元のフィールド名 request_time のみを使用できます。
ログに同じ名前のフィールドが含まれている場合、Log Service はいずれかのフィールドの値をランダムに送信します。ログに同じ名前のフィールドを含めないことをお勧めします。
[MaxCompute パーティション列]
ログフィールドと MaxCompute テーブルのパーティションキー列間のマッピング。左側のフィールドに、MaxCompute テーブルのパーティションキー列にマップするログフィールドの名前を入力します。右側のフィールドに、列の名前を入力します。詳細については、データモデルマッピングを参照してください。
説明最大 3 つのパーティションキー列を指定できます。カスタムフィールドをパーティションキー列として指定する場合は、データ送信ジョブで生成できるパーティションの数が 512 未満であることを確認してください。パーティションの数が 512 以上の場合、データ送信ジョブは指定された MaxCompute テーブルにデータを書き込むことができず、データを送信できません。
[パーティション形式]
パーティション形式の設定例とパラメータについては、例と Java SimpleDateFormat を参照してください。
説明パーティション形式は、MaxCompute パーティション列パラメータの[パーティションフィールド] が__partition_time__ に設定されている場合にのみ有効になります。
秒単位で正確な時間パーティション形式を指定しないことをお勧めします。秒単位で正確な時間パーティション形式を指定すると、MaxCompute テーブルのパーティション数が 60,000 の制限を超える可能性があります。
各データ送信ジョブで処理されるパーティションの数が 512 未満であることを確認してください。
[送信間隔]
データ送信ジョブの期間。デフォルト値: 1800 。単位:秒。
指定された期間が経過すると、別のデータ送信ジョブが作成されます。
データ送信が有効になると、ログデータはログストアに書き込まれてから 1 時間後に MaxCompute に送信されます。ログデータが送信された後、MaxCompute でログデータを表示できます。詳細については、「Simple Log Service から MaxCompute に送信されたデータの完全性を確認する方法」をご参照ください。
ステップ 2:MaxCompute でデータを表示する
データが MaxCompute に送信された後、MaxCompute でデータを表示できます。次のコードはサンプルデータを示しています。MaxCompute と統合されたビッグデータ開発ツール Data IDE を使用して、データを消費し、視覚化された方法で BI 分析とデータマイニングを実行できます。
| log_source | log_time | log_topic | time | ip | thread | log_extract_others | log_partition_time | status |
+------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+
| 10.10.*.* | 1453899013 | | 27/Jan/2016: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"} | 2016_01_27_20_50 | 200 |
+------------+------------+-----------+-----------+-----------+-----------+------------------+--------------------+-----------+
Simple Log Service のアカウントにデータを送信するための権限を付与する
DataWorks コンソールで MaxCompute テーブルを削除し、新しい MaxCompute テーブルを作成すると、前のテーブルに対して実行されたデフォルトの承認が無効になります。Simple Log Service にデータを送信するための権限を付与する必要があります。
DataWorks コンソールにログインします。
上部のナビゲーションバーで、必要なリージョンを選択します。
左側のナビゲーションウィンドウで、[ワークスペース] をクリックします。
[ワークスペース] ページで、管理するワークスペースを見つけ、ポインタを [ショートカット] に移動し、[データ開発] をクリックします。
ワークフローを作成します。
[スケジュールされたワークフロー] ページで、
を選択します。[ワークフローの作成] ダイアログボックスで、[ワークフロー名] パラメータを設定し、[作成] をクリックします。
ノードを作成します。
[スケジュールされたワークフロー] ページで、
を選択します。[ノードの作成] ダイアログボックスで、[名前] パラメータと [パス] パラメータを設定し、[コミット] をクリックします。
[パス] は、ステップ 5 で作成したワークフローに設定する必要があります。
ノードのエディターで、必要なコマンドを実行して承認を完了します。次の表にコマンドを示します。
コマンド
説明
ADD USER aliyun$shennong_open@aliyun.com;
MaxCompute プロジェクトにユーザーを追加します。
shennong_open@aliyun.com は、Simple Log Service のアカウントを示します。この値は変更できません。
GRANT Read, List ON PROJECT {ODPS_PROJECT_NAME} TO USER aliyun$shennong_open@aliyun.com;
ユーザーに MaxCompute プロジェクトを読み取りおよびクエリするための権限を付与します。
{ODPS_PROJECT_NAME} は、MaxCompute プロジェクトの名前を指定します。変数を実際のプロジェクト名に置き換えます。
GRANT Describe, Alter, Update ON TABLE {ODPS_TABLE_NAME} TO USER aliyun$shennong_open@aliyun.com;
ユーザーに Describe 権限、Alter 権限、および Update 権限を付与します。
{ODPS_TABLE_NAME} は、MaxCompute テーブルの名前を指定します。変数を実際のテーブル名に置き換えます。
SHOW GRANTS FOR aliyun$shennong_open@aliyun.com;
承認が成功したかどうかを確認します。
次の例のような出力が表示された場合、承認は成功です。
A projects/{ODPS_PROJECT_NAME}: List | Read A projects/{{ODPS_PROJECT_NAME}/tables/{ODPS_TABLE_NAME}: Describe | Alter | Update
関連操作
データ送信ジョブを作成した後、[MaxCompute (旧 ODPS) LogShipper] ページでジョブを変更できます。また、データ送信機能を無効にしたり、ジョブのステータスとエラーメッセージを表示したり、失敗したジョブを再試行したりすることもできます。
データ送信ジョブを変更する。
[設定] をクリックして、データ送信ジョブを変更します。パラメータについては、ステップ 1:データ送信ジョブを作成するを参照してください。列を追加する場合は、MaxCompute で対応するテーブルのスキーマを変更できます。
データ送信機能を無効にする。
[無効化] をクリックします。ログストアのデータは MaxCompute に送信されなくなります。
データ送信ジョブのステータスとエラーメッセージを表示する。
過去 2 日間に実行されたデータ送信ジョブとジョブのステータスを表示できます。
ジョブステータス
ステータス
説明
成功
データ送信ジョブは成功しました。
実行中
データ送信ジョブは実行中です。後でジョブが成功するかどうかを確認してください。
失敗
データ送信ジョブは失敗しました。外部の理由によりジョブを再起動できない場合は、エラーメッセージに基づいて障害のトラブルシューティングを行い、ジョブを再試行してください。たとえば、MaxCompute スキーマが Simple Log Service の仕様に準拠していないか、Simple Log Service に MaxCompute へのアクセスが承認されていません。
Simple Log Service では、過去 2 日間のすべての失敗したジョブを再試行できます。
エラーメッセージ
データ送信ジョブが失敗した場合、ジョブのエラーメッセージが返されます。
エラーメッセージ
解決策
MaxCompute プロジェクトが存在しません。
MaxCompute コンソールで、指定された MaxCompute プロジェクトが存在するかどうかを確認します。MaxCompute プロジェクトが存在しない場合は、MaxCompute プロジェクトを作成する必要があります。Simple Log Service は、このエラーが原因で失敗したジョブを自動的に再試行しません。問題を修正した後、手動でジョブを再試行する必要があります。
MaxCompute テーブルが存在しません。
MaxCompute コンソールで、指定された MaxCompute テーブルが存在するかどうかを確認します。MaxCompute テーブルが存在しない場合は、MaxCompute テーブルを作成する必要があります。Simple Log Service は、このエラーが原因で失敗したジョブを自動的に再試行しません。問題を修正した後、手動でジョブを再試行する必要があります。
Simple Log Service に MaxCompute プロジェクトまたはテーブルへのアクセスが承認されていません。
MaxCompute コンソールで、Simple Log Service にログインするために使用されるアカウントに必要な権限が付与されているかどうかを確認します。そうでない場合は、アカウントに権限を付与します。詳細については、Simple Log Service のアカウントにデータを送信するための権限を付与するを参照してください。Simple Log Service は、このエラーが原因で失敗したジョブを自動的に再試行しません。問題を修正した後、手動でジョブを再試行する必要があります。
MaxCompute エラーが発生しました。
データ送信ジョブで MaxCompute エラーが返されました。詳細については、MaxCompute のドキュメントを参照するか、MaxCompute テクニカルサポートにお問い合わせください。Simple Log Service は、過去 2 日間のすべての失敗したジョブを自動的に再試行します。
MaxCompute スキーマが Simple Log Service の仕様に準拠していません。
Simple Log Service のログフィールドと MaxCompute テーブルの列間のマッピングを再構成します。Simple Log Service は、このエラーが原因で失敗したジョブを自動的に再試行しません。問題を修正した後、手動でジョブを再試行する必要があります。
データ送信ジョブを再試行する
SIMPLE Log Service は、内部エラーが原因で失敗したジョブを自動的に再試行します。それ以外の場合は、失敗したジョブを手動で再試行する必要があります。2 回連続して自動再試行を行う間の最小間隔は 30 分です。ジョブが失敗した場合は、30 分待ってからジョブを再試行してください。Simple Log Service では、過去 2 日間のすべての失敗したジョブを再試行できます。
失敗したジョブをすぐに再試行するには、[すべての失敗したタスクを再試行] をクリックします。API 操作を呼び出したり、SDK を使用してジョブを再試行することもできます。
参考文献
__partition_time__
ほとんどの場合、MaxCompute は時間でデータをフィルタリングするか、ログのタイムスタンプをパーティションフィールドとして使用します。
形式
__partition_time__ フィールドの値は、Simple Log Service の __time__ フィールドの値に基づいて計算され、パーティション時間形式に基づいて最も近い整数に切り捨てられます。日付パーティションキー列の値は、送信間隔に基づいて指定されます。これにより、1 つの MaxCompute テーブルのパーティション数が制限を超えないようにします。
たとえば、Simple Log Service のログのタイムスタンプが 27/Jan/2016 20:50:13 +0800 の場合、Simple Log Service はタイムスタンプに基づいて __time__ フィールドの値を計算します。値は 1453899013 の UNIX タイムスタンプです。次の表に、さまざまな構成における時間パーティション列の値を示します。
送信間隔
パーティション形式
__partition_time__
1800
yyyy_MM_dd_HH_mm_00
2016_01_27_20_30_00
1800
yyyy-MM-dd HH:mm
2016-01-27 20:30
1800
yyyyMMdd
20160127
3600
yyyyMMddHHmm
201601272000
3600
yyyy_MM_dd_HH
2016_01_27_20
使用方法
__partition_time__ フィールドを使用してデータをフィルタリングし、フルテーブルスキャンを防ぐことができます。たとえば、次のクエリ文を実行して、 2016 年 1 月 26 日のログデータをクエリできます。
select * from {ODPS_TABLE_NAME} where log_partition_time >= "2015_01_26" and log_partition_time < "2016_01_27";
__extract_others__
__extract_others__ は JSON 文字列を示します。たとえば、次のクエリ文を実行して、このフィールドの user-agent コンテンツを取得できます。
select get_json_object(sls_extract_others, "$.user-agent") from {ODPS_TABLE_NAME} limit 10;
説明get_json_object は、MaxCompute によって提供される標準ユーザー定義関数( UDF )を示します。標準 UDF を使用するために必要な権限を付与するには、MaxCompute テクニカルサポートにお問い合わせください。詳細については、「MaxCompute によって提供される標準 UDF」をご参照ください。
前の例は参照用です。MaxCompute ドキュメントに記載されている手順が優先されます。
データモデルマッピング
データ送信ジョブが Simple Log Service から MaxCompute にデータを送信する場合、2 つのサービス間のデータモデルマッピングが有効になります。次の表に、使用上の注意と例を示します。
MaxCompute テーブルには、少なくとも 1 つのデータ列と 1 つのパーティションキー列が含まれています。
Simple Log Service では、次の予約フィールドを使用することをお勧めします:__partition_time__、__source__、および __topic__。
各 MaxCompute テーブルには、最大 60,000 個のパーティションを含めることができます。パーティションの数が最大値を超えると、テーブルにデータを書き込むことができません。
データ送信ジョブはバッチで実行されます。カスタムフィールドをパーティションキー列として指定し、データ送信ジョブのデータ型を指定する場合は、各データ送信ジョブで処理する必要のあるパーティションの数が 512 を超えないようにしてください。そうでない場合、MaxCompute にデータを書き込むことができません。
システム予約フィールド __extract_others__ の以前の名前は _extract_others_ です。どちらの名前も一緒に使用できます。
MaxCompute パーティションキー列の値を MaxCompute の予約語またはキーワードに設定することはできません。詳細については、「予約語とキーワード」をご参照ください。
MaxCompute パーティションキー列のフィールドを空にすることはできません。パーティションキー列にマップされるフィールドは、予約フィールドまたはログフィールドである必要があります。cast 関数を使用して、文字列型のフィールドを対応するパーティションキー列の型に変換できます。空のパーティションキー列に対応するログは、データ送信中に破棄されます。
Simple Log Service では、ログフィールドは MaxCompute テーブルの 1 つのデータ列またはパーティションキー列にのみマップできます。フィールドの冗長性はサポートされていません。同じフィールド名が再利用された場合、送信される値は null になります。パーティションキー列に null が表示される場合、データを送信できません。
次の表に、MaxCompute データ列、パーティションキー列、および Simple Log Service フィールド間のマッピング関係を示します。Simple Log Service の予約フィールドの詳細については、「予約フィールド」をご参照ください。
MaxCompute 列の型
MaxCompute の列名
MaxCompute のデータ型
Simple Log Service のログフィールド名
Simple Log Service のフィールド型
説明
データ列
log_source
string
__source__
予約フィールド
ログのソース。
log_time
bigint
__time__
予約フィールド
ログの UNIX タイムスタンプ。 1970 年 1 月 1 日木曜日 UTC 00:00:00 から経過した秒数です。このフィールドは、データモデルの 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
ログコンテンツフィールド
このフィールドはログから解析されます。このフィールドの値は、パーティションの数が上限を超えないようにするために、列挙をサポートしています。