Back to site

MapReduce

Гэты дакумент дае невялікі прыклад таго, як выкарыстоўваць ажыццяўлення MapReduce апісана ў [1], з дапамогай простага прыкладу. Напрыклад даступны як архіў тут , Абноўлена 31 ліпеня 2010 года. Звярніце ўвагу, што файл MapReduceScheduler.c некалькі адрозніваецца ад версіі, выпушчанай арыгінальных аўтараў. Версія ў архіве быў зменены, каб скампіляваць чыста з GCC 4.0.2. Файлаў, якія таксама даступныя ў падсветленыя HTML тут (рэалізацыя MapReduce не адлюстроўваецца, і Fatals .* з'яўляюцца апушчаныя). Гэты дакумент прадугледжвае, чытач сочыць ўздоўж выкарыстаннем падсветленыя Makefile і main.c.

Звярніце ўвагу:

Абноўлена 31 ліпеня 2010 г.: Так як гэты падручнік набыў некаторую папулярнасць для не-Вісконсін карыстальнікаў, я змяніў файлы ў архіў, каб пабудаваць па змаўчанні x86/Linux замест SPARC / Solaris. Я таксама выдаленыя аддаленага стварэння каманд з Makefile, як тыя былі даволі Вісконсін-канкрэтныя. Некаторыя з лініі колькасць, названае ў прозе ніжэй можа быць няправільным, і падсветленыя HTML адрозніваецца ад крыніцы ў архіў.

Перасцярогу: рэалізацыя MapReduce, здаецца, зламацца, калі, калі вельмі вялікая колькасць ключоў выпускаюць (напрыклад, 2000000000 +). FYI.

Распакоўка архіва

Пераключыць на каталог, у якім вы хацелі б, каб распакаваць файлы, і выкарыстоўваць bzcat і смалы для распакоўкі файлаў:

farfo(1)% cd ~/
farfo(2)% mkdir mapreduce_example
farfo(3)% cd mapreduce_example
farfo(4)% cp $DOWNLOADS/mapreduce.tar.gz .
farfo(5)% gzcat mapreduce.tar.gz | tar -xf -
farfo(6)% ls
fatals.cpp main.C MapReduceScheduler.c mapreduce.tar.gz
fatals.h Makefile MapReduceScheduler.h

MapReduce мадэлі праграмавання

Крайні [1] непасрэдна:

Мадэль праграмавання MapReduce натхнёны функцыянальных моў і задачы дадзеных інтэнсіўных вылічэнняў. Фармат ўваходных дадзеных ад дадатку, і задаецца карыстальнікам. Выхад мноства <key,value> пар. Карыстальнік выказвае алгарытм з дапамогай двух функцый, карта і скарачэнні. Функцыя Карта ўжываецца на ўваходных дадзеных і выдае спіс прамежкавых пар <key,value>. Функцыя скарачэння ўжываецца для ўсіх прамежкавых пар з тым жа ключом. Ён звычайна выконвае нейкія аперацыі аб'яднання і вырабляе нуль або больш пар выхад. Нарэшце, выхад пары сартуюцца па ключы. У найпростым выглядзе праграм MapReduce, праграміст падае толькі карта функцыі. Усе астатнія функцыі, уключаючы групоўку прамежкавых пар, якія маюць той жа ключ і канчатковай сартавання, ажыццяўляецца выканання.

Аўтары выпусцілі іх рэалізацыі, якая пастаўляецца разам з парай прыкладаў. Вы можаце знайсці аўтараў сайта тут . Чытайце на трывіяльныя дамарослых прыклад.

Падводзячы Array з MapReduce

Векавая праблема: пры масіў лікаў, знайсці іх суму. Варта прызнаць, што праблема не жудасна цікава, але ўсё яшчэ можа скарыстацца паралелізму, пры ўмове, масіў досыць вялікі. Выконвайце разам з main.c .

Стратэгія: Спліт масіву на сегменты, хай тэмы сума кожнага сегмента. Тады, сума прамежкавых сум для атрымання канчатковай сумы.

Карта Функцыя

Функцыя карта ў прыкладзе, несапраўднымі sumarray_map (map_args_t аргументы *) , (радок 26) вызначае прамежкавыя сумы падмноства вялікі масіў, завецца miniArray. Затым ён выпраменьвае гэтую суму, адзначаных пастаянным ключ (1 ў прыкладзе). Звярніце ўвагу, што sumarray_map () вызначае даўжыню і размяшчэнне яго ўваход непасрэдна з map_args_t структуры, перададзеныя яму. Выканання MapReduce адказвае за расшчапленне масіў, які вызначае даўжыню кожнага фрагмента, і заклікаючы sumarray_map () адпаведнае колькасць разоў і з правільнымі аргументамі.

Розных структур дадзеных, якія выкарыстоўваюцца ў MapReduce можа быць знойдзены ў MapReduceScheduler.h .

Калі б мы былі inclinded зрабіць гэта, мы маглі б выкарыстоўваць нашы ўласныя parition дадзеныя стратэгіі шляхам вызначэння падзельніка функцыі. Змаўчанні сплітар, які проста разбівае масіў на сегменты, дастаткова для гэтага прыкладу.

Функцыя скарачэння

Функцыя скарачэння ( несапраўднымі sumarray_reduce (* key_in несапраўдным, несапраўдным ** vals_in, Int vals_len) ) ажыццяўляецца пасля выканання ўсіх выклікаў Карта завяршылі. sumarray_reduce () сумуе ўсе прамежкавыя значэння (з ключавымі = 1) і выпраменьвае канчатковы вынік. У цэлым, скарачэнне будзе выклікацца адзін раз для кожнага унікальнага значэння ключа выпусканых карту этапе паралельна. З нашай карце толькі выпускае адзін унікальны ключ, толькі адно скарачэнне выклікаецца.

Калі б мы былі схільныя зрабіць гэта, мы маглі б паказана, як прызначыць паменшыць задачы паміж даступнымі рабочымі патокамі шляхам вызначэння сумы. Па змаўчанні, наш MapReduce сераду выканання хэш-ключоў для выканання паменшыць прызначэння. Любая саступка з'яўляецца прымальнай ў нашым выпадку, паколькі ў нас ёсць толькі адзін паменшыць выклік у любым выпадку.

Ключавыя функцыі параўнання

Функцыя MapReduce сіл карыстачу вызначаць ключавыя функцыі comaparison, некалькі аналагічных C + + S магчымасць пераазначэння аператараў параўнання. Так як нашы ключы толькі poitners да цэлых лікаў, нашы ключавыя функцыі параўнання (( Int intcmp (сопзЬ несапраўднымі * v1, сопзЬ несапраўднымі * v2) ) просты. Ключавыя параўнання выкарыстоўваецца для сартавання канчатковага выпусканых выхады паменшыць да вяртання спіс выніку ключы.

Настройка Runtime

Для фактычнага запуску MapReduce, мы спачатку разабраць нашы аргументы (радкі 74-105 ў асноўны () ), то мы стварылі scheduler_args_t на лініі 106-164 . У прыватнасці, вызначыць набор дадзеных, прадастаўляюць спасылкі на карты, скарачэнне і ключавыя функцыі параўнання, паказаць сплітар па змаўчанні і падзел функцый (гл. [1]), і забяспечыць паказальнік туды, дзе мы будзем захоўваць вынік сумы.

Мы таксама прапануем некаторыя парады для выканання, каб магчыма больш хуткага выканання: памер аднаго элемента, L1-D памер кэша і г.д. выканання будзе прымаць гэтыя намёкі пад увагу пры paritioning дадзеныя для карты пінг, і для іншых дадзеных і кантроль размеркавання.

Запуск MapReduce і Схапіўшы Вынік

Каб сапраўды спасылацца нашы MapReduce алгарытм, мы называем map_reduce_scheduler () . Так як мы ўжо пісалі карту і скарачэння функцый, мы ведаем, што там будзе толькі адзін выпраменьваны <key,value> пара, і што значэнне будзе ўтрымліваць масіў сумы.

[1] 'S табліцах 1 і 2 карысныя спасылкі па наладзе асяроддзя.

Будаўніцтва Алгарытм

Каб спрасціць працэс распрацоўкі, мы будзем пісаць наш код у АФН і на машыне, якая падтрымлівае шмат карысных магчымасцяў, такіх як X-аконных прыкладанняў. Разумны Makefile дазволіць нам на самой справе будаваць на нашым Solaris аснове нд T2000, Кьянти. Для ўключэння аддаленага стварэння, капіявання і remoteMake.tcsh remoteMake.tcsh з архіва ў свой ??хатні каталог на Кьянти, стварыць RSA Authenticaion (кіраўніцтва даступна тут ), і змяняць мясцовых Makefile , каб адлюстраваць ваша імя карыстальніка і незалежна ад структуры каталогаў вы аддаеце перавагу . Rsync ўтыліта будзе клапаціцца аб захаванні мясцовых і аддаленых каталогаў сінхранізаваныя.

Вы хочаце, каб каталогі на Кьянти суразьмерна з Makefile налады перад запускам зрабіць.

farfo(7)% make

Syncing Remote Directory...
rsync -av . joeuser@chianti:afs_sync/mapreduce_trivial
building file list ... done

sent 235 bytes received 20 bytes 170.00 bytes/sec
total size is 63002 speedup is 247.07

Initiating Remote Build...
ssh chianti ./remoteMake.tcsh afs_sync/mapreduce_trivial

Making .generated/ path for object files...
mkdir .generated

Making bin/ path for binaries...
mkdir bin

*Compiling fatals.cpp...
g++ -c -O3 fatals.cpp -o .generated/fatals.o

*Compiling MapReduceScheduler.c...
g++ -c -O3 -D_SOLARIS_ MapReduceScheduler.c -o .generated/MapReduceScheduler.o
MapReduceScheduler.c:144: warning: non-local variable ' g_state' uses anonymous type

*Compiling main.C...
g++ -c -O3 main.C -o .generated/main.o

***Making binary sumArray...
g++ -lm -lpthread -lrt -lcpc .generated/fatals.o .generated/MapReduceScheduler.o .generated/main.o -o bin/sumArray

My work here is done.

Запуск Алгарытм

Гэтак жа, як мы зрабілі з будынка, мы можам запусціць алгарытм выдалена, а таксама, праз run.tcsh сцэнар. Змяніць яго ў адпаведнасці з наладамі Makefile і запусціць скрыпт, праходзячы адзін аргумент (памер масіва).

farfo(8)% ./run.tcsh 100
MapReduce Sum: 4950
True Sum: 4950
MapReduce Time: 53669080
Linear Scan Time: 612
Speedup: 1.14032e-05x

Правільны вынік.

Проста для задавальнення, паэксперыментуйце з памерам масіва і паглядзець, колькі паскарэнне нашай цацкі праграма можа атрымаць. Мы не робім шмат памылак, таму вельмі вялікіх масіваў абрынецца. Раскомментируйте друку і заўважылі, што час выканання выбірае для выканання аднаго струменя, калі памер масіва мала.

Спіс літаратуры

[1] Ranger, Raghuraman, Penmetsa, Bradski, і Kozyrakis. Ацэнка MapReduce для шмат'ядравых і шматпрацэсарных сістэм. У HPCA 2007 года.Popular Links

Published (Last edited): Apr 6 , source: http://pages.cs.wisc.edu/~gibson/mapReduceTutorial.html