Перейти к основному содержимому
Версия: 2.0.x

BROKER LOAD

Selena предоставляет метод загрузки данных на основе MySQL - Broker Load. После отправки задачи загрузки Selena выполняет её асинхронно. Вы можете использовать SELECT * FROM information_schema.loads для запроса результата задачи. Эта функция поддерживается начиная с версии v1.5.2. Для получения дополнительной информации о фоновой информации, принципах, поддерживаемых форматах файлов данных, способах выполнения загрузки в одну и несколько таблиц, а также о том, как просматривать результаты задач, см. loading overview.

Вы можете загружать данные в таблицы Selena только как пользователь, имеющий привилегию INSERT на эти таблицы Selena. Если у вас нет привилегии INSERT, следуйте инструкциям в разделе GRANT, чтобы предоставить привилегию INSERT пользователю, которого вы используете для подключения к вашему cluster Selena. Синтаксис: GRANT INSERT ON TABLE <table_name> IN DATABASE <database_name> TO { ROLE <role_name> | USER <user_identity>}.

Синтаксис

LOAD LABEL [<database_name>.]<label_name>
(
data_desc[, data_desc ...]
)
WITH BROKER
(
StorageCredentialParams
)
[PROPERTIES
(
opt_properties
)
]

Обратите внимание, что в Selena некоторые литералы используются в качестве зарезервированных ключевых слов SQL. Не используйте эти ключевые слова напрямую в SQL-выражениях. Если вы хотите использовать такое ключевое слово в SQL-выражении, заключите его в обратные кавычки (`). См. Keywords.

Параметры

database_name и label_name

label_name указывает метку задачи загрузки. Для соглашений об именовании см. System limits.

database_name опционально указывает имя базы данных, к которой принадлежит целевая таблица.

Каждая задача загрузки имеет метку, которая является уникальной в пределах всей базы данных. Вы можете использовать метку задачи загрузки для просмотра статуса выполнения задачи и предотвращения повторной загрузки тех же данных. Когда задача загрузки переходит в состояние FINISHED, её метка не может быть использована повторно. Только метка задачи загрузки, которая перешла в состояние CANCELLED, может быть использована повторно. В большинстве случаев метка задачи загрузки используется повторно для повтора этой задачи и загрузки тех же данных, тем самым реализуя семантику Exactly-Once.

Для соглашений об именовании меток см. System limits.

data_desc

Описание пакета данных для загрузки. Каждый дескриптор data_desc объявляет информацию, такую как источник данных, ETL-функции, целевая таблица Selena и целевые партиции.

Broker Load поддерживает загрузку нескольких файлов данных за один раз. В одной задаче загрузки вы можете использовать несколько дескрипторов data_desc для объявления нескольких файлов данных, которые вы хотите загрузить, или использовать один дескриптор data_desc для объявления одного пути к файлу, из которого вы хотите загрузить все файлы данных. Broker Load также может гарантировать транзакционную атомарность каждой задачи загрузки, которая выполняется для загрузки нескольких файлов данных. Атомарность означает, что загрузка нескольких файлов данных в одной задаче загрузки должна либо успешно завершиться, либо завершиться с ошибкой. Никогда не происходит так, что загрузка некоторых файлов данных успешна, в то время как загрузка других файлов завершается с ошибкой.

data_desc поддерживает следующий синтаксис:

DATA INFILE ("<file_path>"[, "<file_path>" ...])
[NEGATIVE]
INTO TABLE <table_name>
[PARTITION (<partition1_name>[, <partition2_name> ...])]
[TEMPORARY PARTITION (<temporary_partition1_name>[, <temporary_partition2_name> ...])]
[COLUMNS TERMINATED BY "<column_separator>"]
[ROWS TERMINATED BY "<row_separator>"]
[FORMAT AS "CSV | Parquet | ORC"]
[(format_type_options)]
[(column_list)]
[COLUMNS FROM PATH AS (<partition_field_name>[, <partition_field_name> ...])]
[SET <k1=f1(v1)>[, <k2=f2(v2)> ...]]
[WHERE predicate]

data_desc должен включать следующие параметры:

  • file_path

    Указывает путь сохранения одного или нескольких файлов данных, которые вы хотите загрузить.

    Вы можете указать этот параметр как путь сохранения одного файла данных. Например, вы можете указать этот параметр как "hdfs://<hdfs_host>:<hdfs_port>/user/data/tablename/20210411" для загрузки файла данных с именем 20210411 из пути /user/data/tablename на HDFS-сервере.

    Вы также можете указать этот параметр как путь сохранения нескольких файлов данных, используя подстановочные символы ?, *, [], {} или ^. См. Wildcard reference. Например, вы можете указать этот параметр как "hdfs://<hdfs_host>:<hdfs_port>/user/data/tablename/*/*" или "hdfs://<hdfs_host>:<hdfs_port>/user/data/tablename/dt=202104*/*" для загрузки файлов данных из всех партиций или только партиций 202104 в пути /user/data/tablename на HDFS-сервере.

    NOTE

    Подстановочные символы также могут использоваться для указания промежуточных путей.

    В приведенных выше примерах параметры hdfs_host и hdfs_port описаны следующим образом:

    • hdfs_host: IP-адрес хоста NameNode в HDFS-кластере.

    • hdfs_host: порт FS хоста NameNode в HDFS-кластере. По умолчанию номер порта - 9000.

    NOTICE

    • Broker Load поддерживает доступ к AWS S3 по протоколу S3 или S3A. Поэтому при загрузке данных из AWS S3 вы можете включить s3:// или s3a:// в качестве префикса в URI S3, который вы передаете в качестве пути к файлу.
    • Broker Load поддерживает доступ к Google GCS только по протоколу gs. Поэтому при загрузке данных из Google GCS вы должны включить gs:// в качестве префикса в URI GCS, который вы передаете в качестве пути к файлу.
    • При загрузке данных из Blob Storage вы должны использовать протокол wasb или wasbs для доступа к вашим данным:
      • Если ваша учетная запись хранилища разрешает доступ по HTTP, используйте протокол wasb и запишите путь к файлу как wasb://<container_name>@<storage_account_name>.blob.core.windows.net/<path>/<file_name>/*.
      • Если ваша учетная запись хранилища разрешает доступ по HTTPS, используйте протокол wasbs и запишите путь к файлу как wasbs://<container_name>@<storage_account_name>.blob.core.windows.net/<path>/<file_name>/*.
    • При загрузке данных из Data Lake Storage Gen2 вы должны использовать протокол abfs или abfss для доступа к вашим данным:
      • Если ваша учетная запись хранилища разрешает доступ по HTTP, используйте протокол abfs и запишите путь к файлу как abfs://<container_name>@<storage_account_name>.dfs.core.windows.net/<file_name>.
      • Если ваша учетная запись хранилища разрешает доступ по HTTPS, используйте протокол abfss и запишите путь к файлу как abfss://<container_name>@<storage_account_name>.dfs.core.windows.net/<file_name>.
    • При загрузке данных из Data Lake Storage Gen1 вы должны использовать протокол adl для доступа к вашим данным и записать путь к файлу как adl://<data_lake_storage_gen1_name>.azuredatalakestore.net/<path>/<file_name>.
  • INTO TABLE

    Указывает имя целевой таблицы Selena.

data_desc также может опционально включать следующие параметры:

  • NEGATIVE

    Отменяет загрузку определенного пакета данных. Для этого вам нужно загрузить тот же пакет данных с указанным ключевым словом NEGATIVE.

    NOTE

    Этот параметр действителен только когда таблица Selena является Aggregate-таблицей и все её столбцы значений вычисляются функцией sum.

  • PARTITION

    Указывает партиции, в которые вы хотите загрузить данные. По умолчанию, если вы не указываете этот параметр, исходные данные будут загружены во все партиции таблицы Selena.

  • TEMPORARY PARTITION

    Указывает имя временной партиции, в которую вы хотите загрузить данные. Вы можете указать несколько временных партиций, которые должны быть разделены запятыми (,).

  • COLUMNS TERMINATED BY

    Указывает разделитель столбцов, используемый в файле данных. По умолчанию, если вы не указываете этот параметр, он по умолчанию имеет значение \t, что означает табуляцию. Разделитель столбцов, который вы указываете с помощью этого параметра, должен быть таким же, как разделитель столбцов, который фактически используется в файле данных. В противном случае задача загрузки завершится неудачей из-за недостаточного качества данных, и её State будет CANCELLED.

    Задачи Broker Load отправляются по протоколу MySQL. Selena и MySQL оба экранируют символы в запросах на загрузку. Поэтому, если разделитель столбцов является невидимым символом, таким как табуляция, вы должны добавить обратную косую черту () перед разделителем столбцов. Например, вы должны ввести \\t, если разделитель столбцов - \t, и вы должны ввести \\n, если разделитель столбцов - \n. Файлы Apache Hive™ используют \x01 в качестве разделителя столбцов, поэтому вы должны ввести \\x01, если файл данных из Hive.

    NOTE

    • Для CSV-данных вы можете использовать строку UTF-8, такую как запятая (,), табуляция или вертикальная черта (|), длина которой не превышает 50 байт, в качестве текстового разделителя.
    • Null-значения обозначаются с помощью \N. Например, файл данных состоит из трех столбцов, и запись из этого файла данных содержит данные в первом и третьем столбцах, но не содержит данных во втором столбце. В этой ситуации вам нужно использовать \N во втором столбце для обозначения null-значения. Это означает, что запись должна быть составлена как a,\N,b вместо a,,b. a,,b обозначает, что второй столбец записи содержит пустую строку.
  • ROWS TERMINATED BY

    Указывает разделитель строк, используемый в файле данных. По умолчанию, если вы не указываете этот параметр, он по умолчанию имеет значение \n, что означает перевод строки. Разделитель строк, который вы указываете с помощью этого параметра, должен быть таким же, как разделитель строк, который фактически используется в файле данных. В противном случае задача загрузки завершится неудачей из-за недостаточного качества данных, и её State будет CANCELLED. Этот параметр поддерживается начиная с версии v1.5.2.

    Для заметок об использовании разделителя строк см. заметки об использовании для предыдущего параметра COLUMNS TERMINATED BY.

  • FORMAT AS

    Указывает формат файла данных. Допустимые значения: CSV, Parquet и ORC. По умолчанию, если вы не указываете этот параметр, Selena определяет формат файла данных на основе расширения имени файла .csv, .parquet или .orc, указанного в параметре file_path.

  • format_type_options

    Указывает параметры формата CSV, когда FORMAT AS установлен в CSV. Синтаксис:

    (
    key = value
    key = value
    ...
    )

    NOTE

    format_type_options поддерживается в версии v1.5.2 и выше.

    В следующей таблице описаны параметры.

    ПараметрОписание
    skip_headerУказывает, пропускать ли первые строки файла данных, когда файл данных в формате CSV. Тип: INTEGER. Значение по умолчанию: 0.
    В некоторых CSV-форматированных файлах данных первые строки в начале используются для определения метаданных, таких как имена столбцов и типы данных столбцов. Установив параметр skip_header, вы можете позволить Selena пропустить первые строки файла данных во время загрузки данных. Например, если вы установите этот параметр в 1, Selena пропустит первую строку файла данных во время загрузки данных.
    Первые строки в начале файла данных должны быть разделены с использованием разделителя строк, который вы указываете в выражении загрузки.
    trim_spaceУказывает, удалять ли пробелы перед и после разделителей столбцов из файла данных, когда файл данных в формате CSV. Тип: BOOLEAN. Значение по умолчанию: false.
    Для некоторых баз данных пробелы добавляются к разделителям столбцов при экспорте данных в виде CSV-форматированного файла данных. Такие пробелы называются ведущими пробелами или завершающими пробелами в зависимости от их расположения. Установив параметр trim_space, вы можете позволить Selena удалять такие ненужные пробелы во время загрузки данных.
    Обратите внимание, что Selena не удаляет пробелы (включая ведущие пробелы и завершающие пробелы) внутри поля, заключенного в пару символов, указанных в enclose. Например, следующие значения полей используют вертикальную черту (|) в качестве разделителя столбцов и двойные кавычки (") в качестве символа enclose:
    |"Love Selena"|
    |" Love Selena "|
    | "Love Selena" |
    Если вы установите trim_space в true, Selena обработает предыдущие значения полей следующим образом:
    |"Love Selena"|
    |" Love Selena "|
    |"Love Selena"|
    encloseУказывает символ, который используется для обертывания значений полей в файле данных в соответствии с RFC4180, когда файл данных в формате CSV. Тип: однобайтовый символ. Значение по умолчанию: NONE. Наиболее распространенные символы - одинарная кавычка (') и двойная кавычка (").
    Все специальные символы (включая разделители строк и разделители столбцов), заключенные с использованием символа, указанного в enclose, считаются обычными символами. Selena может делать больше, чем RFC4180, так как позволяет вам указать любой однобайтовый символ в качестве символа enclose.
    Если значение поля содержит символ, указанный в enclose, вы можете использовать тот же символ для экранирования этого символа enclose. Например, вы устанавливаете enclose в ", и значение поля - a "quoted" c. В этом случае вы можете ввести значение поля как "a ""quoted"" c" в файл данных.
    escapeУказывает символ, который используется для экранирования различных специальных символов, таких как разделители строк, разделители столбцов, символы экранирования и символы, указанные в enclose, которые затем рассматриваются Selena как обычные символы и анализируются как часть значений полей, в которых они находятся. Тип: однобайтовый символ. Значение по умолчанию: NONE. Наиболее распространенный символ - косая черта (\), которая должна быть записана как двойная косая черта (\\) в SQL-выражениях.
    NOTE
    Символ, указанный в escape, применяется как внутри, так и снаружи каждой пары символов, указанных в enclose.
    Два примера следующие:
    • Когда вы устанавливаете enclose в " и escape в \, Selena анализирует "say \"Hello world\"" в say "Hello world".
    • Предположим, что разделитель столбцов - запятая (,). Когда вы устанавливаете escape в \, Selena анализирует a, b\, c в два отдельных значения полей: a и b, c.
  • column_list

    Указывает сопоставление столбцов между файлом данных и таблицей Selena. Синтаксис: (<column_name>[, <column_name> ...]). Столбцы, объявленные в column_list, сопоставляются по имени со столбцами таблицы Selena.

    NOTE

    Если столбцы файла данных сопоставляются последовательно со столбцами таблицы Selena, вам не нужно указывать column_list.

    Если вы хотите пропустить определенный столбец файла данных, вам нужно только временно назвать этот столбец иначе, чем любой из столбцов таблицы Selena. Для получения дополнительной информации см. loading overview.

  • COLUMNS FROM PATH AS

    Извлекает информацию об одном или нескольких полях партиции из пути к файлу, который вы указываете. Этот параметр действителен только когда путь к файлу содержит поля партиции.

    Например, если файл данных хранится в пути /path/col_name=col_value/file1, где col_name - поле партиции и может быть сопоставлено со столбцом таблицы Selena, вы можете указать этот параметр как col_name. Таким образом, Selena извлекает значения col_value из пути и загружает их в столбец таблицы Selena, на который сопоставлен col_name.

    NOTE

    Этот параметр доступен только при загрузке данных из HDFS.

  • SET

    Указывает одну или несколько функций, которые вы хотите использовать для преобразования столбца файла данных. Примеры:

    • Таблица Selena состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно. Файл данных состоит из четырех столбцов, среди которых первые два столбца сопоставляются последовательно с col1 и col2 таблицы Selena, а сумма последних двух столбцов сопоставляется с col3 таблицы Selena. В этом случае вам нужно указать column_list как (col1,col2,tmp_col3,tmp_col4) и указать (col3=tmp_col3+tmp_col4) в предложении SET для реализации преобразования данных.
    • Таблица Selena состоит из трех столбцов, которые представляют собой year, month и day последовательно. Файл данных состоит только из одного столбца, который содержит значения даты и времени в формате yyyy-mm-dd hh:mm:ss. В этом случае вам нужно указать column_list как (tmp_time) и указать (year = year(tmp_time), month=month(tmp_time), day=day(tmp_time)) в предложении SET для реализации преобразования данных.
  • WHERE

    Указывает условия, на основе которых вы хотите фильтровать исходные данные. Selena загружает только исходные данные, которые соответствуют условиям фильтрации, указанным в предложении WHERE.

WITH BROKER

В версии v1.5.2 и более ранних введите WITH BROKER "<broker_name>", чтобы указать broker, который вы хотите использовать. Начиная с версии v1.5.2, вам больше не нужно указывать broker, но вам все равно нужно сохранить ключевое слово WITH BROKER.

StorageCredentialParams

Информация аутентификации, используемая Selena для доступа к вашей системе хранения.

HDFS

HDFS с открытым исходным кодом поддерживает два метода аутентификации: простая аутентификация и аутентификация Kerberos. Broker Load использует простую аутентификацию по умолчанию. HDFS с открытым исходным кодом также поддерживает настройку механизма HA для NameNode. Если вы выбираете HDFS с открытым исходным кодом в качестве вашей системы хранения, вы можете указать конфигурацию аутентификации и конфигурацию HA следующим образом:

  • Конфигурация аутентификации

    • Если вы используете простую аутентификацию, настройте StorageCredentialParams следующим образом:

      "hadoop.security.authentication" = "simple",
      "username" = "<hdfs_username>",
      "password" = "<hdfs_password>"

      В следующей таблице описаны параметры в StorageCredentialParams.

      ПараметрОписание
      hadoop.security.authenticationМетод аутентификации. Допустимые значения: simple и kerberos. Значение по умолчанию: simple. simple представляет простую аутентификацию, то есть без аутентификации, а kerberos представляет аутентификацию Kerberos.
      usernameИмя пользователя учетной записи, которую вы хотите использовать для доступа к NameNode HDFS-кластера.
      passwordПароль учетной записи, которую вы хотите использовать для доступа к NameNode HDFS-кластера.
    • Если вы используете аутентификацию Kerberos, настройте StorageCredentialParams следующим образом:

      "hadoop.security.authentication" = "kerberos",
      "kerberos_principal" = "nn/zelda1@ZELDA.COM",
      "kerberos_keytab" = "/keytab/hive.keytab",
      "kerberos_keytab_content" = "YWFhYWFh"

      В следующей таблице описаны параметры в StorageCredentialParams.

      ПараметрОписание
      hadoop.security.authenticationМетод аутентификации. Допустимые значения: simple и kerberos. Значение по умолчанию: simple. simple представляет простую аутентификацию, то есть без аутентификации, а kerberos представляет аутентификацию Kerberos.
      kerberos_principalПринципал Kerberos для аутентификации. Каждый принципал состоит из следующих трех частей, чтобы гарантировать, что он уникален в HDFS-кластере:
      • username или servicename: имя принципала.
      • instance: имя сервера, на котором размещен узел для аутентификации в HDFS-кластере. Имя сервера помогает гарантировать уникальность принципала, например, когда HDFS-кластер состоит из нескольких DataNode, которые каждый независимо аутентифицируются.
      • realm: имя области. Имя области должно быть в верхнем регистре.
      Пример: nn/zelda1@ZELDA.COM.
      kerberos_keytabПуть сохранения файла keytab Kerberos.
      kerberos_keytab_contentСодержимое файла keytab Kerberos в кодировке Base64. Вы можете выбрать указание либо kerberos_keytab, либо kerberos_keytab_content.
  • Конфигурация HA

    Вы можете настроить механизм HA для NameNode HDFS-кластера. Таким образом, если NameNode переключается на другой узел, Selena может автоматически идентифицировать новый узел, который служит NameNode. Это включает следующие сценарии:

    • Если вы загружаете данные из одного HDFS-кластера с одним настроенным пользователем Kerberos, поддерживается как загрузка на основе broker, так и загрузка без broker.

      • Для выполнения загрузки на основе broker убедитесь, что развернута хотя бы одна независимая группа broker, и поместите файл hdfs-site.xml в путь {deploy}/conf на узле broker, обслуживающем HDFS-кластер. Selena добавит путь {deploy}/conf в переменную окружения CLASSPATH при запуске broker, позволяя broker читать информацию об узлах HDFS-кластера.

      • Для выполнения загрузки без broker вам нужно только установить hadoop.security.authentication = kerberos в conf/core-site.xml в каталогах развертывания всех узлов FE, BE и CN в вашем кластере и использовать команду kinit для настройки учетной записи Kerberos.

    • Если вы загружаете данные из одного HDFS-кластера с несколькими настроенными пользователями Kerberos, поддерживается только загрузка на основе broker. Убедитесь, что развернута хотя бы одна независимая группа broker, и поместите файл hdfs-site.xml в путь {deploy}/conf на узле broker, обслуживающем HDFS-кластер. Selena добавит путь {deploy}/conf в переменную окружения CLASSPATH при запуске broker, позволяя broker читать информацию об узлах HDFS-кластера.

    • Если вы загружаете данные из нескольких HDFS-кластеров (независимо от того, настроен один или несколько пользователей Kerberos), поддерживается только загрузка на основе broker. Убедитесь, что развернута хотя бы одна независимая группа broker для каждого из этих HDFS-кластеров, и выполните одно из следующих действий, чтобы позволить broker читать информацию об узлах HDFS-кластера:

      • Поместите файл hdfs-site.xml в путь {deploy}/conf на узле broker, обслуживающем каждый HDFS-кластер. Selena добавит путь {deploy}/conf в переменную окружения CLASSPATH при запуске broker, позволяя broker читать информацию об узлах этого HDFS-кластера.

      • Добавьте следующую конфигурацию HA при создании задачи:

        "dfs.nameservices" = "ha_cluster",
        "dfs.ha.namenodes.ha_cluster" = "ha_n1,ha_n2",
        "dfs.namenode.rpc-address.ha_cluster.ha_n1" = "<hdfs_host>:<hdfs_port>",
        "dfs.namenode.rpc-address.ha_cluster.ha_n2" = "<hdfs_host>:<hdfs_port>",
        "dfs.client.failover.proxy.provider" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"

        В следующей таблице описаны параметры в конфигурации HA.

        ПараметрОписание
        dfs.nameservicesИмя HDFS-кластера.
        dfs.ha.namenodes.XXXИмя NameNode в HDFS-кластере. Если вы указываете несколько имен NameNode, разделите их запятыми (,). xxx - это имя HDFS-кластера, которое вы указали в dfs.nameservices.
        dfs.namenode.rpc-address.XXX.NNRPC-адрес NameNode в HDFS-кластере. NN - это имя NameNode, которое вы указали в dfs.ha.namenodes.XXX.
        dfs.client.failover.proxy.providerПровайдер NameNode, к которому будет подключаться клиент. Значение по умолчанию: org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider.

    NOTE

    Вы можете использовать выражение SHOW BROKER для проверки broker, развернутых в вашем кластере Selena.

AWS S3

Если вы выбираете AWS S3 в качестве вашей системы хранения, выполните одно из следующих действий:

  • Чтобы выбрать метод аутентификации на основе instance profile, настройте StorageCredentialParams следующим образом:

    "aws.s3.use_instance_profile" = "true",
    "aws.s3.region" = "<aws_s3_region>"
  • Чтобы выбрать метод аутентификации на основе assumed role, настройте StorageCredentialParams следующим образом:

    "aws.s3.use_instance_profile" = "true",
    "aws.s3.iam_role_arn" = "<iam_role_arn>",
    "aws.s3.region" = "<aws_s3_region>"
  • Чтобы выбрать метод аутентификации на основе IAM user, настройте StorageCredentialParams следующим образом:

    "aws.s3.use_instance_profile" = "false",
    "aws.s3.access_key" = "<iam_user_access_key>",
    "aws.s3.secret_key" = "<iam_user_secret_key>",
    "aws.s3.region" = "<aws_s3_region>"

В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

ПараметрОбязательноОписание
aws.s3.use_instance_profileДаУказывает, включать ли методы учетных данных instance profile и assumed role. Допустимые значения: true и false. Значение по умолчанию: false.
aws.s3.iam_role_arnНетARN IAM-роли, которая имеет привилегии на вашем AWS S3 bucket. Если вы выбираете assumed role в качестве метода учетных данных для доступа к AWS S3, вы должны указать этот параметр.
aws.s3.regionДаРегион, в котором находится ваш AWS S3 bucket. Пример: us-west-1.
aws.s3.access_keyНетAccess key вашего IAM-пользователя. Если вы выбираете IAM user в качестве метода учетных данных для доступа к AWS S3, вы должны указать этот параметр.
aws.s3.secret_keyНетSecret key вашего IAM-пользователя. Если вы выбираете IAM user в качестве метода учетных данных для доступа к AWS S3, вы должны указать этот параметр.

Для получения информации о том, как выбрать метод аутентификации для доступа к AWS S3 и как настроить политику управления доступом в AWS IAM Console, см. Authentication parameters for accessing AWS S3.

Google GCS

Если вы выбираете Google GCS в качестве вашей системы хранения, выполните одно из следующих действий:

  • Чтобы выбрать метод аутентификации на основе VM, настройте StorageCredentialParams следующим образом:

    "gcp.gcs.use_compute_engine_service_account" = "true"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрЗначение по умолчаниюПример значенияОписание
    gcp.gcs.use_compute_engine_service_accountfalsetrueУказывает, использовать ли непосредственно служебную учетную запись, привязанную к вашему Compute Engine.
  • Чтобы выбрать метод аутентификации на основе service account, настройте StorageCredentialParams следующим образом:

    "gcp.gcs.service_account_email" = "<google_service_account_email>",
    "gcp.gcs.service_account_private_key_id" = "<google_service_private_key_id>",
    "gcp.gcs.service_account_private_key" = "<google_service_private_key>"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрЗначение по умолчаниюПример значенияОписание
    gcp.gcs.service_account_email"""user@hello.iam.gserviceaccount.com"Адрес электронной почты в JSON-файле, созданном при создании служебной учетной записи.
    gcp.gcs.service_account_private_key_id"""61d257bd8479547cb3e04f0b9b6b9ca07af3b7ea"ID приватного ключа в JSON-файле, созданном при создании служебной учетной записи.
    gcp.gcs.service_account_private_key"""-----BEGIN PRIVATE KEY----xxxx-----END PRIVATE KEY-----\n"Приватный ключ в JSON-файле, созданном при создании служебной учетной записи.
  • Чтобы выбрать метод аутентификации на основе impersonation, настройте StorageCredentialParams следующим образом:

    • Заставить VM instance имитировать служебную учетную запись:

      "gcp.gcs.use_compute_engine_service_account" = "true",
      "gcp.gcs.impersonation_service_account" = "<assumed_google_service_account_email>"

      В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

      ПараметрЗначение по умолчаниюПример значенияОписание
      gcp.gcs.use_compute_engine_service_accountfalsetrueУказывает, использовать ли непосредственно служебную учетную запись, привязанную к вашему Compute Engine.
      gcp.gcs.impersonation_service_account"""hello"Служебная учетная запись, которую вы хотите имитировать.
    • Заставить служебную учетную запись (названную мета-служебной учетной записью) имитировать другую служебную учетную запись (названную данными служебной учетной записью):

      "gcp.gcs.service_account_email" = "<google_service_account_email>",
      "gcp.gcs.service_account_private_key_id" = "<meta_google_service_account_email>",
      "gcp.gcs.service_account_private_key" = "<meta_google_service_account_email>",
      "gcp.gcs.impersonation_service_account" = "<data_google_service_account_email>"

      В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

      ПараметрЗначение по умолчаниюПример значенияОписание
      gcp.gcs.service_account_email"""user@hello.iam.gserviceaccount.com"Адрес электронной почты в JSON-файле, созданном при создании мета-служебной учетной записи.
      gcp.gcs.service_account_private_key_id"""61d257bd8479547cb3e04f0b9b6b9ca07af3b7ea"ID приватного ключа в JSON-файле, созданном при создании мета-служебной учетной записи.
      gcp.gcs.service_account_private_key"""-----BEGIN PRIVATE KEY----xxxx-----END PRIVATE KEY-----\n"Приватный ключ в JSON-файле, созданном при создании мета-служебной учетной записи.
      gcp.gcs.impersonation_service_account"""hello"Данные служебной учетной записи, которую вы хотите имитировать.

Другая S3-совместимая система хранения

Если вы выбираете другую S3-совместимую систему хранения, такую как MinIO, настройте StorageCredentialParams следующим образом:

"aws.s3.enable_ssl" = "false",
"aws.s3.enable_path_style_access" = "true",
"aws.s3.endpoint" = "<s3_endpoint>",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>"

В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

ПараметрОбязательноОписание
aws.s3.enable_sslДаУказывает, включать ли SSL-соединение. Допустимые значения: true и false. Значение по умолчанию: true.
aws.s3.enable_path_style_accessДаУказывает, включать ли доступ к URL в стиле пути. Допустимые значения: true и false. Значение по умолчанию: false. Для MinIO вы должны установить значение true.
aws.s3.endpointДаКонечная точка, которая используется для подключения к вашей S3-совместимой системе хранения вместо AWS S3.
aws.s3.access_keyДаAccess key вашего IAM-пользователя.
aws.s3.secret_keyДаSecret key вашего IAM-пользователя.

Microsoft Azure Storage

Azure Blob Storage

Если вы выбираете Blob Storage в качестве вашей системы хранения, выполните одно из следующих действий:

  • Чтобы выбрать метод аутентификации Shared Key, настройте StorageCredentialParams следующим образом:

    "azure.blob.storage_account" = "<storage_account_name>",
    "azure.blob.shared_key" = "<storage_account_shared_key>"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрОбязательноОписание
    azure.blob.storage_accountДаИмя пользователя вашей учетной записи Blob Storage.
    azure.blob.shared_keyДаShared key вашей учетной записи Blob Storage.
  • Чтобы выбрать метод аутентификации SAS Token, настройте StorageCredentialParams следующим образом:

    "azure.blob.storage_account" = "<storage_account_name>",
    "azure.blob.container" = "<container_name>",
    "azure.blob.sas_token" = "<storage_account_SAS_token>"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрОбязательноОписание
    azure.blob.storage_accountДаИмя пользователя вашей учетной записи Blob Storage.
    azure.blob.containerДаИмя blob container, который хранит ваши данные.
    azure.blob.sas_tokenДаSAS-токен, который используется для доступа к вашей учетной записи Blob Storage.
Azure Data Lake Storage Gen2

Если вы выбираете Data Lake Storage Gen2 в качестве вашей системы хранения, выполните одно из следующих действий:

  • Чтобы выбрать метод аутентификации Managed Identity, настройте StorageCredentialParams следующим образом:

    "azure.adls2.oauth2_use_managed_identity" = "true",
    "azure.adls2.oauth2_tenant_id" = "<service_principal_tenant_id>",
    "azure.adls2.oauth2_client_id" = "<service_client_id>"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрОбязательноОписание
    azure.adls2.oauth2_use_managed_identityДаУказывает, включать ли метод аутентификации Managed Identity. Установите значение true.
    azure.adls2.oauth2_tenant_idДаID tenant, данные которого вы хотите получить.
    azure.adls2.oauth2_client_idДаClient (application) ID управляемой идентичности.
  • Чтобы выбрать метод аутентификации Shared Key, настройте StorageCredentialParams следующим образом:

    "azure.adls2.storage_account" = "<storage_account_name>",
    "azure.adls2.shared_key" = "<storage_account_shared_key>"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрОбязательноОписание
    azure.adls2.storage_accountДаИмя пользователя вашей учетной записи хранения Data Lake Storage Gen2.
    azure.adls2.shared_keyДаShared key вашей учетной записи хранения Data Lake Storage Gen2.
  • Чтобы выбрать метод аутентификации Service Principal, настройте StorageCredentialParams следующим образом:

    "azure.adls2.oauth2_client_id" = "<service_client_id>",
    "azure.adls2.oauth2_client_secret" = "<service_principal_client_secret>",
    "azure.adls2.oauth2_client_endpoint" = "<service_principal_client_endpoint>"

    В следующей таблице описаны параметры, которые вам нужно настроить in StorageCredentialParams.

    ПараметрОбязательноОписание
    azure.adls2.oauth2_client_idДаClient (application) ID service principal.
    azure.adls2.oauth2_client_secretДаЗначение нового client (application) secret, созданного.
    azure.adls2.oauth2_client_endpointДаКонечная точка токена OAuth 2.0 (v1) service principal или application.
Azure Data Lake Storage Gen1

Если вы выбираете Data Lake Storage Gen1 в качестве вашей системы хранения, выполните одно из следующих действий:

  • Чтобы выбрать метод аутентификации Managed Service Identity, настройте StorageCredentialParams следующим образом:

    "azure.adls1.use_managed_service_identity" = "true"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрОбязательноОписание
    azure.adls1.use_managed_service_identityДаУказывает, включать ли метод аутентификации Managed Service Identity. Установите значение true.
  • Чтобы выбрать метод аутентификации Service Principal, настройте StorageCredentialParams следующим образом:

    "azure.adls1.oauth2_client_id" = "<application_client_id>",
    "azure.adls1.oauth2_credential" = "<application_client_credential>",
    "azure.adls1.oauth2_endpoint" = "<OAuth_2.0_authorization_endpoint_v2>"

    В следующей таблице описаны параметры, которые вам нужно настроить в StorageCredentialParams.

    ПараметрОбязательноОписание
    azure.adls1.oauth2_client_idДаClient (application) ID .
    azure.adls1.oauth2_credentialДаЗначение нового client (application) secret, созданного.
    azure.adls1.oauth2_endpointДаКонечная точка токена OAuth 2.0 (v1) service principal или application.

opt_properties

Указывает некоторые дополнительные параметры, настройки которых применяются ко всей задаче загрузки. Синтаксис:

PROPERTIES ("<key1>" = "<value1>"[, "<key2>" = "<value2>" ...])

Поддерживаются следующие параметры:

  • timeout

    Указывает период тайм-аута задачи загрузки. Единица измерения: секунда. Период тайм-аута по умолчанию составляет 4 часа. Мы рекомендуем указывать период тайм-аута короче 6 часов. Если задача загрузки не завершается в течение периода тайм-аута, Selena отменяет задачу загрузки, и статус задачи загрузки становится CANCELLED.

    NOTE

    В большинстве случаев вам не нужно устанавливать период тайм-аута. Мы рекомендуем устанавливать период тайм-аута только когда задача загрузки не может завершиться в течение периода тайм-аута по умолчанию.

    Используйте следующую формулу для определения периода тайм-аута:

    Период тайм-аута > (Общий размер файлов данных для загрузки x Общее количество файлов данных для загрузки и материализованных представлений, созданных на файлах данных)/Средняя скорость загрузки

    NOTE

    "Средняя скорость загрузки" - это средняя скорость загрузки для всего вашего кластера Selena. Средняя скорость загрузки варьируется для каждого кластера в зависимости от конфигурации сервера и максимального количества разрешенных параллельных задач запроса для кластера. Вы можете определить среднюю скорость загрузки на основе скоростей загрузки исторических задач загрузки.

    Предположим, что вы хотите загрузить файл данных размером 1 ГБ, на котором созданы два материализованных представления, в кластер Selena, средняя скорость загрузки которого составляет 10 МБ/с. Время, необходимое для загрузки данных, составляет примерно 102 секунды.

    (1 x 1024 x 3)/10 = 307.2 (секунда)

    Для этого примера мы рекомендуем установить период тайм-аута в значение больше 308 секунд.

  • max_filter_ratio

    Указывает максимальную допустимую ошибку задачи загрузки. Максимальная допустимая ошибка - это максимальный процент строк, которые могут быть отфильтрованы в результате недостаточного качества данных. Допустимые значения: 0~1. Значение по умолчанию: 0.

    • Если вы установите этот параметр в 0, Selena не игнорирует неквалифицированные строки во время загрузки. Таким образом, если исходные данные содержат неквалифицированные строки, задача загрузки завершается с ошибкой. Это помогает гарантировать правильность данных, загруженных в Selena.

    • Если вы установите этот параметр в значение больше 0, Selena может игнорировать неквалифицированные строки во время загрузки. Таким образом, задача загрузки может завершиться успешно, даже если исходные данные содержат неквалифицированные строки.

      NOTE

      Строки, которые отфильтровываются из-за недостаточного качества данных, не включают строки, которые отфильтровываются предложением WHERE.

    Если задача загрузки завершается с ошибкой, потому что максимальная допустимая ошибка установлена в 0, вы можете использовать SHOW LOAD для просмотра результата задачи. Затем определите, могут ли неквалифицированные строки быть отфильтрованы. Если неквалифицированные строки могут быть отфильтрованы, вычислите максимальную допустимую ошибку на основе значений, возвращенных для dpp.abnorm.ALL и dpp.norm.ALL в результате задачи, настройте максимальную допустимую ошибку и снова отправьте задачу загрузки. Формула для вычисления максимальной допустимой ошибки следующая:

    max_filter_ratio = [dpp.abnorm.ALL/(dpp.abnorm.ALL + dpp.norm.ALL)]

    Сумма значений, возвращенных для dpp.abnorm.ALL и dpp.norm.ALL, - это общее количество строк для загрузки.

  • log_rejected_record_num

    Указывает максимальное количество неквалифицированных строк данных, которые могут быть зарегистрированы. Этот параметр поддерживается начиная с версии v1.5.2. Допустимые значения: 0, -1 и любое ненулевое положительное целое число. Значение по умолчанию: 0.

    • Значение 0 указывает, что строки данных, которые отфильтровываются, не будут зарегистрированы.
    • Значение -1 указывает, что все строки данных, которые отфильтровываются, будут зарегистрированы.
    • Ненулевое положительное целое число, такое как n, указывает, что до n строк данных, которые отфильтровываются, могут быть зарегистрированы на каждом BE.
  • load_mem_limit

    Указывает максимальный объем памяти, который может быть предоставлен задаче загрузки. Значение этого параметра не может превышать верхний предел памяти, поддерживаемый каждым узлом BE или CN. Единица измерения: байты: лимит памяти по умолчанию составляет 2 ГБ.

  • strict_mode

    Указывает, включать ли строгий режим. Допустимые значения: true и false. Значение по умолчанию: false. true указывает включить строгий режим, а false указывает отключить строгий режим.

  • timezone

    Указывает часовой пояс задачи загрузки. Значение по умолчанию: Asia/Shanghai. Настройка часового пояса влияет на результаты, возвращаемые такими функциями, как strftime, alignment_timestamp и from_unixtime. Для получения дополнительной информации см. Configure a time zone. Часовой пояс, указанный в параметре timezone, является часовым поясом на уровне сессии.

  • priority

    Указывает приоритет задачи загрузки. Допустимые значения: LOWEST, LOW, NORMAL, HIGH и HIGHEST. Значение по умолчанию: NORMAL. Broker Load предоставляет параметр FE max_broker_load_job_concurrency, который определяет максимальное количество задач Broker Load, которые могут выполняться одновременно в вашем кластере Selena. Если количество задач Broker Load, которые отправляются в указанный период времени, превышает максимальное количество, избыточные задачи будут ожидать планирования на основе их приоритетов.

    Вы можете использовать выражение ALTER LOAD для изменения приоритета существующей задачи загрузки, которая находится в состоянии QUEUEING или LOADING.

    Selena позволяет устанавливать параметр priority для задачи Broker Load начиная с версии v1.5.2.

  • partial_update

    Использовать ли частичные обновления. Допустимые значения: TRUE и FALSE. Значение по умолчанию: FALSE, что указывает на отключение этой функции.

  • partial_update_mode

    Указывает режим для частичных обновлений. Допустимые значения: row и column.

    • Значение row (по умолчанию) означает частичные обновления в режиме строк, который более подходит для обновлений в реальном времени с большим количеством столбцов и небольшими пакетами.
    • Значение column означает частичные обновления в режиме столбцов, который более подходит для пакетных обновлений с небольшим количеством столбцов и большим количеством строк. В таких сценариях включение режима столбцов обеспечивает более высокую скорость обновления. Например, в таблице со 100 столбцами, если обновляются только 10 столбцов (10% от общего количества) для всех строк, скорость обновления в режиме столбцов в 10 раз быстрее.

  • merge_condition

    Указывает имя столбца, который вы хотите использовать в качестве условия для определения того, могут ли обновления вступить в силу. Обновление из исходной записи в целевую запись вступает в силу только когда исходная запись данных имеет большее или равное значение, чем целевая запись данных в указанном столбце.

    NOTE

    Столбец, который вы указываете, не может быть столбцом первичного ключа. Кроме того, только таблицы, использующие Primary Key table, поддерживают условные обновления.

Selena поддерживает загрузку JSON-данных начиная с версии v1.5.2. Параметры следующие:

  • jsonpaths

    Имена ключей, которые вы хотите загрузить из JSON-файла данных. Вам нужно указать этот параметр только когда вы загружаете JSON-данные, используя режим соответствия. Значение этого параметра в формате JSON. См. Configure column mapping for JSON data loading.

  • strip_outer_array

    Указывает, удалять ли самую внешнюю структуру массива. Допустимые значения: true и false. Значение по умолчанию: false.

    В реальных бизнес-сценариях JSON-данные могут иметь самую внешнюю структуру массива, обозначенную парой квадратных скобок []. В этой ситуации мы рекомендуем установить этот параметр в true, чтобы Selena удалила самые внешние квадратные скобки [] и загрузила каждый внутренний массив как отдельную запись данных. Если вы установите этот параметр в false, Selena анализирует весь JSON-файл данных в один массив и загружает массив как одну запись данных. Например, JSON-данные - [ {"category" : 1, "author" : 2}, {"category" : 3, "author" : 4} ]. Если вы установите этот параметр в true, {"category" : 1, "author" : 2} и {"category" : 3, "author" : 4} анализируются в отдельные записи данных, которые загружаются в отдельные строки таблицы Selena.

  • json_root

    Корневой элемент JSON-данных, которые вы хотите загрузить из JSON-файла данных. Вам нужно указать этот параметр только когда вы загружаете JSON-данные, используя режим соответствия. Значение этого параметра - допустимая строка JsonPath. По умолчанию значение этого параметра пустое, что указывает, что все данные JSON-файла данных будут загружены. Для получения дополнительной информации см. раздел "Load JSON data using matched mode with root element specified" этой темы.

При загрузке JSON-данных также обратите внимание, что размер каждого JSON-объекта не может превышать 4 ГБ. Если отдельный JSON-объект в JSON-файле данных превышает 4 ГБ, выдается ошибка "This parser can't support a document that big.".

Сопоставление столбцов

Настройка сопоставления столбцов для загрузки CSV-данных

Если столбцы файла данных могут быть сопоставлены один к одному последовательно со столбцами таблицы Selena, вам не нужно настраивать сопоставление столбцов между файлом данных и таблицей Selena.

Если столбцы файла данных не могут быть сопоставлены один к одному последовательно со столбцами таблицы Selena, вам нужно использовать параметр columns для настройки сопоставления столбцов между файлом данных и таблицей Selena. Это включает следующие два случая использования:

  • Одинаковое количество столбцов, но разная последовательность столбцов. Кроме того, данные из файла данных не нужно вычислять функциями перед загрузкой в соответствующие столбцы таблицы Selena.

    В параметре columns вам нужно указать имена столбцов таблицы Selena в той же последовательности, в которой расположены столбцы файла данных.

    Например, таблица Selena состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно, а файл данных также состоит из трех столбцов, которые могут быть сопоставлены со столбцами таблицы Selena col3, col2 и col1 последовательно. В этом случае вам нужно указать "columns: col3, col2, col1".

  • Разное количество столбцов и разная последовательность столбцов. Кроме того, данные из файла данных нужно вычислить функциями перед загрузкой в соответствующие столбцы таблицы Selena.

    В параметре columns вам нужно указать имена столбцов таблицы Selena в той же последовательности, в которой расположены столбцы файла данных, и указать функции, которые вы хотите использовать для вычисления данных. Два примера следующие:

    • Таблица Selena состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно. Файл данных состоит из четырех столбцов, среди которых первые три столбца могут быть сопоставлены последовательно со столбцами таблицы Selena col1, col2 и col3, а четвертый столбец не может быть сопоставлен ни с одним из столбцов таблицы Selena. В этом случае вам нужно временно указать имя для четвертого столбца файла данных, и временное имя должно отличаться от любого из имен столбцов таблицы Selena. Например, вы можете указать "columns: col1, col2, col3, temp", где четвертый столбец файла данных временно назван temp.
    • Таблица Selena состоит из трех столбцов, которые представляют собой year, month и day последовательно. Файл данных состоит только из одного столбца, который содержит значения даты и времени в формате yyyy-mm-dd hh:mm:ss. В этом случае вы можете указать "columns: col, year = year(col), month=month(col), day=day(col)", где col - временное имя столбца файла данных, а функции year = year(col), month=month(col) и day=day(col) используются для извлечения данных из столбца файла данных col и загрузки данных в соответствующие столбцы таблицы Selena. Например, year = year(col) используется для извлечения данных yyyy из столбца файла данных col и загрузки данных в столбец таблицы Selena year.

Для подробных примеров см. Configure column mapping.

Настройка сопоставления столбцов для загрузки JSON-данных

Если ключи JSON-документа имеют те же имена, что и столбцы таблицы Selena, вы можете загрузить JSON-форматированные данные, используя простой режим. В простом режиме вам не нужно указывать параметр jsonpaths. Этот режим требует, чтобы JSON-форматированные данные были объектом, обозначенным фигурными скобками {}, например {"category": 1, "author": 2, "price": "3"}. В этом примере category, author и price - имена ключей, и эти ключи могут быть сопоставлены один к одному по имени со столбцами category, author и price таблицы Selena.

Если ключи JSON-документа имеют разные имена, чем столбцы таблицы Selena, вы можете загрузить JSON-форматированные данные, используя режим соответствия. В режиме соответствия вам нужно использовать параметры jsonpaths и COLUMNS для указания сопоставления столбцов между JSON-документом и таблицей Selena:

  • В параметре jsonpaths укажите ключи JSON в последовательности, в которой они расположены в JSON-документе.
  • В параметре COLUMNS укажите сопоставление между ключами JSON и столбцами таблицы Selena:
    • Имена столбцов, указанные в параметре COLUMNS, сопоставляются один к одному последовательно с ключами JSON.
    • Имена столбцов, указанные в параметре COLUMNS, сопоставляются один к одному по имени со столбцами таблицы Selena.

Для примеров загрузки JSON-форматированных данных с использованием режима соответствия см. Load JSON data using matched mode.

Связанные параметры конфигурации

Параметр конфигурации FE max_broker_load_job_concurrency указывает максимальное количество задач Broker Load, которые могут выполняться одновременно в вашем кластере Selena.

В Selena v1.5.2 и более ранних, если общее количество задач Broker Load, которые отправляются в течение определенного периода времени, превышает максимальное количество, избыточные задачи будут поставлены в очередь и запланированы на основе времени их отправки.

Начиная с Selena v1.5.2, если общее количество задач Broker Load, которые отправляются в течение определенного периода времени, превышает максимальное количество, избыточные задачи ставятся в очередь и планируются на основе их приоритетов. Вы можете указать приоритет для задачи, используя параметр priority, описанный выше. Вы можете использовать ALTER LOAD для изменения приоритета существующей задачи, которая находится в состоянии QUEUEING или LOADING.

Разделение и параллельное выполнение задач

Задача Broker Load может быть разделена на одну или несколько подзадач, которые выполняются параллельно. Подзадачи в рамках задачи загрузки выполняются в рамках одной транзакции. Они все должны либо успешно завершиться, либо завершиться с ошибкой. Selena разделяет каждую задачу загрузки на основе того, как вы объявляете data_desc в выражении LOAD:

  • Если вы объявляете несколько параметров data_desc, каждый из которых указывает отдельную таблицу, создается подзадача для загрузки данных каждой таблицы.

  • Если вы объявляете несколько параметров data_desc, каждый из которых указывает отдельную партицию для одной и той же таблицы, создается подзадача для загрузки данных каждой партиции.

Кроме того, каждая подзадача может быть дополнительно разделена на один или несколько экземпляров, которые равномерно распределяются и параллельно выполняются на узлах BE или CN вашего кластера Selena. Selena разделяет каждую подзадачу на основе параметра FE min_bytes_per_broker_scanner и количества узлов BE или CN. Вы можете использовать следующую формулу для расчета количества экземпляров в отдельной подзадаче:

Количество экземпляров в отдельной подзадаче = min(Объем данных для загрузки отдельной подзадачей/min_bytes_per_broker_scanner, Количество узлов BE/CN)

В большинстве случаев для каждой задачи загрузки объявляется только один data_desc, каждая задача загрузки разделяется только на одну подзадачу, а подзадача разделяется на такое же количество экземпляров, как количество узлов BE или CN.

Примеры

Этот раздел использует HDFS в качестве примера для описания различных конфигураций загрузки.

Загрузка CSV-данных

Этот раздел использует CSV в качестве примера для объяснения различных конфигураций параметров, которые вы можете использовать для удовлетворения ваших разнообразных требований к загрузке.

Установка периода тайм-аута

Ваша база данных Selena test_db содержит таблицу с именем table1. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example1.csv также состоит из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table1.

Если вы хотите загрузить все данные из example1.csv в table1 в течение до 3600 секунд, выполните следующую команду:

LOAD LABEL test_db.label1
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example1.csv")
INTO TABLE table1
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
)
PROPERTIES
(
"timeout" = "3600"
);

Установка максимальной допустимой ошибки

Ваша база данных Selena test_db содержит таблицу с именем table2. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example2.csv также состоит из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table2.

Если вы хотите загрузить все данные из example2.csv в table2 с максимальной допустимой ошибкой 0.1, выполните следующую команду:

LOAD LABEL test_db.label2
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example2.csv")
INTO TABLE table2

)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
)
PROPERTIES
(
"max_filter_ratio" = "0.1"
);

Загрузка всех файлов данных из пути к файлу

Ваша база данных Selena test_db содержит таблицу с именем table3. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Все файлы данных, хранящиеся в пути /user/selena/data/input/ вашего HDFS-кластера, также каждый состоят из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table3. Разделитель столбцов, используемый в этих файлах данных, - \x01.

Если вы хотите загрузить данные из всех этих файлов данных, хранящихся в пути hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/, в table3, выполните следующую команду:

LOAD LABEL test_db.label3
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/*")
INTO TABLE table3
COLUMNS TERMINATED BY "\\x01"
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

Установка механизма HA для NameNode

Ваша база данных Selena test_db содержит таблицу с именем table4. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example4.csv также состоит из трех столбцов, которые сопоставляются с col1, col2 и col3 таблицы table4.

Если вы хотите загрузить все данные из example4.csv в table4 с настроенным механизмом HA для NameNode, выполните следующую команду:

LOAD LABEL test_db.label4
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example4.csv")
INTO TABLE table4
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>",
"dfs.nameservices" = "my_ha",
"dfs.ha.namenodes.my_ha" = "my_namenode1, my_namenode2","dfs.namenode.rpc-address.my_ha.my_namenode1" = "nn1_host:rpc_port",
"dfs.namenode.rpc-address.my_ha.my_namenode2" = "nn2_host:rpc_port",
"dfs.client.failover.proxy.provider" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
);

Установка аутентификации Kerberos

Ваша база данных Selena test_db содержит таблицу с именем table5. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example5.csv также состоит из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table5.

Если вы хотите загрузить все данные из example5.csv в table5 с настроенной аутентификацией Kerberos и указанным путем к файлу keytab, выполните следующую команду:

LOAD LABEL test_db.label5
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example5.csv")
INTO TABLE table5
COLUMNS TERMINATED BY "\t"
)
WITH BROKER
(
"hadoop.security.authentication" = "kerberos",
"kerberos_principal" = "selena@YOUR.COM",
"kerberos_keytab" = "/home/selena/selena.keytab"
);

Отмена загрузки данных

Ваша база данных Selena test_db содержит таблицу с именем table6. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example6.csv также состоит из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table6.

Вы загрузили все данные из example6.csv в table6, запустив задачу Broker Load.

Если вы хотите отменить загруженные данные, выполните следующую команду:

LOAD LABEL test_db.label6
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example6.csv")
NEGATIVE
INTO TABLE table6
COLUMNS TERMINATED BY "\t"
)
WITH BROKER
(
"hadoop.security.authentication" = "kerberos",
"kerberos_principal" = "selena@YOUR.COM",
"kerberos_keytab" = "/home/selena/selena.keytab"
);

Указание целевых партиций

Ваша база данных Selena test_db содержит таблицу с именем table7. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example7.csv также состоит из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table7.

Если вы хотите загрузить все данные из example7.csv в две партиции, p1 и p2, таблицы table7, выполните следующую команду:

LOAD LABEL test_db.label7
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example7.csv")
INTO TABLE table7
PARTITION (p1, p2)
COLUMNS TERMINATED BY ","
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

Настройка сопоставления столбцов

Ваша база данных Selena test_db содержит таблицу с именем table8. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example8.csv также состоит из трех столбцов, которые сопоставляются последовательно с col2, col1 и col3 таблицы table8.

Если вы хотите загрузить все данные из example8.csv в table8, выполните следующую команду:

LOAD LABEL test_db.label8
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example8.csv")
INTO TABLE table8
COLUMNS TERMINATED BY ","
(col2, col1, col3)
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

NOTE

В приведенном выше примере столбцы example8.csv не могут быть сопоставлены со столбцами table8 в той же последовательности, в которой эти столбцы расположены в table8. Поэтому вам нужно использовать column_list для настройки сопоставления столбцов между example8.csv и table8.

Установка условий фильтрации

Ваша база данных Selena test_db содержит таблицу с именем table9. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example9.csv также состоит из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table9.

Если вы хотите загрузить только записи данных, значения которых в первом столбце больше 20180601, из example9.csv в table9, выполните следующую команду:

LOAD LABEL test_db.label9
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example9.csv")
INTO TABLE table9
(col1, col2, col3)
where col1 > 20180601
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

NOTE

В приведенном выше примере столбцы example9.csv могут быть сопоставлены со столбцами table9 в той же последовательности, в которой эти столбцы расположены в table9, но вам нужно использовать предложение WHERE для указания условий фильтрации на основе столбцов. Поэтому вам нужно использовать column_list для настройки сопоставления столбцов между example9.csv и table9.

Загрузка данных в таблицы, содержащие столбцы типа HLL

Ваша база данных Selena test_db содержит таблицу с именем table10. Таблица состоит из четырех столбцов, которые представляют собой id, col1, col2 и col3 последовательно. col1 и col2 определены как столбцы типа HLL.

Ваш файл данных example10.csv состоит из трех столбцов, среди которых первый столбец сопоставляется с id таблицы table10, а второй и третий столбцы сопоставляются последовательно с col1 и col2 таблицы table10. Значения во втором и третьем столбцах example10.csv могут быть преобразованы в данные типа HLL с помощью функций перед загрузкой в col1 и col2 таблицы table10.

Если вы хотите загрузить все данные из example10.csv в table10, выполните следующую команду:

LOAD LABEL test_db.label10
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example10.csv")
INTO TABLE table10
COLUMNS TERMINATED BY ","
(id, temp1, temp2)
SET
(
col1 = hll_hash(temp1),
col2 = hll_hash(temp2),
col3 = empty_hll()
)
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

NOTE

В приведенном выше примере три столбца example10.csv названы id, temp1 и temp2 последовательно с помощью column_list. Затем функции используются для преобразования данных следующим образом:

  • Функция hll_hash используется для преобразования значений в temp1 и temp2 example10.csv в данные типа HLL и сопоставления temp1 и temp2 example10.csv с col1 и col2 таблицы table10.

  • Функция hll_empty используется для заполнения указанного значения по умолчанию в col3 таблицы table10.

Для использования функций hll_hash и hll_empty см. hll_hash и hll_empty.

Извлечение значений полей партиции из пути к файлу

Broker Load поддерживает анализ значений определенных полей партиции, содержащихся в пути к файлу, на основе определений столбцов целевой таблицы Selena. Эта функция Selena аналогична функции Partition Discovery Apache Spark™.

Ваша база данных Selena test_db содержит таблицу с именем table11. Таблица состоит из пяти столбцов, которые представляют собой col1, col2, col3, city и utc_date последовательно.

Путь к файлу /user/selena/data/input/dir/city=beijing вашего HDFS-кластера содержит следующие файлы данных:

  • /user/selena/data/input/dir/city=beijing/utc_date=2019-06-26/0000.csv

  • /user/selena/data/input/dir/city=beijing/utc_date=2019-06-26/0001.csv

Эти файлы данных каждый состоят из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table11.

Если вы хотите загрузить данные из всех файлов данных из пути к файлу /user/selena/data/input/dir/city=beijing/utc_date=*/* в table11 и, в то же время, вы хотите извлечь значения полей партиции city и utc_date, содержащихся в пути к файлу, и загрузить извлеченные значения в city и utc_date таблицы table11, выполните следующую команду:

LOAD LABEL test_db.label11
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/dir/city=beijing/*/*")
INTO TABLE table11
FORMAT AS "csv"
(col1, col2, col3)
COLUMNS FROM PATH AS (city, utc_date)
SET (uniq_id = md5sum(k1, city))
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

Извлечение значений полей партиции из пути к файлу, содержащего %3A

В HDFS пути к файлам не могут содержать двоеточия (:). Все двоеточия (:) будут преобразованы в %3A.

Ваша база данных Selena test_db содержит таблицу с именем table12. Таблица состоит из трех столбцов, которые представляют собой data_time, col1 и col2 последовательно. Схема таблицы следующая:

data_time DATETIME,
col1 INT,
col2 INT

Путь к файлу /user/selena/data вашего HDFS-кластера содержит следующие файлы данных:

  • /user/selena/data/data_time=2020-02-17 00%3A00%3A00/example12.csv

  • /user/selena/data/data_time=2020-02-18 00%3A00%3A00/example12.csv

Если вы хотите загрузить все данные из example12.csv в table12 и, в то же время, вы хотите извлечь значения поля партиции data_time из пути к файлу и загрузить извлеченные значения в data_time таблицы table12, выполните следующую команду:

LOAD LABEL test_db.label12
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/*/example12.csv")
INTO TABLE table12
COLUMNS TERMINATED BY ","
FORMAT AS "csv"
(col1,col2)
COLUMNS FROM PATH AS (data_time)
SET (data_time = str_to_date(data_time, '%Y-%m-%d %H%%3A%i%%3A%s'))
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

NOTE

В приведенном выше примере значения, извлеченные из поля партиции data_time, - это строки, содержащие %3A, такие как 2020-02-17 00%3A00%3A00. Поэтому вам нужно использовать функцию str_to_date для преобразования строк в данные типа DATETIME перед их загрузкой в data_time таблицы table8.

Установка format_type_options

Ваша база данных Selena test_db содержит таблицу с именем table13. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example13.csv также состоит из трех столбцов, которые сопоставляются последовательно с col2, col1 и col3 таблицы table13.

Если вы хотите загрузить все данные из example13.csv в table13 с намерением пропустить первые две строки example13.csv, удалить пробелы перед и после разделителей столбцов и установить enclose в \ и escape в \, выполните следующую команду:

LOAD LABEL test_db.label13
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/*/example13.csv")
INTO TABLE table13
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(
skip_header = 2
trim_space = TRUE
enclose = "\""
escape = "\\"
)
(col2, col1, col3)
)
WITH BROKER
(
"username" = "hdfs_username",
"password" = "hdfs_password"
)
PROPERTIES
(
"timeout" = "3600"
);

Загрузка Parquet-данных

Этот раздел описывает некоторые настройки параметров, на которые вам нужно обратить внимание при загрузке Parquet-данных.

Ваша база данных Selena test_db содержит таблицу с именем table13. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example13.parquet также состоит из трех столбцов, которые сопоставляются последовательно с col1, col2 и col3 таблицы table13.

Если вы хотите загрузить все данные из example13.parquet в table13, выполните следующую команду:

LOAD LABEL test_db.label13
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example13.parquet")
INTO TABLE table13
FORMAT AS "parquet"
(col1, col2, col3)
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

NOTE

По умолчанию, при загрузке Parquet-данных Selena определяет формат файла данных на основе того, содержит ли имя файла расширение .parquet. Если имя файла не содержит расширение .parquet, вы должны использовать FORMAT AS для указания формата файла данных как Parquet.

Загрузка ORC-данных

Этот раздел описывает некоторые настройки параметров, на которые вам нужно обратить внимание при загрузке ORC-данных.

Ваша база данных Selena test_db содержит таблицу с именем table14. Таблица состоит из трех столбцов, которые представляют собой col1, col2 и col3 последовательно.

Ваш файл данных example14.orc также содержит три столбца, которые сопоставляются последовательно с col1, col2 и col3 таблицы table14.

Если вы хотите загрузить все данные из example14.orc в table14, выполните следующую команду:

LOAD LABEL test_db.label14
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example14.orc")
INTO TABLE table14
FORMAT AS "orc"
(col1, col2, col3)
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

NOTE

  • По умолчанию, при загрузке ORC-данных Selena определяет формат файла данных на основе того, содержит ли имя файла расширение .orc. Если имя файла не содержит расширение .orc, вы должны использовать FORMAT AS для указания формата файла данных как ORC.

  • В Selena v1.5.2 и более ранних, если файл данных содержит столбцы типа ARRAY, вы должны убедиться, что столбцы ORC-файла данных имеют те же имена, что и их сопоставляемые столбцы в таблице Selena, и столбцы не могут быть указаны в предложении SET.

Загрузка JSON-данных

Этот раздел описывает настройки параметров, на которые вам нужно обратить внимание при загрузке JSON-данных.

Ваша база данных Selena test_db содержит таблицу с именем tbl1, схема которой следующая:

`category` varchar(512) NULL COMMENT "",
`author` varchar(512) NULL COMMENT "",
`title` varchar(512) NULL COMMENT "",
`price` double NULL COMMENT ""

Загрузка JSON-данных с использованием простого режима

Предположим, что ваш файл данных example1.json состоит из следующих данных:

{"category":"C++","author":"avc","title":"C++ primer","price":895}

Чтобы загрузить все данные из example1.json в tbl1, выполните следующую команду:

LOAD LABEL test_db.label15
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example1.csv")
INTO TABLE tbl1
FORMAT AS "json"
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
);

NOTE

В приведенном выше примере параметры columns и jsonpaths не указаны. Поэтому ключи в example1.json сопоставляются по имени со столбцами tbl1.

Загрузка JSON-данных с использованием режима соответствия

Selena выполняет следующие шаги для сопоставления и обработки JSON-данных:

  1. (Опционально) Удаляет самую внешнюю структуру массива согласно настройке параметра strip_outer_array.

    NOTE

    Этот шаг выполняется только когда самый внешний слой JSON-данных - структура массива, обозначенная парой квадратных скобок []. Вам нужно установить strip_outer_array в true.

  2. (Опционально) Сопоставляет корневой элемент JSON-данных согласно настройке параметра json_root.

    NOTE

    Этот шаг выполняется только когда JSON-данные имеют корневой элемент. Вам нужно указать корневой элемент с помощью параметра json_root.

  3. Извлекает указанные JSON-данные согласно настройке параметра jsonpaths.

Загрузка JSON-данных с использованием режима соответствия без указания корневого элемента

Предположим, что ваш файл данных example2.json состоит из следующих данных:

[
{"category":"xuxb111","author":"1avc","title":"SayingsoftheCentury","price":895},
{"category":"xuxb222","author":"2avc","title":"SayingsoftheCentury","price":895},
{"category":"xuxb333","author":"3avc","title":"SayingsoftheCentury","price":895}
]

Чтобы загрузить только category, author и price из example2.json, выполните следующую команду:

LOAD LABEL test_db.label16
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example2.csv")
INTO TABLE tbl1
FORMAT AS "json"
(category, price, author)
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
)
PROPERTIES
(
"strip_outer_array" = "true",
"jsonpaths" = "[\"$.category\",\"$.price\",\"$.author\"]"
);

NOTE

В приведенном выше примере самый внешний слой JSON-данных - структура массива, обозначенная парой квадратных скобок []. Структура массива состоит из нескольких JSON-объектов, каждый из которых представляет запись данных. Поэтому вам нужно установить strip_outer_array в true, чтобы удалить самую внешнюю структуру массива. Ключ title, который вы не хотите загружать, игнорируется во время загрузки.

Загрузка JSON-данных с использованием режима соответствия с указанием корневого элемента

Предположим, ваш файл данных example3.json состоит из следующих данных:

{
"id": 10001,
"RECORDS":[
{"category":"11","title":"SayingsoftheCentury","price":895,"timestamp":1589191587},
{"category":"22","author":"2avc","price":895,"timestamp":1589191487},
{"category":"33","author":"3avc","title":"SayingsoftheCentury","timestamp":1589191387}
],
"comments": ["3 records", "there will be 3 rows"]
}

Чтобы загрузить только category, author и price из example3.json, выполните следующую команду:

LOAD LABEL test_db.label17
(
DATA INFILE("hdfs://<hdfs_host>:<hdfs_port>/user/selena/data/input/example3.csv")
INTO TABLE tbl1
FORMAT AS "json"
(category, price, author)
)
WITH BROKER
(
"username" = "<hdfs_username>",
"password" = "<hdfs_password>"
)
PROPERTIES
(
"json_root"="$.RECORDS",
"strip_outer_array" = "true",
"jsonpaths" = "[\"$.category\",\"$.price\",\"$.author\"]"
);

NOTE

В приведенном выше примере самый внешний слой JSON-данных - структура массива, обозначенная парой квадратных скобок []. Структура массива состоит из нескольких JSON-объектов, каждый из которых представляет запись данных. Поэтому вам нужно установить strip_outer_array в true, чтобы удалить самую внешнюю структуру массива. Ключи title и timestamp, которые вы не хотите загружать, игнорируются во время загрузки. Кроме того, параметр json_root используется для указания корневого элемента, который является массивом, JSON-данных.