ClassPath:
ClassPath bị ảnh hưởng tùy thuộc vào những gì bạn cung cấp. Có một vài cách để thiết lập một cái gì đó trên đường dẫn:
spark.driver.extraClassPath
hoặc là bí danh --driver-class-path
để đặt các đường dẫn lớp bổ sung trên nút chạy trình điều khiển.
spark.executor.extraClassPath
để đặt đường dẫn lớp bổ sung trên các nút Công nhân.
Nếu bạn muốn một JAR nào đó được thực hiện trên cả Master và Worker, bạn phải chỉ định các JAR này một cách riêng biệt trong các cờ BÓNG.
Ký tự phân tách:
Theo các quy tắc tương tự như JVM :
- Linux: dấu hai chấm
:
- ví dụ:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: Dấu chấm phẩy
;
- ví dụ:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
Phân phối tệp:
Điều này phụ thuộc vào chế độ bạn đang thực hiện công việc của mình theo:
Chế độ máy khách - Spark kích hoạt máy chủ Netty HTTP, phân phối các tệp khi khởi động cho mỗi nút worker. Bạn có thể thấy điều đó khi bạn bắt đầu công việc 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
Chế độ cụm - Trong chế độ cụm, tia lửa đã chọn một nút Công nhân lãnh đạo để thực thi quy trình Trình điều khiển trên. Điều này có nghĩa là công việc không chạy trực tiếp từ nút Master. Ở đây, Spark sẽ không đặt máy chủ HTTP. Bạn phải cung cấp JARS theo cách thủ công cho tất cả các nút worker thông qua HDFS / S3 / Các nguồn khác có sẵn cho tất cả các nút.
URI được chấp nhận cho các tệp
Trong "Gửi ứng dụng" , tài liệu Spark thực hiện tốt công việc giải thích các tiền tố được chấp nhận cho các tệp:
Khi sử dụng tia lửa, bình ứng dụng cùng với bất kỳ lọ nào có trong tùy chọn --jars sẽ được tự động chuyển sang cụm. Spark sử dụng lược đồ URL sau để cho phép các chiến lược khác nhau để phổ biến các lọ:
- tệp: - Đường dẫn và tệp tuyệt đối: / URI được phục vụ bởi máy chủ tệp HTTP của trình điều khiển và mọi người thực thi sẽ kéo tệp từ máy chủ HTTP của trình điều khiển.
- hdfs:, http:, https:, ftp: - những tệp này kéo xuống các tệp và JAR từ URI như mong đợi
- local: - một URI bắt đầu bằng local: / dự kiến sẽ tồn tại dưới dạng tệp cục bộ trên mỗi nút worker. Điều này có nghĩa là sẽ không có IO mạng nào phát sinh và hoạt động tốt đối với các tệp / JAR lớn được đẩy đến từng nhân viên hoặc được chia sẻ qua NFS, GlusterFS, v.v.
Lưu ý rằng các tệp và tệp JAR được sao chép vào thư mục làm việc cho mỗi SparkContext trên các nút thực thi.
Như đã lưu ý, các JAR được sao chép vào thư mục làm việc cho mỗi nút Worker. Chính xác thì nó ở đâu? Nó thường ở dưới /var/run/spark/work
, bạn sẽ thấy chúng như thế này:
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
Và khi bạn nhìn vào bên trong, bạn sẽ thấy tất cả các JAR bạn đã triển khai cùng:
[*@*]$ 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
Tùy chọn bị ảnh hưởng:
Điều quan trọng nhất để hiểu là ưu tiên . Nếu bạn chuyển bất kỳ thuộc tính nào qua mã, nó sẽ được ưu tiên hơn bất kỳ tùy chọn nào bạn chỉ định qua spark-submit
. Điều này được đề cập trong tài liệu Spark:
Mọi giá trị được chỉ định dưới dạng cờ hoặc trong tệp thuộc tính sẽ được chuyển cho ứng dụng và được hợp nhất với các giá trị được chỉ định qua SparkConf. Các thuộc tính được đặt trực tiếp trên SparkConf được ưu tiên cao nhất , sau đó các cờ được chuyển sang spark-submit hoặc spark-shell, sau đó các tùy chọn trong tệp spark-defaults.conf
Vì vậy, hãy đảm bảo bạn đặt các giá trị đó ở những vị trí thích hợp, để bạn không ngạc nhiên khi cái này được ưu tiên hơn cái kia.
Hãy phân tích từng tùy chọn trong câu hỏi:
--jars
vs SparkContext.addJar
: Đây là giống hệt nhau, chỉ có một được đặt thông qua tia lửa gửi và một qua mã. Chọn một trong đó bộ bạn tốt hơn. Một điều quan trọng cần lưu ý là việc sử dụng một trong hai tùy chọn này không thêm JAR vào đường dẫn trình điều khiển / trình thực thi của bạn, bạn sẽ cần thêm chúng một cách rõ ràng bằng cách sử dụng extraClassPath
cấu hình trên cả hai.
SparkContext.addJar
vs SparkContext.addFile
: Sử dụng trước đây khi bạn có một phụ thuộc cần được sử dụng với mã của bạn. Sử dụng cái sau khi bạn chỉ muốn truyền một tệp tùy ý xung quanh các nút worker của bạn, đây không phải là một phụ thuộc thời gian chạy trong mã của bạn.
--conf spark.driver.extraClassPath=...
hoặc --driver-class-path
: Đây là những bí danh, không quan trọng bạn chọn cái nào
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
Tương tự như trên, bí danh.
--conf spark.executor.extraClassPath=...
: Sử dụng tùy chọn này khi bạn có một phụ thuộc không thể đưa vào JAR uber (ví dụ: vì có xung đột thời gian biên dịch giữa các phiên bản thư viện) và bạn cần tải khi chạy.
--conf spark.executor.extraLibraryPath=...
Điều này được thông qua dưới dạng java.library.path
tùy chọn cho JVM. Sử dụng điều này khi bạn cần một đường dẫn thư viện hiển thị cho JVM.
Có an toàn không khi cho rằng để đơn giản, tôi có thể thêm các tệp jar ứng dụng bổ sung bằng 3 tùy chọn chính cùng một lúc:
Bạn chỉ có thể giả định điều này một cách an toàn cho chế độ Máy khách, không phải chế độ Cụm. Như tôi đã nói trước đây. Ngoài ra, ví dụ bạn đưa ra có một số đối số dư thừa. Ví dụ, chuyển JAR đến --driver-library-path
là vô ích, bạn cần chuyển chúng sang extraClassPath
nếu bạn muốn chúng nằm trên đường dẫn của bạn. Cuối cùng, những gì bạn muốn làm khi bạn triển khai các JAR bên ngoài trên cả trình điều khiển và công nhân là:
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