2016-10-20 18 views
6

Tôi có một truy vấn liên quan đến việc tạo nhiều phiên tia lửa trong một JVM. Tôi đã đọc rằng việc tạo nhiều ngữ cảnh không được đề xuất trong các phiên bản trước của Spark. Có đúng với SparkSession trong Spark 2.0 không.Nhiều SparkSessions trong một JVM duy nhất

Tôi đang nghĩ đến việc thực hiện cuộc gọi đến một dịch vụ web hoặc một servlet từ giao diện người dùng và dịch vụ tạo phiên khởi chạy, thực hiện một số thao tác và trả về kết quả. Điều này sẽ dẫn đến một phiên tia lửa được tạo ra cho mọi yêu cầu từ phía khách hàng. Thực hành này có được khuyến cáo không?

Nói rằng tôi có một phương pháp gì đó như:

public void runSpark() throws Exception {

 SparkSession spark = SparkSession 
      .builder() 
      .master("spark://<masterURL>") 
      .appName("JavaWordCount") 
      .getOrCreate(); 

và vân vân ....

Nếu tôi đưa phương pháp này trong một trang web dịch vụ, sẽ có bất kỳ vấn đề JVM nào? Như vậy tôi có thể gọi phương thức này nhiều lần từ một phương thức chính. Nhưng không chắc liệu đây có phải là thực hành tốt hay không.

Trả lời

3

Nó không được hỗ trợ và sẽ không được. SPARK-2243 được giải quyết là không khắc phục được.

Nếu bạn cần nhiều bối cảnh, có nhiều dự án khác nhau có thể giúp bạn (Mist, Livy).

4

Bạn có thể gọi getOrCreate nhiều lần.

Chức năng này có thể được sử dụng để get or instantiate một SparkContext và đăng ký nó làm đối tượng singleton. Bởi vì chúng tôi chỉ có thể có một SparkContext hoạt động trên mỗi JVM, điều này rất hữu ích khi các ứng dụng có thể muốn chia sẻ một SparkContext.

getOrCreate tạo SparkContext trong JVM nếu không có SparkContext khả dụng. Nếu SparkContext đã là có sẵn trong JVM, nó không tạo mới nhưng returns the old one.

7

Các tài liệu của getOrCreate khẳng định

phương pháp này kiểm tra đầu tiên cho dù có một thread-địa phương hợp lệ SparkSession, và nếu có, trả lại một đó. Sau đó, kiểm tra xem có SparkSession mặc định toàn cầu hợp lệ hay không và nếu có, hãy trả lại một. Nếu không có SparkSession mặc định hợp lệ tồn tại, phương thức sẽ tạo SparkSession mới và gán SparkSession mới được tạo làm mặc định chung.

Ngoài ra còn có phương pháp SparkSession.newSession cho biết

Bắt đầu một phiên làm việc mới với cấu hình riêng biệt SQL, tạm bảng, chức năng đăng ký đang bị cô lập, nhưng chia sẻ cơ bản SparkContext và dữ liệu lưu trữ.

Vì vậy, tôi đoán câu trả lời cho câu hỏi của bạn là bạn có thể có nhiều phiên, nhưng vẫn có một SparkContext mỗi JVM sẽ được tất cả các phiên của bạn sử dụng.

Tôi có thể tưởng tượng, có thể kịch bản cho ứng dụng web của bạn có thể là tạo một SparkSession theo yêu cầu hoặc, ví dụ: Phiên HTTP và sử dụng phiên này để tách biệt các hành động Spark theo yêu cầu hoặc phiên người dùng < - Vì tôi khá mới với Spark - ai đó có thể xác nhận điều này?

+0

Tôi đã tạo một câu hỏi khác có liên quan chặt chẽ với câu hỏi này. Xem http://stackoverflow.com/questions/43013542/creating-many-short-living-sparksessions –

2

Nếu bạn có một phiên tia lửa hiện tại và muốn tạo một hình mới, sử dụng newSession phương pháp trên SparkSession hiện có.

import org.apache.spark.sql.{SQLContext, SparkSession} 
val newSparkSession = spark.newSession() 

Phương pháp newSession tạo ra một phiên spark mới với cấu hình SQL cô lập, tạm thời tables.The phiên làm việc mới sẽ chia sẻ cơ bản SparkContext và lưu trữ dữ liệu.

+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn. – user2814799

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