2017-09-08 14 views
0

私はクライアントからファイルを受け取り、そのファイルをローカルシステムのHDFSに保存する必要があるbottle apiを定義しています。ボトルapiの受信ファイルをhdfsに保存するには

コードは次のようになります。

@route('/upload', method='POST') 
def do_upload(): 
    import pdb; pdb.set_trace() 
    upload = request.files.upload 
    name, ext = os.path.splitext(upload.filename) 

    save_path = "/data/{user}/{filename}".format(user=USER, filename=name) 

    hadoopy.writetb(save_path, upload.file.read()) 
    return "File successfully saved to '{0}'.".format(save_path) 

問題があり、request.files.upload.file.read()方法でstrに変換することができるタイプcStringIO.StringOの目的です。しかし、hadoopy.writetb(path, content)は、コンテンツが他の形式であると予想し、その時点でサーバーが固執します。それは例外を与えません、それはエラーまたは何らかの結果を与えません。ちょうど無限ループのようにそこに立っています。

ボトルAPIの受信ファイルをHDFSに書き込む方法を知っている人はいますか? writetbの2番目のパラメータは、ペアの反復可能なことになっているようhadoopy documentationから

+0

WebHDFSは基本的に書き直していますか? –

+0

いいえ、私はちょうどボトルのapisとそのうちの1つをアップロードし、HDFSとの間で読み書きしたいと思っています。 –

答えて

0

、それが見えます。バイトで渡しています。

...キー/値ペアのイテレータを取るhadoopy.writetbコマンド...

はあなたがペアに渡してみましたか? pathの意味が何であるか、それは私にははっきりしていないので、

hadoopy.writetb(save_path, (path, upload.file.read())) 

(私はHadoopのに慣れていないんだけど、おそらくそれ」:代わりにあなたは、

hadoopy.writetb(save_path, upload.file.read()) # 2nd param is wrong 

をやっていることの、これをしてみてくださいHDFSを知っている人には理にかなっています。)

+0

パスはファイルシステムのパス文字列になります –

+0

はい。パスは単に 'hdfs:// localhost:8082/root/data/files/foo'のような文字列ですが、' upload.file.read() 'は' writetb'が受け入れていない文字列を与えています! –

+0

@ KeyurGolani 'writetb'のAPIを読んだ? 2番目のパラメータは文字列ではなくタプルであるはずです。私はそれをより明確にするために私の答えを編集しました。それが動作するかどうか私に教えてください。 –

関連する問題