メインコンテンツまでスキップ
に最終更新

Huawei Cloud OBS

Apache Doris は、Huawei Cloud Object Storage Service(OBS)からデータファイルを直接インポートできます。一般に、オフラインでのデータ移行、過去データの補完、データレイク上のファイルのデータウェアハウスへの取り込みに使用します。このドキュメントでは、CSV ファイルを例に、両方のインポート方法の手順を説明します。

方法の選択​

Doris では、Huawei Cloud OBS からファイルをインポートする方法が二つあります。データ量と適時性の要件に応じて選択してください。

インポート方法種類適した用途参照先
S3 Load非同期インポート大量のデータを一括インポートする場合。ジョブはバックグラウンドで実行され、失敗時の再試行に対応しますBroker Load マニュアル
TVF(テーブル値関数)同期インポート少量から中量のデータやアドホッククエリに適しており、INSERT INTO ... SELECT と組み合わせて使用しますこのドキュメントの「TVF を使用したインポート」

注: どちらの方法も S3 プロトコルを介して OBS にアクセスするため、OBS が提供する Endpoint、Region、Access Key、Secret Key が必要です。

前提条件​

インポートを開始する前に、以下を用意してください。

  • アクセス可能な Huawei Cloud OBS バケット。インポートするデータファイルを事前にアップロードしておきます。
  • OBS の Endpoint(例: obs.cn-north-1.myhuaweicloud.com)と、対応する Region(例: cn-north-1)。
  • バケットの読み取り権限を持つ Access Key(AK) と Secret Key(SK)。
  • デプロイ済みの Apache Doris クラスター。現在のユーザーには、対象のデータベースとテーブルに対する LOAD_PRIV 権限が必要です。

S3 Load を使用したインポート​

S3 Load は非同期のインポート方法です。ジョブを送信すると、Doris がバックグラウンドでスケジュールして実行するため、大量のデータに適しています。パラメータやステータスの確認方法について詳しくは、Broker Load マニュアルを参照してください。

ステップ 1: データを準備する​

CSV ファイル s3load_example.csv を Huawei Cloud OBS にアップロードします。ファイルの内容は次のとおりです。

1,Emily,25
2,Benjamin,35
3,Olivia,28
4,Alexander,60
5,Ava,17
6,William,69
7,Sophia,32
8,James,64
9,Emma,37
10,Liam,64

ステップ 2: Doris にテーブルを作成する​

ファイルの構造に合わせて、Doris に対象テーブルを作成します。

CREATE TABLE test_s3load(
user_id BIGINT NOT NULL COMMENT "user id",
name VARCHAR(20) COMMENT "name",
age INT COMMENT "age"
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

ステップ 3: S3 Load でデータをインポートする​

OBS 上の CSV ファイルを対象テーブルにインポートする S3 Load ジョブを送信します。

LOAD LABEL s3_load_2022_04_01
(
DATA INFILE("s3://your_bucket_name/s3load_example.csv")
INTO TABLE test_s3load
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(user_id, name, age)
)
WITH S3
(
"provider" = "OBS",
"s3.endpoint" = "obs.cn-north-1.myhuaweicloud.com",
"s3.region" = "cn-north-1",
"s3.access_key" = "<your-ak>",
"s3.secret_key" = "<your-sk>"
)
PROPERTIES
(
"timeout" = "3600"
);

主なパラメータは次のとおりです。

パラメータ説明
DATA INFILEs3:// プロトコルのプレフィックスを使用した OBS ファイルのパス
providerオブジェクトストレージの種類が Huawei Cloud であることを示すため、OBS に固定します
s3.endpointOBS サービスの Endpoint。バケットのリージョンに合わせて設定します
s3.regionOBS バケットが配置されている Region
s3.access_key / s3.secret_key認証に使用する AK/SK
timeoutジョブのタイムアウト。単位は秒です

ステップ 4: インポートしたデータを確認する​

インポート完了後、対象テーブルをクエリして、データが正しく書き込まれたことを確認します。

SELECT * FROM test_s3load;

期待される出力:

mysql> select * from test_s3load;
+---------+-----------+------+
| user_id | name | age |
+---------+-----------+------+
| 5 | Ava | 17 |
| 10 | Liam | 64 |
| 7 | Sophia | 32 |
| 9 | Emma | 37 |
| 1 | Emily | 25 |
| 4 | Alexander | 60 |
| 2 | Benjamin | 35 |
| 3 | Olivia | 28 |
| 6 | William | 69 |
| 8 | James | 64 |
+---------+-----------+------+
10 rows in set (0.04 sec)

TVF を使用したインポート​

TVF(テーブル値関数)は、OBS 上のファイルをテーブル関数が返す仮想テーブルとして公開します。そのため、INSERT INTO ... SELECT を使って同期インポートを直接実行できます。SQL 式と組み合わせた軽量な ETL にも便利です。

ステップ 1: データを準備する​

S3 Load で使用したものと同じ CSV ファイル s3load_example.csv を OBS にアップロードします。

1,Emily,25
2,Benjamin,35
3,Olivia,28
4,Alexander,60
5,Ava,17
6,William,69
7,Sophia,32
8,James,64
9,Emma,37
10,Liam,64

ステップ 2: Doris にテーブルを作成する​

CREATE TABLE test_s3load(
user_id BIGINT NOT NULL COMMENT "user id",
name VARCHAR(20) COMMENT "name",
age INT COMMENT "age"
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

ステップ 3: TVF でデータをインポートする​

S3 テーブル関数を使って OBS 上のファイルを読み込み、INSERT INTO ... SELECT で対象テーブルに書き込みます。

INSERT INTO test_s3load
SELECT * FROM S3
(
"uri" = "s3://your_bucket_name/s3load_example.csv",
"format" = "csv",
"provider" = "OBS",
"s3.endpoint" = "obs.cn-north-1.myhuaweicloud.com",
"s3.region" = "cn-north-1",
"s3.access_key" = "<your-ak>",
"s3.secret_key" = "<your-sk>",
"column_separator" = ",",
"csv_schema" = "user_id:int;name:string;age:int"
);

主なパラメータは次のとおりです。

パラメータ説明
uris3:// プロトコルのプレフィックスを使用した OBS ファイルの URI
formatファイル形式。CSV ファイルには csv を使用します
providerOBS に固定します
s3.endpoint / s3.regionOBS の Endpoint と Region
s3.access_key / s3.secret_keyOBS の認証に必要な AK/SK
column_separatorフィールドの区切り文字。CSV のデフォルトは , です
csv_schemaCSV の列の型定義。形式は column_name:type;column_name:type;... です

ステップ 4: インポートしたデータを確認する​

SELECT * FROM test_s3load;

期待される出力:

mysql> select * from test_s3load;
+---------+-----------+------+
| user_id | name | age |
+---------+-----------+------+
| 5 | Ava | 17 |
| 10 | Liam | 64 |
| 7 | Sophia | 32 |
| 9 | Emma | 37 |
| 1 | Emily | 25 |
| 4 | Alexander | 60 |
| 2 | Benjamin | 35 |
| 3 | Olivia | 28 |
| 6 | William | 69 |
| 8 | James | 64 |
+---------+-----------+------+
10 rows in set (0.04 sec)

よくある質問​

Q1: S3 Load と TVF はどのように使い分けますか?

  • データ量が多く、非同期実行と失敗時の再試行が必要な場合は、S3 Load を選択します。
  • データ量が少なく、すぐに結果が必要な場合や、インポート時に SQL 式で軽量な変換を行う場合は、TVF を選択します。

Q2: provider パラメータを OBS に設定する必要があるのはなぜですか?

provider パラメータは、基盤となるオブジェクトストレージのベンダー種別を識別します。Huawei Cloud OBS は S3 プロトコルと互換性がありますが、署名方式などの詳細が異なります。Doris が対応するアクセスアダプターを使用できるよう、OBS を明示的に指定する必要があります。

Q3: OBS の Endpoint と Region はどこで確認できますか?

Huawei Cloud OBS コンソールのバケット概要ページで確認できます。一般的な Endpoint は obs.<region>.myhuaweicloud.com の形式です。たとえば、cn-north-1 リージョンに対応する Endpoint は obs.cn-north-1.myhuaweicloud.com です。

Q4: CSV 以外にどのファイル形式がサポートされていますか?

S3 Load と TVF は、どちらも csv、parquet、orc、json などの一般的な形式に対応しています。FORMAT AS または format パラメータで形式を指定してください。

トラブルシューティング​

症状考えられる原因対処方法
Access Denied または 403 エラーAK/SK が正しくないか、アカウントにバケットの読み取り権限がありませんHuawei Cloud コンソールで AK/SK を確認し、アカウントに OBS バケットの読み取り権限を付与します
endpoint is invalid エラーEndpoint のスペルが誤っているか、リージョンと一致していませんバケットのリージョンを確認し、そのリージョンに対応する Endpoint を使用します
インポートジョブが PENDING 状態のままになるクラスターがビジー状態か、インポートの同時実行数が制限されていますSHOW LOAD でジョブのステータスを確認し、必要に応じて同時実行数を調整するか、リソースが解放されるまで待ちます
TVF で列数または型の不一致が報告されるcsv_schema が実際のファイルの列構造と一致していませんファイルの列順、列数、データ型を確認し、csv_schema を修正します
インポートがタイムアウトするファイルが大きく、デフォルトの timeout では足りませんtimeout を PROPERTIES で増やします(単位は秒)