Перейти к содержимому
Последнее обновление

Aliyun OSS

Apache Doris поддерживает импорт файлов из Aliyun OSS (Object Storage Service) для двух типичных сценариев: массового асинхронного импорта и синхронного импорта по мере необходимости. В этой статье сравниваются оба подхода, приводятся пошаговые инструкции и рассматриваются распространённые проблемы и способы их устранения.

Выбор подхода​

Прежде чем выбрать способ импорта, обратитесь к таблице ниже, чтобы определить, какой подход подходит для вашего сценария:

Способ импортаКоманда запускаСинхронный/асинхронныйСценарий использованияСправочная документация
S3 LoadLOAD LABEL ...АсинхронныйИмпорт больших объёмов данных, требующий управления задачами и повторных попыток при сбояхРуководство по Broker Load
Импорт через TVFINSERT INTO ... SELECT FROM S3(...)СинхронныйРазовые запросы и небольшой объём импорта, когда результат нужен немедленно-

Предварительные требования​

Перед началом работы убедитесь, что у вас есть следующие сведения и выполнены необходимые условия:

  • Имя bucket в Aliyun OSS и путь к целевому файлу
  • Учётные данные для доступа: AccessKey (AK) и SecretKey (SK)
  • Endpoint OSS и сведения о Region
  • Кластер Doris имеет доступ к OSS через общедоступную или внутреннюю сеть
Выбор Endpoint

В Aliyun OSS используются разные Endpoint для общедоступной и внутренней сети. Если кластер Doris и OSS находятся в одном Region, используйте Endpoint внутренней сети, чтобы снизить задержку, получить более стабильную пропускную способность и избежать платы за трафик в общедоступной сети.

  • Внутренний Endpoint: oss-cn-hangzhou-internal.aliyuncs.com
  • Общедоступный Endpoint: oss-cn-hangzhou.aliyuncs.com

Импорт с помощью S3 Load (асинхронный)​

S3 Load — это способ асинхронного импорта на основе Broker Load, подходящий для пакетной загрузки данных. Подробное описание механизма приведено в руководстве по Broker Load.

Шаг 1: Подготовьте данные​

Создайте в Aliyun OSS файл CSV s3load_example.csv со следующим содержимым:

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: Запустите импорт с помощью 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" = "OSS",
"s3.endpoint" = "oss-cn-hangzhou.aliyuncs.com",
"s3.region" = "oss-cn-hangzhou",
"s3.access_key" = "<your-ak>",
"s3.secret_key" = "<your-sk>"
)
PROPERTIES
(
"timeout" = "3600"
);

Основные параметры:

ПараметрОписание
providerТип объектного хранилища. Для Aliyun OSS используется фиксированное значение OSS.
s3.endpointEndpoint сервиса OSS. Выбирайте его с учётом Region и сетевого окружения.
s3.regionНазвание Region OSS, например oss-cn-hangzhou.
s3.access_keyAccessKey ID учётной записи Aliyun.
s3.secret_keyAccessKey Secret учётной записи Aliyun.
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 (Table Value Function) позволяет читать файлы из объектного хранилища напрямую с помощью табличной функции и синхронно записывать данные в целевую таблицу через INSERT INTO ... SELECT. Этот подход подходит для разового импорта данных или загрузки небольшими пакетами.

Шаг 1: Подготовьте данные​

Создайте в Aliyun OSS файл CSV s3load_example.csv со следующим содержимым:

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​

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

Основные параметры:

ПараметрОписание
uriАдрес файла в OSS с префиксом протокола s3://.
formatФормат файла, например csv, parquet или orc.
providerТип объектного хранилища. Для Aliyun OSS используется фиксированное значение OSS.
s3.endpointEndpoint сервиса OSS.
s3.regionНазвание Region OSS.
s3.access_keyAccessKey ID учётной записи Aliyun.
s3.secret_keyAccessKey Secret учётной записи Aliyun.
column_separatorРазделитель столбцов CSV.
csv_schemaОпределения столбцов CSV в формате 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)

Часто задаваемые вопросы​

Вопрос 1: Как выбрать между S3 Load и импортом через TVF?​

  • Используйте S3 Load, если объём данных велик и вам нужно асинхронное выполнение с планированием задач и механизмами повторных попыток.
  • Используйте импорт через TVF, если вам нужны разовые запросы или синхронная запись с немедленным получением результата.

Вопрос 2: Чем внутренний Endpoint отличается от общедоступного Endpoint?​

  • Если кластер Doris и OSS находятся в одном Region, использование внутреннего Endpoint (например, oss-cn-hangzhou-internal.aliyuncs.com) снижает задержку, обеспечивает более стабильную пропускную способность и позволяет избежать платы за трафик в общедоступной сети.
  • Для доступа между разными Region или при размещении кластера вне Aliyun используйте общедоступный Endpoint (например, oss-cn-hangzhou.aliyuncs.com).

Вопрос 3: Почему параметр provider должен иметь значение OSS?​

Параметр provider сообщает серверной части Doris, какой тип объектного хранилища используется, чтобы она могла учитывать особенности аутентификации и протокола Aliyun OSS. При импорте файлов из Aliyun OSS необходимо явно задать для этого параметра значение OSS.

Вопрос 4: Что делать, если задача S3 Load зависает или завершается по тайм-ауту?​

  • Увеличьте значение timeout (в секундах) в PROPERTIES.
  • Проверьте сетевое соединение и по возможности используйте внутренний Endpoint.
  • Выполните SHOW LOAD, чтобы посмотреть состояние задачи и причину сбоя. Подробнее см. в руководстве по Broker Load.

Вопрос 5: Поддерживает ли импорт через TVF другие форматы, кроме CSV?​

Да. С помощью значений csv, parquet и orc параметра format можно выбрать соответствующий формат. Для форматов, отличных от CSV, указывать column_separator и csv_schema не требуется.