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

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

Узнать, как:

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

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

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

Общий набор данных в этом примере является частью набора инструментов Wind Integration National Dataset Toolkit или WIND Toolkit [1], [2], [3], [4]. Для получения дополнительной информации смотрите Wind Integration National Dataset Toolkit.

Требования

Чтобы запустить этот пример, вы должны настроить доступ к кластеру в Amazon AWS. В MATLAB можно создавать кластеры в Amazon AWS непосредственно с рабочего стола MATLAB. На вкладке «Вкладке Home», в меню Parallel, выберите Create and Manage Clusters. В Диспетчере профилей кластеров щелкните Создать облако. Также можно использовать MathWorks Cloud Center для создания и доступа к вычислительным кластерам в 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 по мере необходимости обращается к меньшим фрагментам удаленных данных, поэтому вам не нужно загружать сразу весь набор данных. С помощью длинные массивы 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"));

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

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

Составьте длинное расписание с данными метрологии из datastore.

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 поддерживают длинные массивы, поэтому можно выполнять разнообразные вычисления на наборах больших данных с помощью привычного синтаксиса. Дополнительные сведения о поддерживаемых функциях см. в разделе Вспомогательные функции.

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

Данные в 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., B. M. Hodge, A. Clifton, and J. McCaa. Обзор и метеорологическая валидация набора национальных наборов данных по интегрированию ветра (Технический отчет, NREL/TP-5000-61740). Golden, CO: Национальная лаборатория возобновляемой энергии, 2015.

[2] Draxl, C., B. M. Hodge, A. Clifton, and J. McCaa. «Инструментарий WIND Integration National Dataset (WIND) Toolkit». Прикладная энергия. Том 151, 2015, стр. 355-366.

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

[4] Lieberman-Cribbin, W., C. Draxl, and A. Clifton. Руководство по использованию кода валидации Toolkit (Технический отчет, NREL/TP-5000-62595). Golden, CO: Национальная лаборатория возобновляемой энергии, 2014.

См. также

| | |

Похожие примеры

Подробнее о