2017-02-03 33 views
0

我看到幾個帖子在這裏,並在谷歌搜索org.apache.hadoop.mapred.InvalidInputException 但大多數處理HDFS文件或捕獲的錯誤。我的問題是,儘管我可以從spark-shell讀取一個CSV文件,但是從編譯的JAR運行它不斷返回org.apache.hadoop.mapred.InvalidInputException錯誤。星火S3 CSV read返回org.apache.hadoop.mapred.InvalidInputException

罐子的工藝粗糙:
1.從S3 JSON文件(這工作)的拼花文件S3
2.讀取讀取(這也成功)
3.編寫一個查詢的結果將#1和#2映射到S3中的鑲木文件(也成功)
4.從同一個存儲區#3讀取配置csv文件。 (失敗)

這些都是我曾嘗試在代碼中的各種方法:

1. val osRDD = spark.read.option("header","true").csv("s3://bucket/path/") 
2. val osRDD = spark.read.format("com.databricks.spark.csv").option("header", "true").load("s3://bucket/path/") 

所有兩個以上S3的變化,S3A和S3N前綴正常工作從REPL但JAR裏面卻返回: org.apache.hadoop.mapred.InvalidInputException:輸入路徑不存在:s3://bucket/path/eventsByOS.csv 因此,它發現該文件但無法讀取它。

認爲這是一個權限問題,我曾嘗試:

a. export AWS_ACCESS_KEY_ID=<access key> and export AWS_SECRET_ACCESS_KEY=<secret> from the Linux prompt. With Spark 2 this has been sufficient to provide us access to the S3 folders up until now. 
b. .config("fs.s3.access.key", <access>) 
.config("fs.s3.secret.key", <secret>) 
.config("fs.s3n.access.key", <access>) 
.config("fs.s3n.secret.key", <secret>) 
.config("fs.s3a.access.key", <access>) 
.config("fs.s3a.secret.key", <secret>) 

此故障之前,代碼位於同一個桶拼花文件讀取和寫入文件拼花到同一桶。 CSV文件的大小僅爲4.8 KB。

任何想法,爲什麼這是失敗?

謝謝!

添加堆棧跟蹤:

org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:253) 
org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:201) 
org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:281) 
org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:202) 
org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) 
org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) 
scala.Option.getOrElse(Option.scala:121) 
org.apache.spark.rdd.RDD.partitions(RDD.scala:250) 
org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) 
org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) 
org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) 
scala.Option.getOrElse(Option.scala:121) 
org.apache.spark.rdd.RDD.partitions(RDD.scala:250) 
org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) 
org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) 
org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) 
scala.Option.getOrElse(Option.scala:121) 
org.apache.spark.rdd.RDD.partitions(RDD.scala:250) 
org.apache.spark.rdd.RDD$$anonfun$take$1.apply(RDD.scala:1332) 
org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 
org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) 
org.apache.spark.rdd.RDD.withScope(RDD.scala:362) 
org.apache.spark.rdd.RDD.take(RDD.scala:1326) 
org.apache.spark.rdd.RDD$$anonfun$first$1.apply(RDD.scala:1367) 
org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 
org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) 
org.apache.spark.rdd.RDD.withScope(RDD.scala:362) 
org.apache.spark.rdd.RDD.first(RDD.scala:1366) 
org.apache.spark.sql.execution.datasources.csv.CSVFileFormat.findFirstLine(CSVFileFormat.scala:206) 
org.apache.spark.sql.execution.datasources.csv.CSVFileFormat.inferSchema(CSVFileFormat.scala:60) 
org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:184) 
org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:184) 
scala.Option.orElse(Option.scala:289) 
org.apache.spark.sql.execution.datasources.DataSource.org$apache$spark$sql$execution$datasources$DataSource$$getOrInferFileFormatSchema(DataSource.scala:183) 
org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:387) 
org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152) 
org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:415) 
org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:352) 
+0

什麼是完整的堆棧跟蹤? –

+0

感謝提醒@SteveLoughran :-) –

回答

0

沒有涌出來時,我粘貼進棧的IDE,但我看的Hadoop的更高版本,不能切換當前對舊的。

  1. 看一看these instructions
  2. 那陸地衛星GZ文件實際上是一個CSV文件,你可以嘗試讀取;這是我們通常用於測試的那個,因爲它在那裏並且可以免費使用。首先看看你是否可以使用它。
  3. 如果使用spark 2.0,請使用spark自帶的CSV包。
  4. 請使用S3a,而不是其他的。
+0

謝謝史蒂夫。這是一套很棒的指示。雖然他們沒有幫助讀取CSV,但他們確實幫助我更快地寫入文件。 spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2本身就是一個巨大的改進。 –

+0

是的,改名爲殺手。有一些正在進行的工作來解決這個問題,[HADOOP-13786](https://issues.apache.org/jira/browse/HADOOP-13786);尚未準備好使用,但歡迎您在接近發佈時幫助進行測試。 –

0

我通過爲相應的方法添加特定的Hadoop配置(此處爲示例中的s3)來解決此問題。奇怪的是,上面的安全措施適用於Spark 2.0中除了讀取CSV以外的所有內容。

此代碼使用S3解決了我的問題。

spark.sparkContext.hadoopConfiguration.set("fs.s3.awsAccessKeyId", p.aws_accessKey) 
spark.sparkContext.hadoopConfiguration.set("fs.s3.awsSecretAccessKey",p.aws_secretKey)