YARN මත Spark වින්‍යාස කිරීම

හබ්ර්, ආයුබෝවන්! ඊයේ දිනයේ Apache Spark සඳහා කැප වූ රැස්වීම, Rambler&Co හි යාලුවන්ගෙන්, මෙම මෙවලම වින්‍යාස කිරීම සම්බන්ධව සහභාගිවන්නන්ගෙන් ප්‍රශ්න රාශියක් තිබුණි. අපි ඔහුගේ අඩිපාරේ යමින් අපගේ අත්දැකීම් බෙදා ගැනීමට තීරණය කළෙමු. මාතෘකාව පහසු නැත - එබැවින් අදහස් දැක්වීමේදී ඔබේ අත්දැකීම් බෙදා ගැනීමට අපි ඔබට ආරාධනා කරන්නෙමු, සමහර විට අපි වැරදි දෙයක් තේරුම් ගෙන භාවිතා කරන්නෙමු.

අපි Spark භාවිතා කරන ආකාරය ගැන කුඩා හැඳින්වීමක්. අපිට මාස තුනක වැඩසටහනක් තියෙනවා "විශාල දත්ත විශේෂඥ", සහ දෙවන මොඩියුලය පුරාම අපගේ සහභාගිවන්නන් මෙම උපකරණය මත වැඩ කරයි. ඒ අනුව, සංවිධායකයින් ලෙස අපගේ කාර්යය වන්නේ එවැනි අවස්ථාවක් තුළ භාවිතය සඳහා පොකුර සකස් කිරීමයි.

අපගේ භාවිතයේ විශේෂත්වය නම් Spark හි එකවර වැඩ කරන පුද්ගලයින් සංඛ්‍යාව සමස්ත කණ්ඩායමට සමාන විය හැකි වීමයි. නිදසුනක් වශයෙන්, සම්මන්ත්‍රණයකදී, සෑම කෙනෙකුම එකම වේලාවක යමක් උත්සාහ කර අපගේ ගුරුවරයාට පසුව නැවත නැවත කරන විට. මෙය බොහෝ නොවේ - සමහර විට පුද්ගලයන් 40 දක්වා. එවැනි භාවිත නඩුවකට මුහුණ දෙන බොහෝ සමාගම් ලෝකයේ නැති තරම්ය.

මීලඟට, අපි සමහර වින්‍යාස පරාමිතීන් තෝරා ගත්තේ කෙසේද සහ ඇයි දැයි මම ඔබට කියමි.

අපි මුල සිටම පටන් ගනිමු. Spark හට පොකුරක් මත ධාවනය කිරීමට විකල්ප 3ක් ඇත: ස්වාධීන, Mesos භාවිතා කිරීම සහ YARN භාවිතා කිරීම. අපි තුන්වන විකල්පය තෝරා ගැනීමට තීරණය කළේ එය අපට අර්ථවත් වූ බැවිනි. අපට දැනටමත් හදූප් පොකුරක් ඇත. අපගේ සහභාගිවන්නන් දැනටමත් එහි ගෘහ නිර්මාණ ශිල්පය හොඳින් හඳුනති. අපි YARN භාවිතා කරමු.

spark.master=yarn

තවත් රසවත්. මෙම යෙදවුම් විකල්ප 3න් එක් එක් යෙදවුම් විකල්ප 2ක් ඇත: සේවාලාභියා සහ පොකුරු. පදනම් වී ඇත ලියකියවිලි සහ අන්තර්ජාලයේ විවිධ සබැඳි, සේවාදායකයා අන්තර්ක්‍රියාකාරී වැඩ සඳහා සුදුසු බව අපට නිගමනය කළ හැකිය - නිදසුනක් ලෙස, ජුපිටර් නෝට්බුක් හරහා, සහ නිෂ්පාදන විසඳුම් සඳහා පොකුරු වඩාත් සුදුසු ය. අපගේ නඩුවේදී, අපි අන්තර්ක්‍රියාකාරී වැඩ ගැන උනන්දු වෙමු, එබැවින්:

spark.deploy-mode=client

පොදුවේ ගත් කල, මෙතැන් සිට Spark කෙසේ හෝ YARN මත වැඩ කරනු ඇත, නමුත් මෙය අපට ප්රමාණවත් නොවීය. විශාල දත්ත පිළිබඳ වැඩසටහනක් අප සතුව ඇති බැවින්, සම්පත් ඒකාකාරව කැපීමක රාමුව තුළ ලබා ගත් දේ සමහර විට සහභාගිවන්නන්ට ප්‍රමාණවත් නොවීය. ඊට පස්සේ අපි රසවත් දෙයක් සොයාගත්තා - ගතික සම්පත් වෙන් කිරීම. කෙටියෙන් කිවහොත්, කාරණය මෙයයි: ඔබට දුෂ්කර කාර්යයක් තිබේ නම් සහ පොකුර නොමිලේ (උදාහරණයක් ලෙස, උදෑසන), මෙම විකල්පය භාවිතා කිරීමෙන් Spark ඔබට අමතර සම්පත් ලබා දිය හැකිය. කපටි සූත්‍රයකට අනුව එහි අවශ්‍යතාවය ගණනය කෙරේ. අපි විස්තර වෙත නොයන්නෙමු - එය හොඳින් ක්රියා කරයි.

spark.dynamicAllocation.enabled=true

අපි මෙම පරාමිතිය සැකසූ අතර, ආරම්භයේදී Spark කඩා වැටුණු අතර එය ආරම්භ නොවීය. ඒක හරි, මොකද මට ඒක කියවන්න සිද්ධ වුණා ලේඛනගත කිරීම වඩාත් ප්රවේශමෙන්. සෑම දෙයක්ම නිවැරදි වීමට නම්, ඔබ අතිරේක පරාමිතියක් සක්රිය කළ යුතු බව එහි සඳහන් වේ.

spark.shuffle.service.enabled=true

එය අවශ්ය වන්නේ ඇයි? අපගේ රැකියාවට තවදුරටත් බොහෝ සම්පත් අවශ්‍ය නොවන විට, Spark ඒවා නැවත පොදු සංචිතයට ගෙන යා යුතුය. ඕනෑම MapReduce කාර්යයක පාහේ වඩාත්ම කාලය ගතවන අදියර වන්නේ Shuffle අදියරයි. මෙම පරාමිතිය මෙම අදියරේදී ජනනය වන දත්ත සුරැකීමට සහ ඒ අනුව ක්‍රියාත්මක කරන්නන් මුදා හැරීමට ඔබට ඉඩ සලසයි. තවද ක්‍රියාත්මක කරන්නා යනු සේවකයා මත ඇති සියල්ල ගණනය කරන ක්‍රියාවලියයි. එහි නිශ්චිත ප්‍රොසෙසර් කෝර් සංඛ්‍යාවක් සහ නිශ්චිත මතක ප්‍රමාණයක් ඇත.

මෙම පරාමිතිය එකතු කර ඇත. සෑම දෙයක්ම වැඩ කරන බවක් පෙනෙන්නට තිබුණි. සහභාගිවන්නන්ට අවශ්‍ය වූ විට වැඩි සම්පත් ලබා දී ඇති බව සැලකිය යුතු විය. නමුත් තවත් ගැටළුවක් මතු විය - යම් අවස්ථාවක දී අනෙකුත් සහභාගිවන්නන් අවදි වූ අතර Spark භාවිතා කිරීමටද අවශ්‍ය විය, නමුත් සෑම දෙයක්ම එහි කාර්යබහුල වූ අතර ඔවුන් අසතුටින් සිටියහ. ඒවා තේරුම් ගත හැකිය. අපි ලේඛන බලන්න පටන් ගත්තා. ක්රියාවලියට බලපෑම් කිරීමට භාවිතා කළ හැකි වෙනත් පරාමිතීන් ගණනාවක් ඇති බව පෙනී ගියේය. උදාහරණයක් ලෙස, ක්‍රියාත්මක කරන්නා ස්ටෑන්ඩ්බයි මාදිලියේ සිටී නම්, එයින් සම්පත් ලබා ගත හැක්කේ කුමන වේලාවකට පසුවද?

spark.dynamicAllocation.executorIdleTimeout=120s

අපගේ නඩුවේදී, ඔබේ ක්‍රියාත්මක කරන්නන් මිනිත්තු දෙකක් සඳහා කිසිවක් නොකරන්නේ නම්, කරුණාකර ඔවුන් පොදු සංචිතයට ආපසු යන්න. නමුත් මෙම පරාමිතිය සෑම විටම ප්රමාණවත් නොවීය. පුද්ගලයා දිගු කලක් කිසිවක් නොකළ බවත්, සම්පත් නිදහස් නොකරන බවත් පැහැදිලිය. විශේෂ පරාමිතියක් ද ඇති බව පෙනී ගියේය - හැඹිලිගත දත්ත අඩංගු ක්‍රියාත්මක කරන්නන් තෝරා ගැනීමට කුමන වේලාවට පසුවද යන්න. පෙරනිමියෙන්, මෙම පරාමිතිය අනන්තය විය! අපි එය නිවැරදි කළා.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

එනම්, ඔබේ විධායකයින් විනාඩි 5 ක් සඳහා කිසිවක් නොකරන්නේ නම්, ඒවා පොදු සංචිතයට ලබා දෙන්න. මෙම මාදිලියේදී, පරිශීලකයින් විශාල සංඛ්‍යාවක් සඳහා සම්පත් මුදා හැරීමේ සහ නිකුත් කිරීමේ වේගය යහපත් වී ඇත. අසහනයේ ප්‍රමාණය අඩු වී ඇත. නමුත් අපි තවත් ඉදිරියට ගොස් එක් යෙදුමකට උපරිම ක්‍රියාත්මක කරන්නන් සංඛ්‍යාව සීමා කිරීමට තීරණය කළෙමු - අත්‍යවශ්‍යයෙන්ම වැඩසටහන් සහභාගිවන්නෙකුට.

spark.dynamicAllocation.maxExecutors=19

දැන්, ඇත්ත වශයෙන්ම, අනෙක් පැත්තේ අතෘප්තිමත් අය සිටිති - "පොකුර නිෂ්ක්‍රීයයි, මට සිටින්නේ ක්‍රියාත්මක කරන්නන් 19 ක් පමණි", නමුත් ඔබට කුමක් කළ හැකිද? අපට යම් ආකාරයක නිවැරදි ශේෂයක් අවශ්‍ය වේ. හැමෝවම සතුටු කරන්න බෑ.

අපගේ නඩුවේ විශේෂතා හා සම්බන්ධ තවත් කුඩා කතාවක්. කොහොම හරි ප්‍රායෝගික පාඩමකට කීප දෙනෙක් පරක්කු වුනා, මොකක් හරි හේතුවකට එයාලට Spark එක පටන් ගත්තෙ නෑ. අපි නිදහස් සම්පත් ප්‍රමාණය දෙස බැලුවෙමු - එය එහි ඇති බව පෙනේ. Spark ආරම්භ විය යුතුය. වාසනාවකට මෙන්, ඒ වන විට ලියකියවිලි කොහේ හරි subcortex වෙත එකතු කර ඇති අතර, අපට මතකයි දියත් කරන විට, Spark ආරම්භ කිරීමට වරායක් සොයන බව. පරාසයේ පළමු වරාය කාර්යබහුල නම්, එය අනුපිළිවෙලින් ඊළඟ එකට ගමන් කරයි. එය නිදහස් නම්, එය අල්ලා ගනී. තවද මේ සඳහා උපරිම උත්සාහයන් ගණන පෙන්නුම් කරන පරාමිතියක් ඇත. පෙරනිමිය 16. පන්තියේ සිටින අපේ කණ්ඩායමේ සිටින පිරිසට වඩා සංඛ්‍යාව අඩුය. ඒ අනුව, උත්සාහයන් 16 කට පසු, ස්පාර්ක් අත්හැර දමා මට ආරම්භ කළ නොහැකි බව පැවසීය. අපි මෙම සැකසුම නිවැරදි කර ඇත.

spark.port.maxRetries=50

අපගේ නඩුවේ විශේෂතා සමඟ එතරම් සම්බන්ධ නොවන සමහර සැකසුම් ගැන මම ඊළඟට ඔබට කියමි.

Spark වේගයෙන් ආරම්භ කිරීමට, SPARK_HOME මුල් පිටුවේ ඇති භාජන ෆෝල්ඩරය සංරක්ෂණය කර HDFS මත තැබීම නිර්දේශ කෙරේ. එවිට ඔහු මේ ජර්නික් කම්කරුවන් ලවා පටවා කාලය නාස්ති නොකරනු ඇත.

spark.yarn.archive=hdfs:///tmp/spark-archive.zip

වේගවත් ක්‍රියාකාරිත්වය සඳහා ක්‍රියෝ අනුක්‍රමික ලෙස භාවිතා කිරීම ද නිර්දේශ කෙරේ. එය පෙරනිමියට වඩා ප්‍රශස්ත වේ.

spark.serializer=org.apache.spark.serializer.KryoSerializer

ඒවගේම Spark එකේ දීර්ඝකාලීන ගැටලුවක් තියෙනවා, ඒක නිතරම මතකයෙන් කඩා වැටෙනවා. බොහෝ විට මෙය සිදු වන්නේ කම්කරුවන් සියල්ල ගණනය කර රියදුරුට ප්රතිඵලය යවා ඇති මොහොතේය. අපි මෙම පරාමිතිය අපටම විශාල කර ගත්තෙමු. පෙරනිමියෙන්, එය 1GB, අපි එය 3 බවට පත් කළෙමු.

spark.driver.maxResultSize=3072

අවසාන වශයෙන්, අතුරුපසක් ලෙස. HortonWorks බෙදාහැරීම මත ස්පාර්ක් 2.1 අනුවාදයට යාවත්කාලීන කරන්නේ කෙසේද - HDP 2.5.3.0. HDP හි මෙම අනුවාදයේ පෙර-ස්ථාපිත අනුවාදය 2.0 අඩංගු වේ, නමුත් Spark තරමක් ක්‍රියාකාරීව සංවර්ධනය වෙමින් පවතින බව අප විසින්ම තීරණය කළ අතර, සෑම නව අනුවාදයකම python API ඇතුළුව අමතර විශේෂාංග කිහිපයක් නිරාකරණය කර අමතර විශේෂාංග සපයයි, එබැවින් අපි තීරණය කළෙමු , අවශ්‍ය දේ යාවත්කාලීන කිරීමකි.

Hadoop 2.7 සඳහා නිල වෙබ් අඩවියෙන් අනුවාදය බාගත කර ඇත. ඒක unzip කරලා HDP folder එකට දැම්මා. අපි අවශ්‍ය පරිදි symlinks ස්ථාපනය කළෙමු. අපි එය දියත් කරමු - එය ආරම්භ නොවේ. හරිම අමුතු වැරැද්දක් ලියනවා.

java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig

ගූගල් කර බැලීමෙන් පසුව, Hadoop ඉපදෙන තුරු රැඳී නොසිටින්නට ස්පාර්ක් තීරණය කළ බවත්, ජර්සියේ නව අනුවාදය භාවිතා කිරීමට තීරණය කළ බවත් අපට දැනගන්නට ලැබුණි. JIRA හි මෙම මාතෘකාව ගැන ඔවුන්ම එකිනෙකා සමඟ තර්ක කරති. විසඳුම වූයේ බාගත කිරීමයි ජර්සි අනුවාදය 1.17.1. මෙය SPARK_HOME හි ඇති භාජන ෆෝල්ඩරය තුළ තබා, එය නැවත zip කර HDFS වෙත උඩුගත කරන්න.

අපි මෙම දෝෂය මඟ හැරිය නමුත් නව හා තරමක් විධිමත් එකක් මතු විය.

org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master

ඒ සමඟම, අපි 2.0 අනුවාදය ධාවනය කිරීමට උත්සාහ කරමු - සියල්ල හරි. සිදුවන්නේ කුමක්දැයි අනුමාන කිරීමට උත්සාහ කරන්න. අපි මෙම යෙදුමේ ලඝු-සටහන් දෙස බැලූ අතර මෙවැනි දෙයක් දුටුවෙමු:

/usr/hdp/${hdp.version}/hadoop/lib/hadoop-lzo-0.6.0.${hdp.version}.jar

සාමාන්යයෙන්, යම් හේතුවක් නිසා hdp. අනුවාදය විසඳා නැත. ගූගල් කර බැලීමෙන් පසුව, අපි විසඳුමක් සොයාගත්තා. ඔබ අම්බාරි හි ඇති YARN සැකසුම් වෙත ගොස් එහි අභිරුචි නූල්-අඩවියට පරාමිතියක් එක් කළ යුතුය:

hdp.version=2.5.3.0-37

මෙම මැජික් උදව් වූ අතර, Spark පිටත් විය. අපි අපේ ජුපයිටර් ලැප්ටොප් කිහිපයක් පරීක්ෂා කළා. හැම දෙයක්ම වැඩ කරනවා. අපි සෙනසුරාදා (හෙට) පළමු Spark පාඩම සඳහා සූදානම්!

DUP. පාඩම අතරතුර තවත් ගැටළුවක් මතු විය. යම් අවස්ථාවක දී, YARN Spark සඳහා බහාලුම් සැපයීම නතර කළේය. YARN හි පරාමිතිය නිවැරදි කිරීමට අවශ්‍ය වූ අතර එය පෙරනිමියෙන් 0.2 විය:

yarn.scheduler.capacity.maximum-am-resource-percent=0.8

එනම්, සම්පත් බෙදා හැරීමට සහභාගී වූයේ සම්පත් වලින් 20% ක් පමණි. පරාමිතීන් වෙනස් කිරීමෙන් පසුව, අපි YARN නැවත පූරණය කළෙමු. ගැටලුව නිරාකරණය වූ අතර අනෙකුත් සහභාගිවන්නන්ට ද පුළිඟු සන්දර්භය ධාවනය කිරීමට හැකි විය.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න