2015-09-22 3 views
5

Sparkにデータを渡すための簡単なFlaskアプリを作成しました。このスクリプトはIPython Notebookで動作しますが、自分のサーバで実行しようとしたときは動作しません。 Sparkコンテキストがスクリプト内で実行されているとは思わない。次の例でSparkを動作させるにはどうすればよいですか?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) 

IPythonノートブックでは、SparkContextは自動的に設定されるため定義しません。私はこれをどうやってやったのか覚えていない、私はいくつかのブログに続いた。

Linuxサーバーでは、常に実行するように.pyを設定し、this guideの手順5までを実行して最新のSparkをインストールしました。

編集

私は今、代わりにエラーをローカライズするために複雑さを増すと、単純なプログラムに頼ってきたdavidismによって助言に続き。これは、「成功しまし輸入スパークモジュール」を返し

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) 

は、まず私が(適切なリンクを調整した後に)以下の答えからちょうどスクリプトでの.py作成しました。ただし、次の.pyファイルは、私は戻って、例外を作っ:

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

は、これは例外を返します:

は、同様の問題のために周りに検索

を「Javaのゲートウェイ・プロセスは、ドライバーにそのポート番号を送信する前に終了しました」私はthis pageを見つけましたが、このコードを実行しても何も起こらず、コンソールには何も表示されず、エラーメッセージも表示されません。同様に、thisも役に立ちませんでしたが、上記と同じJavaゲートウェイ例外が発生します。私はこれがpythonとjavaを結合するのに役立つかもしれないと聞いたので、私はまたanacondaをインストールしました...

次に何を試してみるべきですか?私は迷っている。

+0

ノート、それが動作していない何を期待 – Matt

+1

として働いていましたか?エラーはありますか?どのようにデータを投稿していますか?どのようにサーバーを稼働させていますか?デバッグモードで実行していますか? [編集]に[mcve]を含めるようにしてください。 – davidism

+0

私は質問を編集しました – Matt

答えて

5

ので、私はそこに誰かが欲求不満の同じ日に受けないだろうという希望で自分の質問に答えるつもりです。このスニペットを挿入してみてください!それは欠けているコードと悪い設定の組み合わせだった。私は確かに私のコードの前文に以下を追加することによって、スパークコンテキストを初期化する必要がありました :

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

だから、完全なコードは次のようになります。

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! 
コードを編集

セットアップを編集する: ファイル(yourrfilename.py)が正しいディレクトリにあること、つまり、b eは/home/ubuntu/spark-1.5.0-bin-hadoop2.6というフォルダに保存されます。

そして、ディレクトリ内で次のコマンドを発行:8080/accessFunctionの/:

./bin/spark-submit yourfilename.py 

10.0.0.XXでサービスを開始します。ポートは8080または8081に設定しなければならないこと

注:スパークが唯一のマスターと労働者のために、デフォルトでこれらのポートのためのWeb UIを可能にそれぞれ

あなたが安らかなサービスまたは開放することによって、サービスをテストすることができます新しいターミナルまでカールとPOSTリクエストを送信するコマンド:

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

こんにちは@Matt、私は同様の問題に直面しています。私はこれと少し混乱しています。なぜプロジェクトをスパークディレクトリの下に置く必要がありますか?ホストアドレスのこのXXについてはどうでしょうか? –

+0

ちょっと@ラリッサ私はそれを書いてからしばらくしていたので、少し錆びています。コマンドを実行するには、プロジェクトをsparkディレクトリに置く必要があります。 ./bin/spark-submitをspark bashに追加してどこからでも実行できますが、この回答を過度に複雑にしたくはありませんでした。ボックスのローカルIPだったXXについては、代わりに0.0.0.0と書かなければならないかもしれません。あなたは同じネットワーク上の別のマシンからのPOSTMAN経由でPOST要求を送ることができるはずです。お役に立てれば! – Matt

0

リンクされているガイド「SparkでIPythonノートブックを使用する」の第2点に示されているように、.pyファイルを変更します。 Insted sys.path.insertはsys.path.appendを使用します。オーケー

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

私に戻ってくれてありがとう。私はできるだけシンプルなプログラムを作成しようとしました。私はそれを実行すると、私は "成功..."を得る、それは素晴らしいです。私は、質問の編集として追加する簡単なプログラムを作成します。結果は例外です: "ドライバをポート番号に送信する前にJavaゲートウェイプロセスが終了しました" – Matt

+0

変数scを既に初期化している場合、変数を再初期化する代わりに同じインスタンスを使用する必要があります。 – szentesmarci

1

私はflaskapp.wsgiファイル内のパスにPySparkとpy4jの場所を追加することで、この問題を解決することができました。ここで完全なコンテンツです:私は、Firefoxのrestclient拡張子を使用してiPythonノートブックと私のマシン上に掲載

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 
関連する問題