Main Content

mapreduce

메모리에 담을 수 없을 정도로 큰 데이터 세트를 분석하기 위한 프로그래밍 기법

설명

예제

outds = mapreduce(ds,mapfun,reducefun)은 입력 데이터저장소 ds에 map 함수 mapfun을 적용한 다음 각 고유 키에 대한 값을 reduce 함수 reducefun에 전달합니다. 출력 데이터저장소는 현재 폴더에 있는 .mat 파일을 가리키는 KeyValueDatastore 객체입니다.

outds = mapreduce(ds,mapfun,reducefun,mr)은 선택적으로 mapreduce에 대한 런타임 구성 설정을 지정합니다. mr 입력값은 mapreducer 함수를 호출한 결과입니다. 일반적으로, 이 인수는 Parallel Computing Toolbox™, MATLAB® Parallel Server™ 또는 MATLAB Compiler™에서 사용됩니다. 자세한 내용은 Speed Up and Deploy MapReduce Using Other Products 항목을 참조하십시오.

outds = mapreduce(___,Name,Value)는 위에 열거된 구문에 Name,Value 쌍 인수를 하나 이상 추가 옵션으로 지정합니다. 예를 들어, 'OutputFolder' 다음에 출력 폴더의 경로를 나타내는 문자형 벡터를 지정할 수 있습니다.

예제

모두 축소

mapreduce를 사용하여 데이터 세트에 있는 각 고유 항공사의 비행 횟수를 셉니다.

airlinesmall.csv 데이터 세트를 사용하여 데이터저장소를 만듭니다. 이 12메가바이트 데이터 세트에는 도착 시간과 출발 시간 등의 여러 항공사에 대한 29개 열의 비행 정보가 들어 있습니다. 이 예에서, UniqueCarrier(항공사 이름)를 관심 변수로 선택합니다. 데이터저장소가 'NA' 값을 누락된 것으로 취급하도록 'TreatAsMissing' 이름-값 쌍을 지정하고 누락값을 0으로 바꾸도록 'MissingValue' 이름-값 쌍을 지정합니다.

ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA',...
    'MissingValue',0);
ds.SelectedVariableNames = 'UniqueCarrier';
ds.SelectedFormats = '%C';

데이터를 미리 봅니다.

preview(ds)
ans=8×1 table
    UniqueCarrier
    _____________

         PS      
         PS      
         PS      
         PS      
         PS      
         PS      
         PS      
         PS      

데이터에 대해 mapreduce를 실행합니다. map 함수와 reduce 함수는 각 데이터 블록에서 항공사 이름이 나온 횟수를 센 후 이러한 중간 집계 횟수를 더해 최종 집계 횟수를 구합니다. 이 방법은 mapreduce가 수행한 고유 키를 기준으로 하는 중간 정렬을 이용합니다. countMapper 함수와 countReducer 함수는 이 스크립트의 끝에 포함됩니다.

outds = mapreduce(ds, @countMapper, @countReducer);
********************************
*      MAPREDUCE PROGRESS      *
********************************
Map   0% Reduce   0%
Map  16% Reduce   0%
Map  32% Reduce   0%
Map  48% Reduce   0%
Map  65% Reduce   0%
Map  81% Reduce   0%
Map  97% Reduce   0%
Map 100% Reduce   0%
Map 100% Reduce  10%
Map 100% Reduce  21%
Map 100% Reduce  31%
Map 100% Reduce  41%
Map 100% Reduce  52%
Map 100% Reduce  62%
Map 100% Reduce  72%
Map 100% Reduce  83%
Map 100% Reduce  93%
Map 100% Reduce 100%
readall(outds)
ans=29×2 table
       Key          Value  
    __________    _________

    {'AA'    }    {[14930]}
    {'AS'    }    {[ 2910]}
    {'CO'    }    {[ 8138]}
    {'DL'    }    {[16578]}
    {'EA'    }    {[  920]}
    {'HP'    }    {[ 3660]}
    {'ML (1)'}    {[   69]}
    {'NW'    }    {[10349]}
    {'PA (1)'}    {[  318]}
    {'PI'    }    {[  871]}
    {'PS'    }    {[   83]}
    {'TW'    }    {[ 3805]}
    {'UA'    }    {[13286]}
    {'US'    }    {[13997]}
    {'WN'    }    {[15931]}
    {'AQ'    }    {[  154]}
      ⋮

map 함수 countMapper는 데이터가 categorical형이라는 사실을 이용합니다. countcats 함수와 categories 함수는 각 입력 데이터 블록에 사용되어 항공사 이름과 관련 개수의 키/값 쌍을 생성합니다.

function countMapper(data, info, intermKV)
% Counts unique airline carrier names in each block.
a = data.UniqueCarrier;
c = num2cell(countcats(a));
keys = categories(a);
addmulti(intermKV, keys, c)
end

reduce 함수 countReducer는 map 함수로 생성된 중간 데이터를 읽은 후 중간 집계 횟수를 모두 더하여 각 항공사마다 하나의 최종 집계 횟수를 산출합니다.

function countReducer(key, intermValIter, outKV)
% Combines counts from all blocks to produce final counts.
count = 0;
while hasnext(intermValIter)
    data = getnext(intermValIter);
    count = count + data;
end
add(outKV, key, count)
end

입력 인수

모두 축소

입력 데이터저장소로, datastore 객체로 지정됩니다. datastore 함수를 사용하여 데이터 세트에서 datastore 객체를 생성합니다.

mapreduce는 결정적인(deterministic) 데이터저장소에서만 작동합니다. 즉, 데이터저장소에서 read를 사용한 경우와 reset을 사용하여 데이터저장소를 재설정한 다음 데이터저장소를 다시 읽어 들는 경우에 반환되는 데이터는 서로 동일해야 합니다. 결정적이지 않은 데이터저장소에서 mapreduce 계산을 수행하면 예기치 않은 결과가 생성될 수 있습니다. 자세한 내용은 파일 형식 또는 응용 프로그램에 맞는 데이터저장소 선택하기 항목을 참조하십시오.

map 함수에 대한 함수 핸들입니다. mapfun은 입력 데이터저장소 ds에서 블록을 받은 다음, add 함수와 addmulti 함수를 사용하여 키-값 쌍을 중간 KeyValueStore 객체에 추가합니다. mapreduce가 map 함수를 호출하는 횟수는 datastore의 블록 수와 같습니다. 블록 수는 데이터저장소의 ReadSize 속성에 의해 결정됩니다.

map 함수에 대한 입력값은 data, info, intermKVStore입니다. 이러한 입력값은 mapreduce가 자동으로 생성한 후 map 함수로 전달합니다.

  • data 입력값과 info 입력값은 datastoreread 함수를 호출한 결과입니다. 이 함수는 map 함수를 호출하기 전마다 mapreduce가 자동으로 실행합니다.

  • intermKVStore는 map 함수가 키-값 쌍을 추가해야 하는 중간 KeyValueStore 객체의 이름입니다. map 함수를 호출해도 intermKVStore에 키-값 쌍이 전혀 추가되지 않으면 mapreduce는 reduce 함수를 호출하지 않으며, 출력 데이터저장소는 비어 있게 됩니다.

map 함수의 템플릿 예는 다음과 같습니다.

function myMapper(data, info, intermKVStore)
%do a calculation with the data block
add(intermKVStore, key, value)
end

예: @myMapper

데이터형: function_handle

reduce 함수에 대한 함수 핸들입니다. mapreduce는 map 함수에 의해 중간 KeyValueStore에 추가되는 각 고유 키에 대해 한 번씩 reducefun을 호출합니다. 호출할 때마다 mapreduce는 활성 키에 대한 값을 reducefunValueIterator 객체로 전달합니다. reducefun 함수는 hasnext 함수와 getnext 함수를 사용하여 루프를 돌며 각 키에 값을 적용합니다. 그런 다음, 일부 연산을 수행한 후 키-값 쌍을 최종 출력값에 씁니다.

reduce 함수에 대한 입력값은 intermKey, intermValIter, outKVStore입니다. 이러한 입력값은 mapreduce가 자동으로 생성한 후 reduce 함수로 전달합니다.

  • intermKey는 중간 KeyValueStore 객체의 활성 키입니다. mapreduce가 reduce 함수를 호출할 때마다 중간 KeyValueStore 객체의 키 중에서 새로운 고유 키가 지정됩니다.

  • intermValIter는 활성 키 intermKey에 대한 ValueIterator입니다. 이 ValueIterator 객체는 활성 키에 대한 모든 값을 포함합니다. hasnext 함수와 getnext 함수를 사용하여 값을 스크롤합니다.

  • outKVStore는 reduce 함수가 키-값 쌍을 추가해야 하는 최종 KeyValueStore 객체의 이름입니다. mapreduceoutKVStore에서 출력 키-값 쌍을 가져온 다음 출력 데이터저장소 outds(기본적으로 KeyValueDatastore 객체)에 반환합니다. reduce 함수를 호출해도 outKVStore에 최종 키-값 쌍이 추가되지 않으면 출력 데이터저장소는 비어 있게 됩니다.

reduce 함수의 템플릿 예는 다음과 같습니다.

function myReducer(intermKey, intermValIter, outKVStore)
while hasnext(intermValIter)
    X = getnext(intermValIter);
    %do a calculation with the current value, X
end
add(outKVStore, key, value)
end

예: @myReducer

데이터형: function_handle

실행 환경으로, MapReducer 객체로 지정됩니다. mrmapreducer 함수를 호출한 결과입니다. 디폴트 mr 인수는 gcmr 호출입니다. 이 호출에서는 mapreduce의 디폴트 전역 실행 환경을 사용합니다. MATLAB에서 디폴트는 SerialMapReducer 객체를 반환하는 mapreducer(0)입니다.

참고

이 설정은 mapreduce의 실행 환경을 지정하며, 로컬 컴퓨터에서 mapreduce를 실행하는 데는 필요하지 않습니다. 자세한 내용은 Speed Up and Deploy MapReduce Using Other Products 항목을 참조하십시오.

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: outds = mapreduce(ds, @mapfun, @reducefun, 'Display', 'off', 'OutputFolder', 'C:\Users\username\Desktop')

데이터저장소 출력값 유형으로, 'Binary' 또는 'TabularText'로 지정됩니다. 디폴트 설정인 'Binary'KeyValueDatastore 출력 데이터저장소를 반환합니다. 이 데이터저장소는 출력 폴더에 있는 이진(.mat 또는 .seq) 파일을 가리킵니다. 'TabularText' 옵션은 tabularTextDatastore 출력 데이터저장소를 반환합니다. 이 데이터저장소는 출력 폴더에 있는 .txt 파일을 가리킵니다.

다음 표에는 각 출력 유형에 대한 세부 정보가 나와 있습니다.

'OutputType'데이터저장소 출력값 유형데이터저장소가 가리키는 파일 형식reduce 함수가 추가할 수 있는 값reduce 함수가 추가할 수 있는 키세부 정보
'Binary'(디폴트 값)KeyValueDatastore.mat(또는 Hadoop®에 대해 실행할 경우 .seq).임의의 유효한 MATLAB 객체.문자형 벡터, string형, 또는 NaN, 복소수형, 논리형, 희소 형식이 아닌 숫자형 스칼라.N/A
'TabularText'TabularTextDatastore.txt문자형 벡터, string형, 또는 NaN, 복소수형, 논리형, 희소 형식이 아닌 숫자형 스칼라.문자형 벡터, string형, 또는 NaN, 복소수형, 논리형, 희소 형식이 아닌 숫자형 스칼라.
  • 파일이 UTF-8로 인코딩됩니다.

  • 키와 값이 탭(\t)으로 구분되어 있습니다.

  • 행 구분 기호는 Windows®의 경우 \r\n이고, Linux®Mac의 경우 \n입니다.

데이터형: char | string

mapreduce 출력값의 대상 폴더로, 파일 경로로 지정됩니다. 디폴트 출력 폴더는 현재 폴더 pwd입니다. 정규화된 경로 또는 현재 폴더에 대한 상대 경로를 사용하여 다른 경로를 지정할 수 있습니다.

예: mapreduce(..., 'OutputFolder', 'MyOutputFolder\Results')는 출력값으로, 현재 폴더에 대한 상대 파일 경로를 지정합니다.

데이터형: char | string

명령줄에 진행률을 출력할지 여부로, 'on' 또는 'off'로 지정됩니다. 디폴트는 'on'입니다. 이 경우 mapreduce는 실행 과정의 map 단계와 reduce 단계 동안 명령 창에 진행률 정보를 표시합니다.

데이터형: char | string

출력 인수

모두 축소

출력 데이터저장소로, KeyValueDatastore 객체나 TabularTextDatastore 객체로 반환됩니다. 기본적으로 outds는 현재 폴더에 있는 .mat 파일을 가리키는 KeyValueDatastore 객체입니다. tabularTextDatastore 객체를 반환하거나 출력 파일의 위치를 변경하기 위해 'OutputType'이나 'OutputFolder'에 대해 Name,Value 쌍으로 인수를 지정할 수 있습니다.

mapreduceoutds의 키-값 쌍을 정렬하지 않습니다. mapreduce가 있는 다른 제품을 사용할 경우 이 순서가 다를 수도 있습니다.

outds의 내용을 보려면 datastorepreview, read, readall 함수 중 하나를 사용하십시오.

  • mapreduce 알고리즘을 디버그하여 키-값 쌍이 여러 단계를 진행하는 방법을 검토하면 항상 도움이 될 수 있습니다. 데이터 이동을 검토하려면 map 함수와 reduce 함수에 중단점을 설정하십시오. 중단점은 mapreduce 실행을 중지하므로, KeyValueStoreValueIterator 같은 관련 변수의 현재 상태를 검토할 수 있습니다. 자세한 내용은 Debug MapReduce Algorithms 항목을 참조하십시오.

  • 모든 플랫폼에서 mapreduce 성능을 최적화하기 위한 몇 가지 권장 사항은 다음과 같습니다.

    • map 함수의 호출 횟수를 최소화합니다. 가장 쉬운 방법은 입력 데이터저장소의 ReadSize 속성값을 늘리는 것입니다. 결과적으로, mapreduce가 더 큰 데이터 블록을 map 함수에 전달하게 되어, 데이터저장소가 읽기 횟수를 감소시켜 사용률을 낮춥니다.

    • map 함수와 reduce 함수 간에 전송되는 중간 데이터의 크기를 줄입니다. 한 가지 방법은 map 함수 내에 unique를 사용하여 유사한 키를 결합하는 것입니다. 이 기법에 대한 예제를 보려면 Compute Mean by Group Using MapReduce 항목을 참조하십시오.

확장 기능

버전 내역

R2014b에 개발됨