2015-09-22 29 views
5

Tôi đã viết một ứng dụng Flask đơn giản để chuyển một số dữ liệu sang Spark. Kịch bản hoạt động trong Máy tính xách tay IPython, nhưng không phải khi tôi cố gắng chạy nó trong máy chủ riêng của nó. Tôi không nghĩ rằng bối cảnh Spark đang chạy trong kịch bản. Làm cách nào để tôi có được Spark hoạt động trong ví dụ sau?Truy cập vào ứng dụng Flask từ Flask

from flask import Flask, request 
from pyspark import SparkConf, SparkContext 

app = Flask(__name__) 

conf = SparkConf() 
conf.setMaster("local") 
conf.setAppName("SparkContext1") 
conf.set("spark.executor.memory", "1g") 
sc = SparkContext(conf=conf) 

@app.route('/accessFunction', methods=['POST']) 
def toyFunction(): 
    posted_data = sc.parallelize([request.get_data()]) 
    return str(posted_data.collect()[0]) 

if __name__ == '__main_': 
    app.run(port=8080) 

Trong máy tính xách tay IPython Tôi không xác định SparkContext vì nó được cấu hình tự động. Tôi không nhớ làm thế nào tôi đã làm điều này, tôi theo một số blog.

Trên máy chủ Linux, tôi đã đặt .py luôn chạy và cài đặt Spark mới nhất bằng cách làm theo bước 5 của this guide.

Sửa:

Theo lời khuyên của davidism bây giờ tôi đã thay viện đến các chương trình đơn giản với sự gia tăng độ phức tạp để bản địa hoá lỗi.

Trước hết tôi tạo py chỉ với kịch bản từ câu trả lời dưới đây (sau khi điều chỉnh một cách thích hợp các liên kết):

import sys 
try: 
    sys.path.append("your/spark/home/python") 
    from pyspark import context 
    print ("Successfully imported Spark Modules") 
except ImportError as e: 
    print ("Can not import Spark Modules", e) 

này trả về "Modules Spark nhập thành công". Tuy nhiên, file py hôm sau tôi đã trở lại là một ngoại lệ:

from pyspark import SparkContext 
sc = SparkContext('local') 
rdd = sc.parallelize([0]) 
print rdd.count() 

này trả ngoại lệ:

"Quá trình Java cổng thoát trước khi gửi người lái xe số cổng của nó"

tìm kiếm xung quanh các vấn đề tương tự Tôi tìm thấy this page nhưng khi tôi chạy mã này không có gì xảy ra, không in trên bàn điều khiển và không có thông báo lỗi. Tương tự, this cũng không giúp được gì, tôi nhận được cùng một ngoại lệ cổng Java như trên. Tôi cũng đã cài đặt anaconda khi tôi nghe điều này có thể giúp đoàn kết trăn và java, một lần nữa không thành công ...

Bất kỳ đề xuất nào về những gì cần thử tiếp theo? Tôi đang thua lỗ.

+0

lưu ý rằng tôi được đăng trên máy tính của tôi với ipython Máy tính xách tay bằng cách sử dụng phần mở rộng restclient trên firefox và nó làm việc như mong đợi – Matt

+1

gì không làm việc? Có lỗi không? Bạn đăng dữ liệu như thế nào? Làm thế nào để bạn chạy máy chủ? Bạn đang chạy trong chế độ gỡ lỗi? Vui lòng [chỉnh sửa] để bao gồm [mcve]. – davidism

+0

Tôi đã chỉnh sửa câu hỏi – Matt

Trả lời

5

Được rồi, vì vậy tôi sẽ trả lời câu hỏi của riêng tôi với hy vọng một người nào đó sẽ không phải chịu cùng ngày thất vọng! Hóa ra đó là một sự kết hợp của thiếu mã và thiết lập xấu.

Chỉnh sửa mã: Tôi đã thực sự cần phải khởi tạo một Context Spark bằng cách phụ thêm như sau trong phần mở đầu của mã của tôi:

from pyspark import SparkContext 
sc = SparkContext('local') 

Vì vậy, mã đầy đủ sẽ là:

from pyspark import SparkContext 
sc = SparkContext('local') 

from flask import Flask, request 
app = Flask(__name__) 

@app.route('/whateverYouWant', methods=['POST']) #can set first param to '/' 

def toyFunction(): 
    posted_data = sc.parallelize([request.get_data()]) 
    return str(posted_data.collect()[0]) 

if __name__ == '__main_': 
    app.run(port=8080) #note set to 8080! 

Chỉnh sửa thiết lập: Điều quan trọng là tệp (yourrfilename.py) nằm trong đúng thư mục, cụ thể là phải b e được lưu vào thư mục /home/ubuntu/spark-1.5.0-bin-hadoop2.6.

Sau đó dùng lệnh sau đây trong thư mục:

./bin/spark-submit yourfilename.py 

mà khởi dịch vụ tại 10.0.0.XX: 8080/accessFunction /.

Lưu ý rằng các cổng phải được thiết lập để 8080 hoặc 8081: Spark chỉ cho phép giao diện web cho các cổng mặc định cho tổng thể và người lao động tương ứng

Bạn có thể kiểm tra các dịch vụ với một dịch vụ yên tĩnh hoặc bằng cách mở lập một nhà ga mới và gửi yêu cầu POST với các lệnh cURL:

curl --data "DATA YOU WANT TO POST" http://10.0.0.XX/8080/accessFunction/ 
+0

Xin chào @Matt, tôi đang đối mặt với các vấn đề tương tự. Tôi hơi bối rối với điều này. tại sao nó là cần thiết để đưa các dự án theo thư mục spark? và những gì về XX này trong địa chỉ host? –

+0

Hey @Larissa của nó được một thời gian kể từ khi tôi đã viết rằng vì vậy tôi là một chút gỉ. Bạn cần phải đặt dự án trong thư mục spark để chạy lệnh. Bạn có thể giải quyết vấn đề này nếu bạn thêm ./bin/spark-submit vào bash spark của bạn và bạn có thể chạy nó từ bất cứ đâu, nhưng tôi không muốn quá phức tạp câu trả lời này. Đối với XX đó là địa phương IP của hộp, có lẽ tôi nên có chỉ cần viết 0.0.0.0 thay vào đó, mà sẽ làm việc. Bạn sẽ có thể gửi yêu cầu POST qua bưu điện từ một máy khác trên cùng một mạng mặc dù. Hi vọng điêu nay co ich! – Matt

0

Sửa đổi tệp .py của bạn như được hiển thị trong hướng dẫn được liên kết 'Sử dụng IPython Notebook với Spark' phần thứ hai. Insted sys.path.insert sử dụng sys.path.append. Hãy thử chèn đoạn mã này:

import sys 
try: 
    sys.path.append("your/spark/home/python") 
    from pyspark import context 
    print ("Successfully imported Spark Modules") 
except ImportError as e: 
    print ("Can not import Spark Modules", e) 
+0

Cảm ơn bạn đã liên hệ lại với tôi. Tôi đã thử tạo một chương trình đơn giản nhất có thể, trước tiên chỉ bao gồm mã của bạn ở trên. Khi tôi chạy nó tôi nhận được "thành công ...", đó là tuyệt vời. Sau đó tôi thực hiện một chương trình đơn giản mà tôi sẽ thêm làm bản chỉnh sửa cho câu hỏi. Kết quả là một ngoại lệ: "Quá trình cổng Java đã thoát trước khi gửi trình điều khiển số cổng của nó" – Matt

+0

Nếu bạn đã khởi tạo biến 'sc' thì bạn phải sử dụng cùng một cá thể thay vì khởi tạo lại biến. – szentesmarci

1

tôi đã có thể khắc phục vấn đề này bằng cách thêm vị trí của PySpark và py4j với các đường dẫn trong file flaskapp.wsgi tôi. Dưới đây là toàn bộ nội dung:

import sys 
sys.path.insert(0, '/var/www/html/flaskapp') 
sys.path.insert(1, '/usr/local/spark-2.0.2-bin-hadoop2.7/python') 
sys.path.insert(2, '/usr/local/spark-2.0.2-bin-hadoop2.7/python/lib/py4j-0.10.3-src.zip') 

from flaskapp import app as application 
Các vấn đề liên quan