Параллельное чтение U-SQL из таблицы SQL

У меня есть сценарий, в котором я загружаю данные из базы данных MS SQL в Azure Data Lake с помощью U-SQL. Моя таблица довольно большая, с более чем 16 миллионами записей (скоро их будет намного больше). Я просто делаю SELECT a, b, c FROM dbo.myTable;

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

введите здесь описание изображения

У меня вопрос: есть ли способ использовать параллелизм при чтении из таблицы SQL?


person candidson    schedule 21.08.2017    source источник
comment
Привет, вы рассматривали фабрику данных Azure? Является ли база данных MS SQL также в Azure, если это IaaS или PaaS?   -  person Alex KeySmith    schedule 05.12.2017
comment
Я рассматривал этот вариант. И да, извлечение файлов CSV в U-SQL по умолчанию может быть распараллелено. Но я надеялся использовать только U-SQL. Спасибо за ваш вклад!   -  person candidson    schedule 05.12.2017


Ответы (3)


Запросы к внешним источникам данных не распараллеливаются автоматически в U-SQL. (Это то, что мы рассматриваем на будущее)

Ответ wBob действительно дает один вариант для достижения примерно такого же эффекта - хотя он, конечно, требует, чтобы вы вручную разбивали и запрашивали данные с помощью нескольких операторов U-SQL.

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

person saveenr    schedule 21.08.2017
comment
Спасибо @saveenr и команде Data Lake за ответ. Я принял к сведению! - person candidson; 22.08.2017

Я не верю, что параллелизм для внешних источников данных еще поддерживается для U-SQL (хотя рад, что его исправят). Если вы считаете, что это важная отсутствующая функция, вы можете создать запрос и проголосовать за нее здесь:

https://feedback.azure.com/forums/327234-data-lake

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

// External query working
USE DATABASE yourADLADB;

// Create the external query for year 2016
@results2016 =
    SELECT *
    FROM EXTERNAL yourSQLDBDataSource EXECUTE 
        @"SELECT * FROM dbo.yourBigTable WITH (NOLOCK) WHERE yourDateCol Between '1 Jan 2016 and 31 Dec 2016'";


// Create the external query for year 2017
@results2017 =
    SELECT *
    FROM EXTERNAL yourSQLDBDataSource EXECUTE 
        @"SELECT * FROM dbo.yourBigTable WITH (NOLOCK) WHERE yourDateCol Between '1 Jan 2017 and 31 Dec 2017";


// Output 2016 results
OUTPUT @results2016
TO "/output/bigTable/results2016.csv"
USING Outputters.Csv();


// Output 2017 results
OUTPUT @results2017
TO "/output/bigTable/results2017.csv"
USING Outputters.Csv();

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

@input =
    EXTRACT 
            ... // your column list
    FROM "/output/bigTable/results{year}.csv"
    USING Extractors.Csv();

Я бы спросил, почему вы решили переместить такой большой файл в свое озеро, учитывая, что ADLA и U-SQL предлагают вам возможность запрашивать данные там, где они находятся. Вы можете объяснить дальше?

person wBob    schedule 21.08.2017
comment
Спасибо @wBob за идею. Я тоже думал о распараллеливании таким образом, но я действительно надеялся на автоматическое решение :-) На самом деле я не перемещаю данные. Я спрашиваю, где он уходит. Я делаю своего рода дельта-загрузку. (1) на первом этапе я запрашиваю весь набор данных и сохраняю результат в переменной @table. (2) Затем во второй таблице я сравниваю данные с ранее загруженным набором данных (который хранится в таблице u-sql). Насколько я понимаю, U-SQL не должен загружать всю (исходную) таблицу, верно? - person candidson; 21.08.2017
comment
Также следует иметь в виду, что если вы запрашиваете мощную базу данных, тогда запрос может распараллеливаться в фоновом процессе на нескольких процессорах. В SQL Server, например, есть концепция MAXDOP, и большие операции чтения имеют тенденцию распараллеливаться там. - person wBob; 21.08.2017
comment
Поскольку u-sql поддерживает отложенную загрузку, я ожидал, что будут загружены только те данные, которые мне нужны (только дельта). вместо загрузки всей таблицы перед применением дельта-фильтрации. Следует отметить, что дельта-логика встроена в запрос. Например, ВЫБЕРИТЕ a, b, c ИЗ dbo.myTable ГДЕ myTime ›'xxx' - person candidson; 21.08.2017

Другим потенциальным решением здесь может быть создание кластера HDInsight, поддерживаемого тем же хранилищем ADLS, что и ваша учетная запись ADLA.

Затем вы можете использовать Apache Sqoop для параллельного копирования данных с SQL-сервера в каталог в ADLS, а затем импортировать эти данные (которые будут разделены на несколько файлов) в таблицы с помощью U-SQL.

person Ron DeFreitas    schedule 01.12.2017