exponenta event banner

Обработка больших данных в облаке

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

Узнайте, как:

  • Доступ к общедоступному большому набору данных в Amazon Cloud.

  • Найдите и выберите интересное подмножество этого набора данных.

  • Чтобы обработать это подмножество менее чем за 20 минут, используйте хранилища данных, массивы tall и панель инструментов Parallel Computing Toolbox.

Набор общедоступных данных в этом примере является частью Набора национальных данных Wind Integration, или Инструментария WIND [1], [2], [3], [4]. Дополнительные сведения см. в разделе Набор инструментов для национального набора данных Wind Integration.

Требования

Для выполнения этого примера необходимо настроить доступ к кластеру в Amazon AWS. В MATLAB можно создавать кластеры в Amazon AWS непосредственно с рабочего стола MATLAB. На вкладке Главная в меню Параллельный выберите Создать кластеры и управление ими. В диспетчере профилей кластера щелкните Создать облачный кластер. Можно также использовать Cloud Center MathWorks для создания вычислительных кластеров в Amazon AWS и доступа к ним. Дополнительные сведения см. в разделе Начало работы с облачным центром.

Настройка доступа к удаленным данным

В этом примере используется набор данных Techno-Economic WIND Toolkit. Он содержит 2 Тбайт (терабайт) данных для оценок и прогнозов ветроэнергетики вместе с атмосферными переменными с 2007 по 2013 год в пределах континентальной части США.

Techno-Economic WIND Toolkit доступен через Amazon Web Services, в местоположении s3 ://pywtk-data. Он содержит два набора данных:

  • s3://pywtk-data/met_data - Метрологические данные

  • s3://pywtk-data/fcst_data - Прогнозные данные

Для работы с удаленными данными в Amazon S3 необходимо определить переменные среды для учетных данных AWS. Дополнительные сведения о настройке доступа к удаленным данным см. в разделе Работа с удаленными данными. В следующем коде замените YOUR_AWS_ACCESS_KEY_ID и YOUR_AWS_SECRET_ACCESS_KEY с собственными учетными данными Amazon AWS.

setenv("AWS_ACCESS_KEY_ID","YOUR_AWS_ACCESS_KEY_ID");
setenv("AWS_SECRET_ACCESS_KEY","YOUR_AWS_SECRET_ACCESS_KEY");

Этот набор данных требует указания его географического региона, поэтому необходимо задать соответствующую переменную среды.

setenv("AWS_DEFAULT_REGION","us-west-2");

Чтобы предоставить работникам кластера доступ к удаленным данным, добавьте эти имена переменных среды в EnvironmentVariables свойства профиля кластера. Чтобы изменить свойства профиля кластера, воспользуйтесь диспетчером профилей кластера в разделе «Параллель» > «Создание кластеров и управление ими».

Найти подмножество больших данных

Набор данных объемом 2 Тбайт достаточно велик. В этом примере показано, как найти подмножество набора данных, который требуется проанализировать. В примере рассматриваются данные по штату Массачусетс.

Сначала получите идентификаторы, которые идентифицируют метрологические станции в Массачусетсе, и определите файлы, которые содержат их метрологическую информацию. Метаданные для каждой станции находятся в файле с именем three_tier_site_metadata.csv. Поскольку эти данные малы и помещаются в память, доступ к ним можно получить из клиента MATLAB с помощью readtable. Вы можете использовать readtable функция доступа к открытым данным в S3 интервалах непосредственно без необходимости записи специального кода.

tMetadata = readtable("s3://pywtk-data/three_tier_site_metadata.csv",...
    "ReadVariableNames",true,"TextType","string");

Чтобы узнать, какие состояния перечислены в этом наборе данных, используйте unique.

states = unique(tMetadata.state)
states = 50×1 string array
    ""
    "Alabama"
    "Arizona"
    "Arkansas"
    "California"
    "Colorado"
    "Connecticut"
    "Delaware"
    "District of Columbia"
    "Florida"
    "Georgia"
    "Idaho"
    "Illinois"
    "Indiana"
    "Iowa"
    "Kansas"
    "Kentucky"
    "Louisiana"
    "Maine"
    "Maryland"
    "Massachusetts"
    "Michigan"
    "Minnesota"
    "Mississippi"
    "Missouri"
    "Montana"
    "Nebraska"
    "Nevada"
    "New Hampshire"
    "New Jersey"
    "New Mexico"
    "New York"
    "North Carolina"
    "North Dakota"
    "Ohio"
    "Oklahoma"
    "Oregon"
    "Pennsylvania"
    "Rhode Island"
    "South Carolina"
    "South Dakota"
    "Tennessee"
    "Texas"
    "Utah"
    "Vermont"
    "Virginia"
    "Washington"
    "West Virginia"
    "Wisconsin"
    "Wyoming"

Определите, какие станции расположены в штате Массачусетс.

index = tMetadata.state == "Massachusetts";
siteId = tMetadata{index,"site_id"};

Данные для данного терминала содержатся в файле, который соответствует этому соглашению об именовании: s3://pywtk-data/met_data/folder/site_id.nc, где folder является ближайшим целым числом, меньшим или равным site_id/500. С помощью этого соглашения составьте местоположение файла для каждой станции.

folder = floor(siteId/500);
fileLocations = compose("s3://pywtk-data/met_data/%d/%d.nc",folder,siteId);

Обработка больших данных

Для доступа и обработки данных, не помещающихся в память, можно использовать хранилища данных и массивы уровня. При выполнении вычислений больших данных MATLAB получает доступ к меньшим частям удаленных данных по мере необходимости, поэтому не требуется загружать весь набор данных одновременно. При использовании массивов tall MATLAB автоматически разбивает данные на блоки меньшего размера, которые помещаются в память для обработки.

При наличии панели инструментов Parallel Computing Toolbox MATLAB может обрабатывать множество блоков параллельно. Параллелизация позволяет выполнять анализ на одном рабочем столе с локальными работниками или масштабировать до кластера для получения дополнительных ресурсов. При использовании кластера в той же облачной службе, что и данные, данные остаются в облаке, и вы получаете преимущества от улучшенного времени передачи данных. Хранение данных в облаке также является более экономичным. Этот пример был выполнен менее чем за 20 минут с использованием 18 работников на машине c4.8xlarge в Amazon AWS.

При использовании параллельного пула в кластере MATLAB обрабатывает эти данные с использованием работников кластера. Создайте параллельный пул в кластере. В следующем коде используйте имя профиля кластера. Присоедините сценарий к пулу, так как параллельные работники должны получить доступ к функции помощника в пуле.

p = parpool("myAWSCluster");
Starting parallel pool (parpool) using the 'myAWSCluster' profile ...
connected to 18 workers.
addAttachedFiles(p,mfilename("fullpath"));

Создайте хранилище данных с данными метрологии для станций в штате Массачусетс. Данные представлены в виде файлов формы сетевых общих данных (NetCDF), и для их интерпретации необходимо использовать пользовательскую функцию чтения. В этом примере эта функция называется ncReader и считывает данные NetCDF в расписания. Его содержимое можно просмотреть в конце этого сценария.

dsMetrology = fileDatastore(fileLocations,"ReadFcn",@ncReader,"UniformRead",true);

Создайте высокое расписание с метрологическими данными из хранилища данных.

ttMetrology = tall(dsMetrology)
ttMetrology =

  M×6 tall timetable

            Time            wind_speed    wind_direction    power     density    temperature    pressure
    ____________________    __________    ______________    ______    _______    ___________    ________

    01-Jan-2007 00:00:00       5.905          189.35        3.3254    1.2374       269.74        97963  
    01-Jan-2007 00:05:00      5.8898          188.77        3.2988    1.2376       269.73        97959  
    01-Jan-2007 00:10:00      5.9447          187.85         3.396    1.2376       269.71        97960  
    01-Jan-2007 00:15:00      6.0362          187.05        3.5574    1.2376       269.68        97961  
    01-Jan-2007 00:20:00      6.1156          186.49        3.6973    1.2375       269.83        97958  
    01-Jan-2007 00:25:00      6.2133          185.71        3.8698    1.2376       270.03        97952  
    01-Jan-2007 00:30:00      6.3232          184.29        4.0812    1.2379       270.19        97955  
    01-Jan-2007 00:35:00      6.4331          182.51        4.3382    1.2382        270.3        97957  
             :                  :               :             :          :            :            :
             :                  :               :             :          :            :            :

Получить среднюю температуру в месяц с помощью groupsummaryи отсортировать полученную таблицу высокого уровня. Для обеспечения производительности MATLAB откладывает большинство операций высокого уровня до тех пор, пока не потребуются данные. В этом случае график данных инициирует оценку отложенных вычислений.

meanTemperature = groupsummary(ttMetrology,"Time","month","mean","temperature");
meanTemperature = sortrows(meanTemperature);

Постройте график результатов.

figure;
plot(meanTemperature.mean_temperature,"*-");
ylim([260 300]);
xlim([1 12*7+1]);
xticks(1:12:12*7+1);
xticklabels(["2007","2008","2009","2010","2011","2012","2013","2014"]);
title("Average Temperature in Massachusetts 2007-2013");
xlabel("Year");
ylabel("Temperature (K)")

Многие функции MATLAB поддерживают массивы tall, что позволяет выполнять различные вычисления для наборов больших данных с использованием привычного синтаксиса. Дополнительные сведения о поддерживаемых функциях см. в разделе Поддержка функций.

Определение пользовательской функции чтения

Данные в Techno-Economic WIND Toolkit сохраняются в файлах NetCDF. Определите пользовательскую функцию чтения для считывания ее данных в расписание. Дополнительные сведения о чтении файлов NetCDF см. в разделе Файлы NetCDF.

function t = ncReader(filename)
% NCREADER Read NetCDF File (.nc), extract data set and save as a timetable

% Get information about NetCDF data source
fileInfo = ncinfo(filename);

% Extract variable names and datatypes
varNames = string({fileInfo.Variables.Name});
varTypes = string({fileInfo.Variables.Datatype});

% Transform variable names into valid names for table variables
if any(startsWith(varNames,["4","6"]))
    strVarNames = replace(varNames,["4","6"],["four","six"]);
else
    strVarNames = varNames;
end

% Extract the length of each variable
fileLength = fileInfo.Dimensions.Length;

% Extract initial timestamp, sample period and create the time axis
tAttributes = struct2table(fileInfo.Attributes);
startTime = datetime(cell2mat(tAttributes.Value(contains(tAttributes.Name,"start_time"))),"ConvertFrom","epochtime");
samplePeriod = seconds(cell2mat(tAttributes.Value(contains(tAttributes.Name,"sample_period"))));

% Create the output timetable 
numVars = numel(strVarNames);
tableSize = [fileLength numVars];
t = timetable('Size',tableSize,'VariableTypes',varTypes,'VariableNames',strVarNames,'TimeStep',samplePeriod,'StartTime',startTime);

% Fill in the timetable with variable data
for k = 1:numVars
    t(:,k) = table(ncread(filename,varNames{k}));
end
end

Ссылки

[1] Draxl, C., Б. М. Ходж, А. Клифтон и Дж. Маккэа. Обзор и метеорологическая валидация национального набора данных по интеграции ветра (Технический отчет, NREL/TP-5000-61740). Golden, CO: Национальная лаборатория возобновляемых источников энергии, 2015.

[2] Draxl, C., Б. М. Ходж, А. Клифтон и Дж. Маккэа. «Набор национальных данных по интеграции ветра (WIND)». Прикладная энергия. Том 151, 2015, стр. 355-366.

[3] Кинг, Дж., А. Клифтон и Б. М. Ходж. Проверка выдачи мощности для инструментария WIND (Технический отчет, NREL/TP-5D00-61714). Golden, CO: Национальная лаборатория возобновляемых источников энергии, 2014.

[4] Либерман-Криббин, В., К. Дракль и А. Клифтон. Руководство по использованию кода проверки инструментария WIND (Технический отчет, NREL/TP-5000-62595). Golden, CO: Национальная лаборатория возобновляемых источников энергии, 2014.

См. также

| | |

Связанные примеры

Подробнее