Гэты дакумент дае невялікі прыклад таго, як выкарыстоўваць ажыццяўлення 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.
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
Крайні [1] непасрэдна:
Аўтары выпусцілі іх рэалізацыі, якая пастаўляецца разам з парай прыкладаў. Вы можаце знайсці аўтараў сайта тут . Чытайце на трывіяльныя дамарослых прыклад.
Векавая праблема: пры масіў лікаў, знайсці іх суму. Варта прызнаць, што праблема не жудасна цікава, але ўсё яшчэ можа скарыстацца паралелізму, пры ўмове, масіў досыць вялікі. Выконвайце разам з 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) ) просты. Ключавыя параўнання выкарыстоўваецца для сартавання канчатковага выпусканых выхады паменшыць да вяртання спіс выніку ключы.
Для фактычнага запуску MapReduce, мы спачатку разабраць нашы аргументы (радкі 74-105 ў асноўны () ), то мы стварылі scheduler_args_t на лініі 106-164 . У прыватнасці, вызначыць набор дадзеных, прадастаўляюць спасылкі на карты, скарачэнне і ключавыя функцыі параўнання, паказаць сплітар па змаўчанні і падзел функцый (гл. [1]), і забяспечыць паказальнік туды, дзе мы будзем захоўваць вынік сумы.
Мы таксама прапануем некаторыя парады для выканання, каб магчыма больш хуткага выканання: памер аднаго элемента, L1-D памер кэша і г.д. выканання будзе прымаць гэтыя намёкі пад увагу пры paritioning дадзеныя для карты пінг, і для іншых дадзеных і кантроль размеркавання.
Каб сапраўды спасылацца нашы 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 '
*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