Main Content

クラウドでのビッグデータの処理

この例では、クラウド上の大規模データ セットにアクセスし、ビッグ データ向けの MATLAB® の機能を使用してクラウド クラスター上で処理する方法を説明します。

以下の方法について説明します。

  • Amazon Cloud で公開されている大規模データセットにアクセスする。

  • このデータセットの興味深いサブセットを見つけて選択する。

  • データ ストア、tall 配列および Parallel Computing Toolbox を使用して、このサブセットを 20 分以内に処理する。

この例の公開データセットは、Wind Integration National Dataset Toolkit (WIND Toolkit) [1]、[2]、[3]、[4] の一部です。詳細については、Wind Integration National Dataset Toolkit を参照してください。

要件

この例を実行するには、Amazon AWS のクラスターへのアクセスを設定しなければなりません。MATLAB では、MATLAB デスクトップから直接 Amazon AWS 上にクラスターを作成できます。[ホーム] タブの [並列] メニューで [クラスターの作成と管理] を選択します。クラスター プロファイル マネージャーで、[クラウド クラスターの作成] をクリックします。あるいは、MathWorks Cloud Center を使用して Amazon AWS の計算クラスターを作成してアクセスできます。詳細については、Getting Started with Cloud Center を参照してください。

リモート データへのアクセスの設定

この例で使用するデータセットは Techno-Economic WIND Toolkit です。これには、米国本土における 2007 年から 2013 年までの、風力発電の推定値と予測値、および大気に関する変数のデータが 2 TB (テラバイト) 含まれています。

Techno-Economic WIND Toolkit は、Amazon Web Services の s3://nrel-pds-wtk/wtk-techno-economic/pywtk-data の場所から利用できます。次の 2 つのデータセットがあります。

  • s3://nrel-pds-wtk/wtk-techno-economic/pywtk-data/met_data - 計量データ

  • s3://nrel-pds-wtk/wtk-techno-economic/pywtk-data/fcst_data - 予測データ

Amazon S3 のリモート データを処理するには、AWS 認証情報の環境変数を定義しなければなりません。リモート データへのアクセスを設定する方法の詳細については、リモート データの操作を参照してください。次のコードの YOUR_AWS_ACCESS_KEY_ID および YOUR_AWS_SECRET_ACCESS_KEY をお使いの Amazon AWS 認証情報に置き換えてください。一時的な AWS セキュリティ資格情報を使用している場合は、環境変数 AWS_SESSION_TOKEN も設定します。

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 TB のデータセットは非常に大規模です。この例では、解析対象とするデータセットのサブセットを見つける方法を説明します。この例では、マサチューセッツ州のデータに着目します。

まず、マサチューセッツ州内の測定ステーションを識別する ID を取得し、その測定情報を含むファイルを特定します。各ステーションのメタデータ情報は three_tier_site_metadata.csv というファイルに含まれています。このデータは小さく、メモリに納まるため、MATLAB クライアントから readtable でアクセスできます。関数 readtable を使用することで、特別なコードを記述せずに S3 バケットの公開データに直接アクセスできます。

tMetadata = readtable("s3://nrel-pds-wtk/wtk-techno-economic/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://nrel-pds-wtk/wtk-techno-economic/pywtk-data/met_data/folder/site_id.nc の命名規則に従うファイルに含まれています。ここで、foldersite_id/500 以下の最も近い整数です。この命名規則を使用して、各ステーションのファイルの場所を構成します。

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

ビッグ データの処理

データ ストアおよび tall 配列を使用して、メモリに納まらないデータにアクセスし、処理できます。ビッグ データの計算を実行するときに、MATLAB は必要に応じてリモート データの小さな部分にアクセスするため、一度にデータセット全体をダウンロードする必要はありません。tall 配列の場合、MATLAB は、メモリに納めて処理できる小さなブロックにデータを自動的に分割します。

Parallel Computing Toolbox をお持ちの場合、MATLAB は多くのブロックを並列処理できます。並列化により、複数のローカル ワーカーをもつ 1 台のデスクトップで解析を実行したり、より多くのリソースをもつクラスターにスケール アップしたりできます。データと同じクラウド サービス内のクラスターを使用すると、データがクラウド内に留まるため、データ転送時間の向上するメリットが得られます。また、データをクラウド内に保持すると、コストの面でも有利です。この例は Amazon AWS の c4.8xlarge マシン上の 18 個のワーカーを使用して、20 分未満で実行されました。

クラスター内で並列プールを使用すると、MATLAB はクラスター内のワーカーを使用してこのデータを処理します。クラスター内に並列プールを作成します。次のコードでは、代わりにお使いのクラスター プロファイルの名前を使用してください。並列ワーカーはスクリプト内の補助関数にアクセスする必要があるため、プールにスクリプトを付加します。

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

マサチューセッツ州内のステーションの計量データをもつデータ ストアを作成します。データは Network Common Data Form (NetCDF) ファイルの形式になっているため、カスタム読み取り関数を使用して解釈しなければなりません。この例で、この関数の名前は ncReader であり、NetCDF データを timetable に読み込みます。このスクリプトの最後でその内容を確認できます。

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

データ ストアの計量データをもつ tall timetable を作成します。

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 を使用して月次平均温度を取得し、得られた tall table を並べ替えます。パフォーマンスの観点から、MATLAB はデータが必要になるまでほとんどの tall 演算を先送りにします。この例では、データをプロットすることで先送りされた計算の評価がトリガーされます。

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 ファイルに保存されています。このデータを timetable に読み込むカスタム読み取り関数を定義します。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.Overview and Meteorological Validation of the Wind Integration National Dataset Toolkit (Technical Report, NREL/TP-5000-61740).Golden, CO:National Renewable Energy Laboratory, 2015.

[2] Draxl, C., B. M. Hodge, A. Clifton, and J. McCaa."The Wind Integration National Dataset (WIND) Toolkit."Applied Energy.Vol. 151, 2015, pp. 355-366.

[3] King, J., A. Clifton, and B. M. Hodge.Validation of Power Output for the WIND Toolkit (Technical Report, NREL/TP-5D00-61714).Golden, CO:National Renewable Energy Laboratory, 2014.

[4] Lieberman-Cribbin, W., C. Draxl, and A. Clifton.Guide to Using the WIND Toolkit Validation Code (Technical Report, NREL/TP-5000-62595).Golden, CO:National Renewable Energy Laboratory, 2014.

参考

| | |

関連する例

詳細