क्लासपाथ:
आप जो प्रदान करते हैं, उसके आधार पर क्लासपैथ प्रभावित होता है। क्लासपैथ पर कुछ सेट करने के कुछ तरीके हैं:
spark.driver.extraClassPath
या यह --driver-class-path
ड्राइवर को चलाने वाले नोड पर अतिरिक्त क्लासपैथ सेट करने के लिए उर्फ है।
spark.executor.extraClassPath
कार्यकर्ता नोड पर अतिरिक्त वर्ग पथ सेट करने के लिए।
यदि आप चाहते हैं कि एक निश्चित JAR मास्टर और कार्यकर्ता दोनों पर प्रभाव डाले, तो आपको इन्हें अलग-अलग BOTH झंडों में निर्दिष्ट करना होगा।
पृथक्करण वर्ण:
जेवीएम के समान नियमों का पालन :
- लिनक्स: एक बृहदान्त्र
:
- उदाहरण के लिए:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- विंडोज: एक अर्धविराम
;
- उदाहरण के लिए:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
फ़ाइल वितरण:
यह उस मोड पर निर्भर करता है, जिसके तहत आप अपना काम चला रहे हैं:
क्लाइंट मोड - स्पार्क एक नेट्टी HTTP सर्वर को फायर करता है जो कि प्रत्येक कार्यकर्ता नोड्स के लिए स्टार्ट अप पर फाइलों को वितरित करता है। आप देख सकते हैं कि जब आप अपना स्पार्क काम शुरू करते हैं:
16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server
16/05/08 17:29:12 INFO Utils: Successfully started service 'HTTP file server' on port 58922.
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
क्लस्टर मोड - क्लस्टर मोड स्पार्क में ड्राइवर प्रक्रिया को निष्पादित करने के लिए एक नेता वर्कर नोड का चयन किया। इसका मतलब है कि नौकरी सीधे मास्टर नोड से नहीं चल रही है। यहां, स्पार्क एक HTTP सर्वर सेट नहीं करेगा । आपको अपने JARS को सभी कार्यकर्ता नोड को HDFS / S3 / अन्य स्रोतों से उपलब्ध कराना होगा जो सभी नोड्स के लिए उपलब्ध हैं।
फ़ाइलों के लिए URI स्वीकृत
में "भेजने से अनुप्रयोग" , स्पार्क प्रलेखन फ़ाइलों के लिए स्वीकार किए जाते हैं उपसर्गों समझाने का एक अच्छा काम करता है:
स्पार्क-सबमिट का उपयोग करते समय, - jars विकल्प के साथ शामिल किसी भी जार के साथ आवेदन जार स्वचालित रूप से क्लस्टर में स्थानांतरित हो जाएगा। स्पार्क निम्नलिखित यूआरएल योजना का उपयोग करता है ताकि जार को फैलाने के लिए अलग रणनीति बनाई जा सके:
- फ़ाइल: - निरपेक्ष पथ और फ़ाइल: / URI को ड्राइवर के HTTP फ़ाइल सर्वर द्वारा सेवा दी जाती है, और प्रत्येक निष्पादक फ़ाइल को चालक HTTP सर्वर से खींचता है।
- hdfs:, http :, https :, ftp: - ये URI से फाइल और JAR को उम्मीद के मुताबिक नीचे खींचते हैं
- स्थानीय: - एक यूआरआई जो स्थानीय के साथ शुरू होता है: / प्रत्येक कार्यकर्ता नोड पर एक स्थानीय फ़ाइल के रूप में मौजूद होने की उम्मीद है। इसका मतलब यह है कि कोई भी नेटवर्क IO नहीं होगा, और बड़ी फ़ाइलों / JAR के लिए अच्छी तरह से काम करता है जो प्रत्येक कार्यकर्ता को धकेल दिया जाता है, या NFS, GlusterFS, आदि के माध्यम से साझा किया जाता है।
ध्यान दें कि निष्पादक नोड्स पर JAR और फ़ाइलों को प्रत्येक SparkContext के लिए कार्यशील निर्देशिका में कॉपी किया जाता है।
जैसा कि कहा गया है, JAR को प्रत्येक वर्कर नोड के लिए काम करने वाले डायरेक्टरी में कॉपी किया जाता है । वास्तव में वह कहां है? यह आमतौर पर नीचे है /var/run/spark/work
, आप उन्हें इस तरह देखेंगे:
drwxr-xr-x 3 spark spark 4096 May 15 06:16 app-20160515061614-0027
drwxr-xr-x 3 spark spark 4096 May 15 07:04 app-20160515070442-0028
drwxr-xr-x 3 spark spark 4096 May 15 07:18 app-20160515071819-0029
drwxr-xr-x 3 spark spark 4096 May 15 07:38 app-20160515073852-0030
drwxr-xr-x 3 spark spark 4096 May 15 08:13 app-20160515081350-0031
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172020-0032
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172045-0033
और जब आप अंदर देखते हैं, तो आप अपने साथ तैनात सभी JAR को देखेंगे:
[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/
[*@*]$ ll
total 89988
-rwxr-xr-x 1 spark spark 801117 May 8 17:34 awscala_2.10-0.5.5.jar
-rwxr-xr-x 1 spark spark 29558264 May 8 17:34 aws-java-sdk-1.10.50.jar
-rwxr-xr-x 1 spark spark 59466931 May 8 17:34 com.mycode.code.jar
-rwxr-xr-x 1 spark spark 2308517 May 8 17:34 guava-19.0.jar
-rw-r--r-- 1 spark spark 457 May 8 17:34 stderr
-rw-r--r-- 1 spark spark 0 May 8 17:34 stdout
प्रभावित विकल्प:
समझने के लिए सबसे महत्वपूर्ण बात प्राथमिकता है । यदि आप कोड के माध्यम से किसी भी संपत्ति को पास करते हैं, तो यह आपके द्वारा निर्दिष्ट किसी भी विकल्प पर पूर्वता ले जाएगा spark-submit
। स्पार्क प्रलेखन में इसका उल्लेख है:
झंडे के रूप में या गुण फ़ाइल में निर्दिष्ट कोई भी मूल्य आवेदन पर पारित कर दिया जाएगा और स्पार्ककॉन्फ़ के माध्यम से निर्दिष्ट लोगों के साथ विलय कर दिया जाएगा। स्पार्ककॉन्फ़ पर सीधे सेट की गई संपत्तियाँ सबसे अधिक पूर्वता लेती हैं , फिर झंडे स्पार्क-सबमिट या स्पार्क-शेल के पास जाते हैं, फिर स्पार्क-डिफॉल्ट्स.कॉन फ़ाइल में विकल्प
इसलिए सुनिश्चित करें कि आप उन मूल्यों को उचित स्थानों पर सेट करते हैं, इसलिए जब आप एक दूसरे पर प्राथमिकता लेते हैं तो आपको आश्चर्य नहीं होगा।
प्रश्न में प्रत्येक विकल्प का विश्लेषण करें:
--jars
बनाम SparkContext.addJar
: ये समान हैं, केवल एक स्पार्क सबमिट के माध्यम से और एक कोड के माध्यम से सेट किया गया है। वह चुनें जो आपको बेहतर बनाता है। ध्यान देने वाली एक महत्वपूर्ण बात यह है कि इनमें से किसी भी विकल्प का उपयोग करने से आपके ड्राइवर / निष्पादक वर्गपथ में JAR नहीं जुड़ता है , आपको extraClassPath
दोनों पर विन्यास का उपयोग करके उन्हें स्पष्ट रूप से जोड़ना होगा ।
SparkContext.addJar
बनाम SparkContext.addFile
: पूर्व का उपयोग करें जब आपके पास एक निर्भरता होती है जिसे आपके कोड के साथ उपयोग करने की आवश्यकता होती है। जब आप अपने कार्यकर्ता नोड्स के चारों ओर एक मनमानी फ़ाइल पास करना चाहते हैं, तो बाद का उपयोग करें, जो आपके कोड में रन-टाइम निर्भरता नहीं है।
--conf spark.driver.extraClassPath=...
या --driver-class-path
: ये उपनाम हैं, कोई फर्क नहीं पड़ता कि आप किसे चुनते हैं
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
ऊपर के समान, उपनाम।
--conf spark.executor.extraClassPath=...
: इसका उपयोग तब करें जब आपके पास एक निर्भरता हो, जिसे एक uber JAR में शामिल नहीं किया जा सकता है (उदाहरण के लिए, क्योंकि पुस्तकालय संस्करणों के बीच संकलन समय संघर्ष हैं) और जिसे आपको रनटाइम पर लोड करने की आवश्यकता है।
--conf spark.executor.extraLibraryPath=...
यह java.library.path
जेवीएम के विकल्प के रूप में पारित किया गया है। इसका उपयोग तब करें जब आपको JVM को दिखाई जाने वाली लाइब्रेरी पथ की आवश्यकता हो।
क्या यह मान लेना सुरक्षित होगा कि सादगी के लिए, मैं एक ही समय में 3 मुख्य विकल्पों का उपयोग करके अतिरिक्त एप्लिकेशन जार फाइलें जोड़ सकता हूं:
आप इसे केवल क्लाइंट मोड के लिए सुरक्षित रूप से मान सकते हैं, न कि क्लस्टर मोड के लिए। जैसा कि मैंने पहले कहा है। इसके अलावा, आपके द्वारा दिए गए उदाहरण में कुछ निरर्थक तर्क हैं। उदाहरण के लिए, JAR को पास --driver-library-path
करना बेकार है, आपको उन्हें पास करने की आवश्यकता है extraClassPath
यदि आप चाहते हैं कि वे आपके क्लासपाथ पर हों। अंततः, जब आप चालक और कर्मी दोनों पर बाहरी JAR तैनात करते हैं तो आप क्या करना चाहते हैं:
spark-submit --jars additional1.jar,additional2.jar \
--driver-class-path additional1.jar:additional2.jar \
--conf spark.executor.extraClassPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar