CLASSPATH:
ClassPath ได้รับผลกระทบขึ้นอยู่กับสิ่งที่คุณให้ มีสองวิธีในการตั้งค่าบางอย่างบน classpath:
spark.driver.extraClassPath
หรือเป็นนามแฝง--driver-class-path
ในการตั้งค่า classpaths พิเศษบนโหนดที่เรียกใช้ไดรเวอร์
spark.executor.extraClassPath
เพื่อตั้งค่าคลาสพา ธ พิเศษบนโหนดผู้ทำงาน
หากคุณต้องการให้ JAR บางตัวมีผลกับทั้ง Master และ Worker คุณต้องระบุแยกต่างหากในแฟล็ก BOTH
อักขระแยก:
ปฏิบัติตามกฎเดียวกันกับ JVM :
- Linux: ลำไส้ใหญ่
:
- เช่น:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: อัฒภาค
;
- เช่น:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
การกระจายไฟล์:
ขึ้นอยู่กับโหมดที่คุณทำงานภายใต้:
โหมดไคลเอนต์ - ประกายไฟเซิร์ฟเวอร์ Netty HTTP ซึ่งกระจายไฟล์เมื่อเริ่มทำงานสำหรับแต่ละโหนดผู้ปฏิบัติงาน คุณจะเห็นว่าเมื่อคุณเริ่มงาน Spark ของคุณ:
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
โหมด Cluster - ในโหมดคลัสเตอร์ spark เลือกโหนด Leadererer เพื่อเรียกใช้กระบวนการของไดรเวอร์ หมายความว่างานไม่ได้ทำงานโดยตรงจากโหนดมาสเตอร์ ในที่นี้ Spark จะไม่ตั้งค่าเซิร์ฟเวอร์ HTTP คุณต้องทำให้ JARS ของคุณพร้อมใช้งานกับโหนดงานทั้งหมดด้วยตนเองผ่าน HDFS / S3 / แหล่งอื่น ๆ ซึ่งมีอยู่ในทุกโหนด
ยอมรับ URI's สำหรับไฟล์
ใน"การส่งแอปพลิเคชัน"เอกสาร Spark ทำงานได้ดีในการอธิบายคำนำหน้าที่ยอมรับสำหรับไฟล์:
เมื่อใช้ spark-submit, ขวดแอ็พพลิเคชันพร้อมกับขวดใด ๆ ที่รวมอยู่ในตัวเลือก --jars จะถูกโอนไปยังคลัสเตอร์โดยอัตโนมัติ Spark ใช้รูปแบบ URL ต่อไปนี้เพื่อให้กลยุทธ์ที่แตกต่างกันสำหรับการกระจายไห:
- ไฟล์: - เส้นทางที่แน่นอนและไฟล์: / URIs ให้บริการโดยไฟล์เซิร์ฟเวอร์ HTTP ของไดรเวอร์และผู้ปฏิบัติการทุกรายจะดึงไฟล์จากเซิร์ฟเวอร์ HTTP ของไดรเวอร์
- hdfs :, http :, https :, ftp: - ไฟล์แบบดึงลงและ JAR จาก URI ดังที่คาดไว้
- ท้องถิ่น: - URI เริ่มต้นด้วยท้องถิ่น: / คาดว่าจะมีอยู่เป็นไฟล์ท้องถิ่นในแต่ละโหนดผู้ปฏิบัติงาน ซึ่งหมายความว่าจะไม่มีเครือข่าย IO เกิดขึ้นและทำงานได้ดีสำหรับไฟล์ / JAR ขนาดใหญ่ที่ส่งไปยังผู้ปฏิบัติงานแต่ละคนหรือแชร์ผ่าน NFS, GlusterFS ฯลฯ
โปรดทราบว่า JARs และไฟล์จะถูกคัดลอกไปยังไดเรกทอรีการทำงานสำหรับแต่ละ SparkContext บนโหนดตัวจัดการ
ตามที่ระบุไว้ JARs จะถูกคัดลอกไปยังไดเร็กทอรีการทำงานสำหรับแต่ละโหนดผู้ทำงาน ตรงไหนล่ะ มันเป็นมักจะอยู่ภายใต้/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
ที่คุณระบุผ่านทาง สิ่งนี้ถูกกล่าวถึงในเอกสารของ Spark:
ค่าใด ๆ ที่ระบุเป็นแฟล็กหรือในไฟล์คุณสมบัติจะถูกส่งต่อไปยังแอปพลิเคชันและผสานกับค่าที่ระบุผ่าน SparkConf คุณสมบัติที่ตั้งค่าโดยตรงบน SparkConf มีความสำคัญสูงสุดจากนั้นแฟล็กที่ส่งไปยัง spark-submit หรือ spark-shell จากนั้นตัวเลือกในไฟล์ spark-defaults.conf
ดังนั้นให้แน่ใจว่าคุณตั้งค่าเหล่านั้นในสถานที่ที่เหมาะสมดังนั้นคุณจะไม่แปลกใจเมื่อหนึ่งจะมีความสำคัญมากกว่าที่อื่น
ให้วิเคราะห์แต่ละตัวเลือกในคำถาม:
--jars
vs SparkContext.addJar
: สิ่งเหล่านี้เหมือนกันมีเพียงหนึ่งรายการเท่านั้นที่ตั้งค่าผ่านการส่งประกายและอีกหนึ่งรหัสผ่าน เลือกห้องสวีทที่คุณดีกว่า สิ่งสำคัญประการหนึ่งที่ควรทราบก็คือการใช้ตัวเลือกใดตัวเลือกหนึ่งเหล่านี้ไม่ได้เพิ่ม JAR ให้กับ driver / executor classpath ของคุณคุณจะต้องเพิ่มอย่างชัดเจนโดยใช้extraClassPath
config ในทั้งคู่
SparkContext.addJar
vs 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 ใช้สิ่งนี้เมื่อคุณต้องการพา ธ ไลบรารีที่มองเห็นได้สำหรับ JVM
มันจะปลอดภัยหรือไม่ที่จะสมมติว่าเพื่อความง่ายฉันสามารถเพิ่มไฟล์ jar เพิ่มเติมโดยใช้ตัวเลือกหลัก 3 ตัวพร้อมกัน:
คุณสามารถสันนิษฐานได้ว่าปลอดภัยสำหรับโหมดไคลเอนต์เท่านั้นไม่ใช่โหมดคลัสเตอร์ อย่างที่ฉันเคยพูดไป ตัวอย่างที่คุณให้ไว้มีข้อโต้แย้งที่ซ้ำซ้อน ตัวอย่างเช่นการส่ง JAR ไป--driver-library-path
นั้นไร้ประโยชน์คุณจะต้องผ่านมันไปextraClassPath
หากคุณต้องการให้พวกเขาอยู่ใน classpath ของคุณ ในที่สุดสิ่งที่คุณต้องการทำเมื่อคุณปรับใช้ 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