Log Service カスタム ETL 関数 のデータ読み取り端末は、Alibaba Cloud の Function Compute 上で稼働しています。 さまざまな ETL の目的に応じて、Log Service の提供する関数テンプレートまたはユーザー定義関数を使用できます。
本ドキュメントでは、ユーザー定義の Log Service ETL 関数を実装する方法を紹介します。
関数イベント
関数イベント は、関数を実行するために使用される入力パラメーターのコレクションであり、 シリアル化された JSON オブジェクト文字列の形式です。
フィールドの説明- jobName フィールド
Log Service ETL ジョブの名前。Function Compute サービスの Log Service トリガー は、Log Service の ETL ジョブです。
- taskId フィールド
ETL ジョブで、taskId は関数呼び出しに固有の識別子です。
- cursorTime フィールド
関数呼び出しにより、Log Service の取得した最終ログの unix_timestamp です。
- source フィールド
本フィールドは、Log Service によって生成されます。Log Service は、ETL ジョブで定義されたタスク間隔に基づいて関数の実行を定期的にトリガーします。source フィールドは、関数イベントの要です。本フィールドには、関数呼び出しによって読み取られるデータが定義されます。
データソース範囲は、以下のフィールドで構成されます (関連するフィールド定義の詳細については、Log Service 用語集をご参照ください)。
フィールド フィールドの説明 endpoint Log Service プロジェクトと同じリージョンのサービスエンドポイント projectNa プロジェクト名 logstoreName Logstore 名 Shardid 指定の Logstore のシャード beginCursor データの読み取り開始のシャード位置 endCursor データの読み取り終了のシャード位置 注 シャードの [beginCursor、endCursor) は、左閉じ、右開きの間隔です。 - parameter フィールド
JSON オブジェクトフィールドは、ETL ジョブの作成時に設定されます (Function Compute の Log Service トリガー)。ユーザー定義関数の実行時には、本フィールドが解析され、関数に必要な操作パラメーターを取得します。
Function Compute コンソールで Log Service トリガーを作成するときは、関数設定フィールドでこのフィールドを設定します。図 1. 関数設定
関数イベントの例
{
"source": {
"endpoint": "http://cn-shanghai-intranet.log.aliyuncs.com",
"projectName": "fc-158429**********",
"logstoreName": "demo",
"shardId": 0,
"beginCursor": "MTUwNTM5MDI3NTY1ODcwNzU2Ng==",
"endCursor": "MTUwNTM5MDI3NTY1ODcwNzU2OA=="
},
"parameter": {
...
},
"jobName": "fedad35f51a2a97b466da57fd71f315f539d2234",
"taskId": "9bc06c96-e364-4f41-85eb-b6e579214ae4",
"cursorTime": 1511429883
}
関数をデバッグするときは、GetCursor API を使用してカーソルを取得し、上記の形式に沿ってテストする関数イベントを作成します。
関数の開発
Java、Python、Node.js といったさまざまな言語の関数を実装できます。Log Service は、関数の実装を容易にするために対応するランタイム、さまざまな言語の SDK を提供します。
この節では、Java 8 ランタイムを例として使用し、 Log Service ETL 関数を開発する方法を紹介します。 これには Java 8 関数のプログラミングの詳細が含まれているため、最初に Function Compute の Javaプログラミングガイド をお読みください。
Java 関数テンプレート現在、 Log Service は Java 8 実行環境に基づいて ユーザー定義の ETL 関数テンプレートを提供しています。 これらのテンプレートを使用して、カスタム要件を実装することができます。
テンプレートには次の機能が実装されています。
- 関数イベント内の source、taskId、および jobName フィールドの解析
- Log Service Java SDKで source に定義されたデータソースからデータを読み込み、processData API 呼び出しにより、データのまとまりを処理
テンプレートには、以下も含まれている必要があります。
- 関数イベントのパラメーターフィールド解析に
UserDefinedFunctionParameter.ja-JPva
- 関数内のデータのサービスロジックをカスタマイズするに
UserDefinedFunction.java
の ProcessData API UserDefinedFunction
を関数を的確に説明する名前に変更
processData では、必要に応じてデータのまとまりを読み込み、処理、送信する必要があります。
Logstore からデータを読み取り、別の Logstore に書き込む方法は、LogstoreReplication (英文)をご参照ください。
注意- processData を使用してデータが正常に処理された場合は、true が返されます。データ処理で例外が発生し、再試行しても例外が発生する場合は、false が返されます。ただし、例外が発生しても、関数は引き続き実行され、Log Service は正常に処理されなかったデータを無視して、成功した ETL タスクと判断します。
- 致命的なエラーが発生した場合、またはサービスロジックにより関数の実行を早期に終了する必要があると判断する場合は、Throw Exception で関数の実行を終了してください。Log Service は、ETL ジョブルールに基づいて、関数処理の例外を検出し、 関数の実行を再度呼び出します。
注意事項
- シャードのトラフィックが多い場合は、関数の OOM による異常終了を防ぐため、その関数の実行に十分なメモリを設定してください。
- 関数の実行に時間のかかる場合、または、シャードのトラフィックが多い場合は、関数のトリガー間隔を小さく、また、関数のタイムアウトしきい値を高く設定してください。
- Function Compute サービスに必要な権限を付与してください。たとえば、Object Storage Service (OSS) データを関数に書き込むには、Function Compute サービスに OSS への書き込み権限を付与する必要があります。
ETL ログ
- ETL スケジューリングログ
スケジューリングログには、ETL タスクの開始時刻と終了時刻、ETL タスクが成功したかどうか、および ETL タスクの情報が正常に返されたかどうかのみが記録されます。ETL タスクでエラーが発生すると、Function Compute サービスは ETL エラーログを生成し、システム管理者にアラーム E-メールまたは SMS を送信します。トリガーを作成するときは、トリガーログ Logstore を設定し、この Logstore のクエリおよびインデックス関数を有効にします。
関数実行統計は、Java 8 関数 outputStream などの関数によって書き出され、返されます。 Log Service に用意されているデフォルトのテンプレートは、シリアル化された JSON オブジェクト文字列を書き込みます。この文字列は ETL タスクスケジューリングログに記録され、統計とクエリが容易になります。
- ETL プロセスログ
ETL プロセスログには、ステップの開始時刻、終了時刻、初期化完了、モジュールエラー情報といった、 ETL 実行プロセスにおける各ステップのキーポイントやエラーが記録されます。ETL プロセスログにより、ETL 操作状況を常に最新の状態に保つことができます。エラーが発生した場合は、直ちにプロセスログで原因を特定することができます。
context.getLogger() を使用して、プロセスログを特定のプロジェクトや Log Service の Logstore に記録することができます。Logstore のインデックス機能およびクエリ機能を有効にすることをお勧めします。