Realtime Compute for Apache Flink は、ファイルシステムコネクタを使用して Object Storage Service (OSS) との間で読み書きを行うことをサポートしています。OSS は、99.9999999999% (トゥエルブナイン) のデータ耐久性と 99.995% の可用性を提供し、大規模な Flink パイプラインにとって信頼性の高いストアとなります。
| カテゴリ | 詳細 |
|---|---|
| サポートされるテーブルタイプ | ソーステーブルおよび結果テーブル |
| 実行モード | バッチおよびストリーム |
| データ形式 | ORC、Parquet、Avro、CSV、JSON、および raw |
| 特定の監視メトリクス | なし |
| API タイプ | DataStream API および SQL |
| 結果テーブル内のデータの更新または削除 | 挿入のみ。更新と削除はサポートされていません。 |
制限事項
全般:
-
OSS からの圧縮ファイル (GZIP、BZIP2、XZ、DEFLATE) の読み取りをサポートしているのは、Ververica Runtime (VVR) 11 以降のみです。VVR 8 は圧縮ファイルを正しく処理できません。
-
8.0.6 より前の VVR バージョンは、同じアカウント内の OSS バケットのみをサポートします。アカウント間でバケットにアクセスするには、VVR 8.0.6 以降を使用し、バケット認証を設定する必要があります。詳細については、「バケット認証の設定」をご参照ください。
-
新しいパーティションの増分読み取りはサポートされていません。
-
クロスリージョンの OSS アクセスはサポートされていません。OSS バケットは Flink ワークスペースと同じリージョンにある必要があります。OSS コネクタは、単一のグローバルエンドポイントのみをサポートするファイルシステムインターフェイス上に構築されています。異なるリージョンの OSS バケットにアクセスすると、エンドポイントの不一致エラーが発生します。
シンクテーブルのみ:
OSS への書き込み時、行フォーマット (Avro、CSV、JSON、raw) はサポートされていません。詳細については、FLINK-30635 をご参照ください。
構文
CREATE TABLE OssTable (
column_name1 INT,
column_name2 STRING,
...
datetime STRING,
`hour` STRING
) PARTITIONED BY (datetime, `hour`) WITH (
'connector' = 'filesystem', -- 必須: 'filesystem' である必要があります
'path' = 'oss://<bucket>/path', -- 必須: OSS パスの URI
'format' = '...', -- 必須: orc, parquet, avro, csv, json, または raw
'partition.default-name' = '...', -- オプション: パーティションフィールドが NULL または空の場合のパーティション名
'source.monitor-interval' = '...', -- オプション (ソースのみ): 新しいファイルをスキャンする間隔
'auto-compaction' = '...' -- オプション (sink のみ): 各チェックポイント後の自動コンパクションを有効にする
);
メタデータ列
ソーステーブルは、各行のファイルレベルの情報を公開するメタデータ列をサポートしています。DDL でデータ型の後に METADATA を追加してメタデータ列を定義します。
CREATE TABLE MyUserTableWithFilepath (
column_name1 INT,
column_name2 STRING,
`file.path` STRING NOT NULL METADATA
) WITH (
'connector' = 'filesystem',
'path' = 'oss://<bucket>/path',
'format' = 'json'
)
以下のメタデータ列が利用可能です。
| キー | データ型 | 説明 |
|---|---|---|
file.path |
STRING NOT NULL | 行を含むファイルのフルパス。 |
file.name |
STRING NOT NULL | ファイル名 (パスの最後の要素)。 |
file.size |
BIGINT NOT NULL | ファイルサイズ (バイト単位)。 |
file.modification-time |
TIMESTAMP_LTZ(3) NOT NULL | ファイルの最終更新時刻。 |
WITH パラメーター
一般パラメーター
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
connector |
はい | — | filesystem である必要があります。 |
path |
はい | — | URI 形式の OSS パス。例:oss://my_bucket/my_path。VVR 8.0.6 以降では、このパラメーターを設定した後にバケット認証が必要です。詳細については、「バケット認証の設定」をご参照ください。 |
format |
はい | — | ファイル形式:csv、json、avro、parquet、orc、または raw。 |
ソーステーブルのパラメーター
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
source.monitor-interval |
いいえ | — | 新しいファイルをスキャンする間隔。0 より大きい必要があります。設定しない場合、パスは一度スキャンされ、ソースは有界になります。各ファイルはそのパスによって識別され、一度だけ処理されます。処理されたファイルパスは状態に保存され、チェックポイントとセーブポイントを越えて永続化されます。間隔を短くするとファイルの検出が速くなりますが、スキャン頻度が増加します。 |
シンクテーブルのパラメーター
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
partition.default-name |
いいえ | _DEFAULT_PARTITION__ |
パーティションフィールドが NULL または空文字列の場合に使用されるパーティション名。 |
sink.rolling-policy.file-size |
いいえ | 128 MB | ローリングする前の最大パートファイルサイズ。各 sink サブタスクは、パーティションごとに少なくとも 1 つのパートファイルを作成します。これがファイル形式とどのように相互作用するかについては、「ローリングポリシーの動作」をご参照ください。 |
sink.rolling-policy.rollover-interval |
いいえ | 30min | パートファイルがローリングされる前に開いたままでいられる最大時間。チェック頻度は sink.rolling-policy.check-interval によって制御されます。 |
sink.rolling-policy.check-interval |
いいえ | 1min | sink.rolling-policy.rollover-interval に基づいてパートファイルをローリングすべきかどうかをチェックする頻度。 |
auto-compaction |
いいえ | false | 自動コンパクションを有効にするかどうか。データはまず一時ファイルに書き込まれます。各チェックポイントの後、そのチェックポイントからの一時ファイルがより大きなファイルにマージされます。一時ファイルはマージされるまで表示されません。有効にすると、チェックポイント内のファイルのみがマージされます (チェックポイントごとに少なくとも 1 つのファイル)。データの可視性遅延は チェックポイント間隔 + コンパクション時間 に等しくなります。長いコンパクション実行はバックプレッシャーを引き起こし、チェックポイントを遅延させる可能性があります。 |
compaction.file-size |
いいえ | 128 MB | コンパクションされた出力のターゲットファイルサイズ。デフォルトでは sink.rolling-policy.file-size と同じ値になります。 |
sink.partition-commit.trigger |
いいえ | process-time |
パーティションをコミットするタイミング。詳細については、「パーティションコミットのトリガー」をご参照ください。 |
sink.partition-commit.delay |
いいえ | 0s |
パーティションをコミットする前の最小遅延。日次パーティションの場合は 1 d、時間単位のパーティションの場合は 1 h に設定します。 |
sink.partition-commit.watermark-time-zone |
いいえ | UTC |
パーティションコミットの比較のために LONG 型のウォーターマークを TIMESTAMP に解析するためのタイムゾーン。sink.partition-commit.trigger が partition-time の場合にのみ適用されます。ウォーターマークが TIMESTAMP_LTZ 列で定義されている場合は、セッションタイムゾーンを使用します (例:Asia/Shanghai)。完全なタイムゾーン名 (例:America/Los_Angeles) またはカスタムオフセット (例:GMT-08:00) を受け入れます。正しく設定されていない場合、パーティションのコミットが数時間遅れる可能性があります。 |
partition.time-extractor.kind |
いいえ | default |
パーティションフィールドから時間を抽出する方法。default:タイムスタンプパターンまたはフォーマッタを設定します。custom:エクストラクタクラスを指定します。 |
partition.time-extractor.class |
いいえ | — | PartitionTimeExtractor インターフェイスを実装するクラス。partition.time-extractor.kind が custom の場合に必須です。 |
partition.time-extractor.timestamp-pattern |
いいえ | — | パーティションフィールドからタイムスタンプを構築するためのパターン。デフォルトでは、最初のフィールドが yyyy-MM-dd hh:mm:ss を使用して抽出されます。例:$dt (単一フィールド)、$year-$month-$day $hour:00:00 (複数フィールド)、$dt $hour:00:00 (2 つのフィールド)。 |
partition.time-extractor.timestamp-formatter |
いいえ | yyyy-MM-dd HH:mm:ss |
partition.time-extractor.timestamp-pattern によって表現されるタイムスタンプ文字列をタイムスタンプに変換するためのフォーマッタ。たとえば、partition.time-extractor.timestamp-pattern が $year$month$day の場合、これを yyyyMMdd に設定します。Java の DateTimeFormatter と互換性があります。 |
sink.partition-commit.policy.kind |
いいえ | — | パーティションが準備完了したことをダウンストリームのコンシューマーに通知する方法。success-file:パーティションディレクトリに _SUCCESS ファイルを書き込みます。custom:PartitionCommitPolicy を実装するクラスを使用します。複数のポリシーを組み合わせることができます。 |
sink.partition-commit.policy.class |
いいえ | — | PartitionCommitPolicy を実装するクラス。sink.partition-commit.policy.kind が custom の場合に必須です。 |
sink.partition-commit.success-file.name |
いいえ | _SUCCESS |
success-file コミットポリシーによって書き込まれる成功ファイルの名前。 |
sink.parallelism |
いいえ | — | ファイル書き込み演算子の並列度。デフォルトでは、アップストリーム演算子の並列度になります。0 より大きい必要があります。auto-compaction が有効な場合、コンパクション演算子もこの並列度を使用します。 |
ローリングポリシーの動作
ローリングの動作はファイル形式によって異なります。
列指向フォーマット (Parquet、ORC、Avro) の場合、ローリングポリシーの基準が満たされていなくても、パートファイルは常にチェックポイント時にローリングされます。ファイルサイズとロールオーバー間隔は、チェックポイント間の追加のトリガーとして適用されます。
行指向フォーマット (CSV、JSON、raw) の場合、パートファイルはローリングポリシーの基準 (sink.rolling-policy.file-sizeまたはsink.rolling-policy.rollover-interval) が満たされた場合にのみローリングされます。低遅延のファイル可視性が必要な場合は、sink.rolling-policy.rollover-intervalをチェックポイント間隔と一緒に調整してください。
FLINK-30635 のため、OSS 結果テーブルでは行指向フォーマットはサポートされていません。将来のバージョンで行指向フォーマットのサポートが追加された場合、上記の動作が適用されます。
パーティションコミットのトリガー
sink.partition-commit.trigger には 2 種類のトリガーが利用可能です。
-
`process-time` (デフォルト):現在のシステム時刻がパーティション作成時刻と
sink.partition-commit.delayの合計を超えたときにパーティションをコミットします。ウォーターマークやパーティション時間エクストラクタは必要ありません。より一般的ですが、精度は低くなります。データの遅延や障害により、時期尚早なコミットが発生する可能性があります。 -
`partition-time`:ウォーターマークがパーティション作成時刻と
sink.partition-commit.delayの合計を超えたときにパーティションをコミットします。ウォーターマークの生成と時間ベースのパーティション (時間単位、日単位など) が必要です。
バケット認証の設定
VVR 8.0.6 以降のみがバケット認証をサポートしています。
path パラメーターを設定した後、Flink が指定された OSS パスから読み書きできるようにバケット認証を設定します。Realtime Compute 開発コンソールの [デプロイ詳細] ページの [パラメーター] タブにある [追加設定] セクションに以下を追加します。
fs.oss.bucket.<bucketName>.accessKeyId: <your-access-key-id>
fs.oss.bucket.<bucketName>.accessKeySecret: <your-access-key-secret>
<bucketName> を path パラメーターで使用したバケット名に置き換えます。
| 設定項目 | 説明 |
|---|---|
fs.oss.bucket.<bucketName>.accessKeyId |
バケットの AccessKey ID。既存の AccessKey を使用するか、新しく作成します。詳細については、「AccessKey の作成」をご参照ください。 |
fs.oss.bucket.<bucketName>.accessKeySecret |
バケットの AccessKey Secret。 |
AccessKey Secret は作成時に一度しか表示されません。安全に保管してください。
OSS-HDFS への書き込み
Realtime Compute 開発コンソールの [デプロイ詳細] ページの [パラメーター] タブにある [追加設定] セクションに以下の設定を追加します。
fs.oss.jindo.buckets: <bucket-names>
fs.oss.jindo.accessKeyId: <your-access-key-id>
fs.oss.jindo.accessKeySecret: <your-access-key-secret>
| 設定項目 | 説明 |
|---|---|
fs.oss.jindo.buckets |
OSS-HDFS のバケット名。セミコロンで区切ります。Flink が OSS パスに書き込む際、対応するバケットがここにリストされている場合、データは OSS-HDFS サービスに書き込まれます。 |
fs.oss.jindo.accessKeyId |
AccessKey ID。詳細については、「AccessKey の作成」をご参照ください。 |
fs.oss.jindo.accessKeySecret |
AccessKey Secret。 |
AccessKey Secret は作成時に一度しか表示されません。安全に保管してください。
以下のいずれかの方法で OSS-HDFS エンドポイントを設定します。
パラメーター設定
[追加設定] にエンドポイントを追加します。
fs.oss.jindo.endpoint: <oss-hdfs-endpoint>
パス設定
OSS パスにエンドポイントを直接埋め込みます。
oss://<bucket-name>.<oss-hdfs-endpoint>/<directory>
この方法を使用する場合、fs.oss.jindo.buckets には <bucket-name>.<oss-hdfs-endpoint> を含める必要があります。
たとえば、バケット名が jindo-test で、エンドポイントが cn-beijing.oss-dls.aliyuncs.com の場合:
# OSS パス
oss://jindo-test.cn-beijing.oss-dls.aliyuncs.com/<directory>
# 追加設定
fs.oss.jindo.buckets: jindo-test,jindo-test.cn-beijing.oss-dls.aliyuncs.com
外部の Hadoop 分散ファイルシステム (HDFS) への書き込み
hdfs:// スキーマを使用するパスの場合、アクセスユーザー名を指定または切り替えるために以下を追加します。
containerized.taskmanager.env.HADOOP_USER_NAME: hdfs
containerized.master.env.HADOOP_USER_NAME: hdfs
例
OSS からの読み取り (ソーステーブル)
CREATE TEMPORARY TABLE fs_table_source (
`id` INT,
`name` VARCHAR
) WITH (
'connector' = 'filesystem',
'path' = 'oss://<bucket>/path',
'format' = 'parquet'
);
CREATE TEMPORARY TABLE blackhole_sink (
`id` INT,
`name` VARCHAR
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink SELECT * FROM fs_table_source;
OSS への書き込み (結果テーブル)
パーティションテーブルへの書き込み
この例では、datagen ソースからデータをストリーミングし、日付と時間でパーティション分割し、partition-time トリガーを使用してパーティションをコミットします。
CREATE TABLE datagen_source (
user_id STRING,
order_amount DOUBLE,
ts BIGINT, -- タイムスタンプ (ミリ秒)
ts_ltz AS TO_TIMESTAMP_LTZ(ts, 3),
WATERMARK FOR ts_ltz AS ts_ltz - INTERVAL '5' SECOND -- TIMESTAMP_LTZ 列のウォーターマーク
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE fs_table_sink (
user_id STRING,
order_amount DOUBLE,
dt STRING,
`hour` STRING
) PARTITIONED BY (dt, `hour`) WITH (
'connector' = 'filesystem',
'path' = 'oss://<bucket>/path',
'format' = 'parquet',
'partition.time-extractor.timestamp-pattern' = '$dt $hour:00:00',
'sink.partition-commit.delay' = '1 h',
'sink.partition-commit.trigger' = 'partition-time',
'sink.partition-commit.watermark-time-zone' = 'Asia/Shanghai',
'sink.partition-commit.policy.kind' = 'success-file'
);
INSERT INTO fs_table_sink
SELECT
user_id,
order_amount,
DATE_FORMAT(ts_ltz, 'yyyy-MM-dd'),
DATE_FORMAT(ts_ltz, 'HH')
FROM datagen_source;
非パーティション化テーブルへの書き込み
CREATE TABLE datagen_source (
user_id STRING,
order_amount DOUBLE
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE fs_table_sink (
user_id STRING,
order_amount DOUBLE
) WITH (
'connector' = 'filesystem',
'path' = 'oss://<bucket>/path',
'format' = 'parquet'
);
INSERT INTO fs_table_sink SELECT * FROM datagen_source;
DataStream API
DataStream API を使用するには、まず DataStream コネクタを設定する必要があります。詳細については、「DataStream コネクタの使用」をご参照ください。
以下の例では、StreamingFileSink と OnCheckpointRollingPolicy を使用して OSS に書き込みます。パートファイルは各チェックポイントでローリングされます。
String outputPath = "oss://<bucket>/path";
final StreamingFileSink<Row> sink =
StreamingFileSink.forRowFormat(
new Path(outputPath),
(Encoder<Row>) (element, stream) -> {
out.println(element.toString());
})
.withRollingPolicy(OnCheckpointRollingPolicy.build())
.build();
outputStream.addSink(sink);
OSS-HDFS に書き込むには、[追加設定] で OSS-HDFS パラメーターも設定します。詳細については、「OSS-HDFS への書き込み」をご参照ください。