2017-02-21 63 views
2

Код работает очень быстро над 2000 небольшими файлами (~ 10-50 Kb) ~ 1 мин. Parallelizm = 5.Работа у-sql выполняется очень медленно, когда я добавляю вызов .NET

@arenaData = 
    EXTRACT col1, col2, col3 
    FROM @in 
    USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8); 

@res = 
    SELECT col1, col2, col3 
    FROM @arenaData; 
    OUTPUT @res 
    TO @out 
    USING Outputters.Csv(); 

Но если я изменить код, как это он занимает ~ 1 час

@arenaData = 
    EXTRACT col1, col2, col3 
    FROM @in 
    USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8); 

@res = 
    SELECT 
     col1.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) AS col1_converted, 
, col2, col3 

    FROM @arenaData; 
    OUTPUT @res 
    TO @out 
    USING Outputters.Csv(); 

Почему .NET вызов так медленно? Мне нужно преобразовать формат даты в исходные CSV-файлы в «yyyy-MM-dd HH: mm: ss»? Как я могу сделать это эффективно?

+0

Это звучит не так. Есть дополнительные накладные расходы на загрузку CLR и вызов из собственного кода в выполнение C#, но это не должно быть в 60 раз хуже. Не могли бы вы отправить мне ссылки на работу (usql at Microsoft dot com), чтобы я мог попросить нашу инженерную команду провести расследование? –

+0

Я начал подписку поддержки для группы поддержки ADLA, прежде чем я отправил вопрос в stackoverflow. я сделал эти тесты для команды поддержки (URLs Иова ниже): без CLR ~ 2 мин (MAXDOP = 5): https://arkadium.azuredatalakeanalytics.net/jobs/68d7a42a-4f66-4308-a398- 3775eee74877? Api-version = 2015-11-01-preview То же самое с одним вызовом CLR ~ 38 мин (MAXDOP = 5): https://arkadium.azuredatalakeanalytics.net/jobs/4291a7e6-ed0f-4516- b677-38a432a9997c? api-version = 2015-11-01-preview изменения таймингов, поскольку параметры были изменены, но проблема все еще существует. sooo большая разница – churupaha

+0

еще несколько тестов: такая же работа с CLR + параллелизмом увеличилась с 5 до 20. Истекшее время ~ 10 минут https: // arkadium.azuredatalakeanalytics.net/jobs/c09a8917-3425-48df-97ea-e4a84dad3c15?api-version=2015-11-01-preview То же самое задание с CLR + параллелизмом увеличилось с 5 до 3. Истекшее время ~ 59 мин + отменено мной https://arkadium.azuredatalakeanalytics.net/jobs/9168ea66-e988-4497-b661-417f1128ceac?api-version=2015-11-01-preview – churupaha

ответ

2

Замечательно, что вы получаете лучшую производительность прямо сейчас!

Ваша работа выполняется на более чем 2800 очень маленьких файлах, используя выражение, которое выполняется в управляемом коде и не переведено на C++, поскольку некоторые из наиболее распространенных выражений C# в U-SQL.

Это приводит к следующей задаче:

  1. Вы начинаете свою работу с определенным количеством а.е.. Затем каждый AU запускает контейнер YARN для выполнения части вашей работы. Это означает, что контейнер должен быть инициализирован чисто, что занимает некоторое время (вы можете увидеть его в представлении выполнения вершин как время создания). Теперь это занимает немного времени, это не так много накладных расходов, если ваша вершина выполняет некоторую большую обработку. К сожалению, в вашем случае обработка выполняется очень быстро в небольшом файле, поэтому есть большие накладные расходы.

  2. Если вершина выполняет только сгенерированный системой код, который мы кодируем в код C++, мы можем повторно использовать контейнеры без времени повторной инициализации. К сожалению, мы не можем повторно использовать общий пользовательский код, который запускается с управляемой средой выполнения из-за того, что оставшиеся артефакты остаются позади. Поэтому в этом случае нам нужно повторно инициализировать контейнеры, которые потребуют времени (более 2800 раз).

Теперь на основе ваших отзывов, мы совершенствуем нашу логику (повторной инициализации мы все еще можем переинициализировать, если вы что-нибудь фантазии с инлайн C# выражений не делать). Кроме того, он станет лучше, если мы сможем обрабатывать несколько небольших файлов внутри одной вершины вместо одного файла на вершину.

Обходные пути для вас - увеличить размеры ваших файлов и, возможно, избежать того, чтобы пользовательский код (возможно, не всегда) был слишком большим из вершин.

+0

Большое спасибо за подробное объяснение. Кроме того, я знаю, что контейнер AU ~ Apache YARN. – churupaha

 Смежные вопросы

  • Нет связанных вопросов^_^