2016-11-02 9 views
2

スパーク・シェルの興味深い動作を経験しました。作業ディレクトリが/私はCSVを読むことができませんが、それが他のディレクトリであれば動作します。 :スパークの問題CSVを読む

[email protected] ~> docker run -it --rm -v /data/spark- 

test:/mnt/data localhost:5000/spark-master:2.0.1 sh 
/# /app/spark-2.0.1/bin/spark-shell 
Setting default log level to "WARN". 
To adjust logging level use sc.setLogLevel(newLevel). 
16/11/02 10:01:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
16/11/02 10:01:59 WARN spark.SparkContext: Use an existing SparkContext, some configuration may not take effect. 
Spark context Web UI available at http://172.17.0.1:4040 
Spark context available as 'sc' (master = local[*], app id = local-1478080919699). 
Spark session available as 'spark'. 
Welcome to 
     ____    __ 
    /__/__ ___ _____/ /__ 
    _\ \/ _ \/ _ `/ __/ '_/ 
    /___/ .__/\_,_/_/ /_/\_\ version 2.0.1 
     /_/ 

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102) 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> spark.read.option("header", "true").option("inferSchema", "true").csv("file:///mnt/data/test.csv").printSchema() 
java.io.IOException: No FileSystem for scheme: null 
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660) 
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667) 
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) 
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) 
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) 
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) 
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) 
    at org.apache.spark.sql.catalyst.catalog.SessionCatalog.makeQualifiedPath(SessionCatalog.scala:115) 
    at org.apache.spark.sql.catalyst.catalog.SessionCatalog.createDatabase(SessionCatalog.scala:145) 
    at org.apache.spark.sql.catalyst.catalog.SessionCatalog.<init>(SessionCatalog.scala:89) 
    at org.apache.spark.sql.internal.SessionState.catalog$lzycompute(SessionState.scala:95) 
    at org.apache.spark.sql.internal.SessionState.catalog(SessionState.scala:95) 
    at org.apache.spark.sql.internal.SessionState$$anon$1.<init>(SessionState.scala:112) 
    at org.apache.spark.sql.internal.SessionState.analyzer$lzycompute(SessionState.scala:112) 
    at org.apache.spark.sql.internal.SessionState.analyzer(SessionState.scala:111) 
    at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:49) 
    at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:64) 
    at org.apache.spark.sql.SparkSession.baseRelationToDataFrame(SparkSession.scala:382) 
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:143) 
    at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:413) 
    at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:349) 
    ... 48 elided 

/# cd /mnt/data/ 
/mnt/data # /app/spark-2.0.1/bin/spark-shell 
Setting default log level to "WARN". 
To adjust logging level use sc.setLogLevel(newLevel). 
16/11/02 10:02:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
16/11/02 10:02:26 WARN spark.SparkContext: Use an existing SparkContext, some configuration may not take effect. 
Spark context Web UI available at http://172.17.0.1:4040 
Spark context available as 'sc' (master = local[*], app id = local-1478080946728). 
Spark session available as 'spark'. 
Welcome to 
     ____    __ 
    /__/__ ___ _____/ /__ 
    _\ \/ _ \/ _ `/ __/ '_/ 
    /___/ .__/\_,_/_/ /_/\_\ version 2.0.1 
     /_/ 

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102) 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> spark.read.option("header", "true").option("inferSchema", "true").csv("file:///mnt/data/test.csv").printSchema() 
root 
|-- 2MASS: string (nullable = true) 
|-- RAJ2000: double (nullable = true) 
|-- DEJ2000: double (nullable = true) 
|-- errHalfMaj: double (nullable = true) 
|-- errHalfMin: double (nullable = true) 
|-- errPosAng: integer (nullable = true) 
|-- Jmag: double (nullable = true) 
|-- Hmag: double (nullable = true) 
|-- Kmag: double (nullable = true) 
|-- e_Jmag: double (nullable = true) 
|-- e_Hmag: double (nullable = true) 
|-- e_Kmag: double (nullable = true) 
|-- Qfl: string (nullable = true) 
|-- Rfl: integer (nullable = true) 
|-- X: integer (nullable = true) 
|-- MeasureJD: double (nullable = true) 

これは意味をなさないので、なぜこれが起こっているのか理解したいと思います。この例のPWDは、読み込まれたファイルが格納されていたのですが、私は他のランダムなパスとその理由をテストしました。おそらくこれはバグであり、私はバグレポートを提出するべきですか?

EDITジョブを起動するとき、私はspark.sql.warehouse.dirのデフォルト値は{working-dir}/spark-warehouseで火花提出

答えて

1

を経由して、まったく同じ動作を取得:HDFS

からEDIT 2を読みながら行動がまったく同じです。ルートから実行すると//spark-warehouseになり、そのようなパス(SessionCatalog.makeQualifiedPath)でhadoopPath.getFileSystem(hadoopConf)が呼び出されると、Hadoopはそのスキームを特定できません。

回避策は単純です - 例えば、file:/で始まるいくつかのまともな値では、このパラメータを上書きしながら、あなたの火花シェルを起動します。

/app/spark-2.0.1/bin/spark-shell --conf spark.sql.warehouse.dir=file:/tmp/spark-warehouse 

をこの不快な行動はthis open issueに関連するかもしれないが、私はよく分かりません - ルート以外の値でも機能するため、別の問題になる可能性があります。

+0

これはSpark 2.0.2で解決されるかもしれません。ありがとうございます! –