2014-06-05 19 views
9

Tôi có một cụm nhỏ với 3 máy và một máy khác để phát triển và thử nghiệm. Khi phát triển, tôi đặt SparkContext thành local. Khi mọi thứ đều ổn, tôi muốn triển khai tệp Jar tôi xây dựng cho mỗi nút. Về cơ bản tôi tự di chuyển jar này để cluster và sao chép vào HDFS được chia sẻ bởi cluster. Sau đó, tôi có thể thay đổi mã thành:Làm thế nào để dễ dàng triển khai Jar của tôi sang Spark Cluster ở chế độ độc lập?

//standalone mode 
val sc = new SparkContext(
    "spark://mymaster:7077", 
    "Simple App", 
    "/opt/spark-0.9.1-bin-cdh4", //spark home 
    List("hdfs://namenode:8020/runnableJars/SimplyApp.jar") //jar location 
) 

để chạy mã trong IDE của tôi. Câu hỏi của tôi: Có cách nào dễ dàng hơn để di chuyển cái bình này đến cụm sao?

Trả lời

23

Trong Spark, chương trình tạo SparkContext được gọi là 'trình điều khiển'. Đó là đầy đủ rằng tệp jar với công việc của bạn có sẵn cho hệ thống tệp cục bộ của trình điều khiển để nó có thể lấy nó và gửi nó đến chủ/công nhân.

Trong bê tông, cấu hình của bạn sẽ trông giống như:

//favor using Spark Conf to configure your Spark Context 
val conf = new SparkConf() 
      .setMaster("spark://mymaster:7077") 
      .setAppName("SimpleApp") 
      .set("spark.local.ip", "172.17.0.1") 
      .setJars(Array("/local/dir/SimplyApp.jar")) 

val sc = new SparkContext(conf) 

Dưới mui xe, người lái xe sẽ bắt đầu một máy chủ mà người lao động sẽ tải về file jar (s) từ tài xế. Do đó, điều quan trọng (và thường là một vấn đề) mà các công nhân có quyền truy cập mạng vào trình điều khiển. Điều này thường có thể được đảm bảo bằng cách thiết lập 'spark.local.ip' trên trình điều khiển trong mạng có thể truy cập/định tuyến từ công nhân.

+4

Bạn cũng có thể sử dụng 'SparkContext.jarOfClass (this.getClass)' thay vì mã hóa cứng nó 'Array ("/ local/dir/SimplyApp.jar") '. – samthebest

+2

@samthebest rằng phương thức xác định lọ mà lớp được cung cấp đã được nạp và hoạt động tốt cho các phụ thuộc nhưng có thể không hoạt động đối với lớp trình điều khiển trong một IDE sẽ không được nạp từ một JAR. Cách dễ nhất là xây dựng một uberjar với Maven Shade hoặc SBT assembly và cung cấp đó là sự phụ thuộc duy nhất. – maasg

+2

Chỉ FWIW câu trả lời này phụ thuộc vào việc chấp nhận cài đặt mặc định cho --deploy-mode là máy khách, nếu bạn đang sử dụng cụm chế độ -deploy-mode thì bạn không biết nút trình điều khiển nào sẽ chạy, do đó bạn thực hiện cần các lọ này hiển thị cho tất cả các công nhân, theo Quản lý phụ thuộc nâng cao, đó là một ý tưởng hay vì nó làm giảm lưu lượng mạng. http://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management. Ngoài ra các lọ không được vận chuyển đến các bậc thầy như là chủ không đối phó với mã, chỉ cần lập kế hoạch của mã aka "ứng dụng" trong Spark – JimLohse

Các vấn đề liên quan