Низкая производительность ADLS Gen 1 по сравнению с хранилищем общего назначения для задания ADLA U-SQL - PullRequest
0 голосов
/ 09 января 2019

Сокращения

  • ADLA: аналитика озера данных Azure
  • ADLS: хранилище озера данных Azure

Я пытался выяснить, как лучше всего сохранить входные данные для задания ADLA U-SQL в ADLS (поколение 1) или в контейнере больших двоичных объектов хранилища, и обнаружил, что извлечение задания ADLA производительность ужасна при чтении из ADLS.

Для одного теста я загрузил один и тот же набор данных в ADLS Gen 1 и контейнер BLOB-объектов общего назначения и выполнил одно и то же задание ADLS U-SQL, которое варьировалось только в том месте, где они получали свои входные данные. Исключение входного набора файлов (по дате) сократило входной набор до 67 входных файлов, общим объемом 1,59 МБ (да, МБ - много маленьких файлов в этом синтетическом наборе данных)

Задания ADLA получают свои данные из ADLS (либо adl: или swebhdfs: протоколы - почти ничего не изменилось), либо из хранилища больших двоичных объектов общего назначения ( wasb: protocol ).

Из ADLS этап извлечения занял почти 13 минут, в то время как учетная запись BLOB общего назначения заняла всего 18 секунд. Остальная часть рабочего времени была практически одинаковой для всех источников ввода (как и следовало ожидать).

Должен ли я видеть такую ​​разницу в производительности, когда мой входной набор данных находится в ADLS, а не в учетной записи общего назначения?

Мой скрипт ADLA выглядит так - в этом нет ничего экзотического:

//General purpose blob wasb: protocol
DECLARE @InputPath = @"wasb://{container}@{account}.blob.core.windows.net/events/{date:yyyy}/{date:MM}/{date:dd}/{date:HH}_{*}";

//ADLS adl: protocol
//DECLARE @InputPath = @"adl://{adls-account}.azuredatalakestore.net/events/{date:yyyy}/{date:MM}/{date:dd}/{date:HH}_{*}";

//ADLS swebhdfs: protocol
//DECLARE @InputPath = @"swebhdfs://{adls-account}.azuredatalakestore.net/events/{date:yyyy}/{date:MM}/{date:dd}/{date:HH}_{*}";

DECLARE @StartDate = DateTime.Parse("2018-02-25T00:00:00+00:00");
DECLARE @EndDate   = DateTime.Parse("2018-02-27T23:59:59+00:00");

@tsvArchiveRecords =
    EXTRACT 
            TenantId int?,
            UserId long?,
           // Snip more fields for brevity
            date DateTime //virtual column
    FROM @InputPath
    USING Extractors.Tsv(skipFirstNRows: 1);

@logs =
    SELECT TenantId,
            UserId,
            // Snip more fields for brevity
    FROM @tsvArchiveRecords
    WHERE date BETWEEN @StartDate AND @EndDate;

//snip more processing and outputs for brevity
...