2016-03-28 13 views
4

ftpを使ってApache Spark(Scala版)のリモートマシン上のファイルを読み込もうとしています。現在、私はGitHubのDatabricksのLearning Sparkレポの例に従っています。カールを使用して、私はファイルをダウンロードすることができるので、私が使用するパスが存在します。ftpを使ってApache Sparkのリモートマシン上のファイルを読む

以下

は、私が実行しようとするコードの抜粋です:

var file = sc.textFile("ftp://user:pwd/192.168.1.5/brecht-d-m/map/input.nt") 
var fileDF = file.toDF() 
fileDF.write.parquet("out") 

データフレーム上のカウントを実行しようとした後、私は次のスタックトレース(http://pastebin.com/YEq8c2Hf)を取得:

org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree: 
TungstenAggregate(key=[], functions=[(count(1),mode=Final,isDistinct=false)], output=[count#1L]) 
+- TungstenExchange SinglePartition, None 
    +- TungstenAggregate(key=[], functions=[(count(1),mode=Partial,isDistinct=false)], output=[count#4L]) 
     +- Project 
     +- Scan ExistingRDD[_1#0] 

... 

Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: ftp://user:[email protected]/brecht-d-m/map/input.nt 

をIだろうファイルが到達不能であると仮定しますが、これはcurlでファイルを取得できることと矛盾しています。

curl ftp://user:[email protected]/brecht-d-m/map/input.nt 

端末上の特定のファイルが表示されます。私はScalaコードで何が間違っているのか分かりません。上記のコードスニペットにエラーがありますか、それとも完全に間違っていますか?事前に

おかげで、 ブレヒト

注:予想通り

  • があるため、(パス全体(/home/brecht-dm/map/input.nt)も動作しませんを指定しますこれはcurlではうまくいきません; "サーバーは指定されたディレクトリへの変更を拒否しました")。これをSparkで試してみると、seekがサポートされていないというIOExceptionが発生します(http://pastebin.com/b9EB9ru2)。

  • ローカルで作業すること(例:sc.textFile( "/ home/brecht-d-m/map/input.nt"))は完全に機能します。

  • 特定のファイルに対するファイルのアクセス許可は、すべてのユーザーに対してR + Wに設定されています。

  • ファイルサイズ(15MB)は問題にならないはずであり、はるかに大きなファイルを処理できるはずです。

  • ソフトウェアバージョン:スカラ座2.11.7、Apacheのスパーク1.6.0、Javaの1.8.0_74は、Ubuntu 14.04.4

+0

「[リモートロケーション(ftp)からApache Sparkでcsvファイルを読み込む]」(http://stackoverflow.com/questions/34479895/read-csv-file-in-apache-spark-from-remote-location) -ftp) – user1314742

答えて

5

私は回避策を見つけることができました。以下のコードを参照してください。

import org.apache.spark.SparkFiles 

val dataSource = "ftp://user:pwd/192.168.1.5/brecht-d-m/map/input.nt" 
sc.addFile(dataSource) 
var fileName = SparkFiles.get(dataSource.split("/").last) 
var file = sc.textFile(fileName) 

私はFTP経由でファイルをダウンロードできます(最初のコードスニペットと同じURLで)。この回避策は、まずファイルを(addFileを介して)ダウンロードします。次に、ファイルがダウンロードされた場所へのパスを取得します。最後に、そのパスを使用してそのファイルをRDDにロードします。

関連する問題