尝试使用 Spark-shell 读取位于 S3 中的文件:
scala> val myRdd = sc.textFile("s3n://myBucket/myFile1.log")
lyrics: org.apache.spark.rdd.RDD[String] = s3n://myBucket/myFile1.log MappedRDD[55] at textFile at <console>:12
scala> myRdd.count
java.io.IOException: No FileSystem for scheme: s3n
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2607)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2614)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
... etc ...
发生IOException:方案没有文件系统:s3n错误:
- 开发计算机上的 Spark 1.31 或 1.40(无 Hadoop 库)
- 从 Hortonworks Sandbox HDP v2.2.4 运行(Hadoop 2.60) 集成了开箱即用的 Spark 1.2.1
- 使用 s3://或 s3n://方案
这个错误的原因是什么?缺少依赖项、缺少配置或误用 sc.textFile()
?
或者这可能是由于影响 Hadoop 2.60 特定的 Spark 构建的错误所致,如 post似乎建议。我将尝试 Spark for Hadoop 2.40,看看是否可以解决问题。
最佳答案
确认这与针对 Hadoop 2.60 的 Spark 构建有关。刚刚安装Spark 1.4.0 "Pre built for Hadoop 2.4 and later" (而不是 Hadoop 2.6)。现在代码可以正常工作了。
sc.textFile("s3n://bucketname/Filename")
现在引发另一个错误:
java.lang.IllegalArgumentException: AWS Access Key ID and Secret Access Key must be specified as the username or password (respectively) of a s3n URL, or by setting the fs.s3n.awsAccessKeyId or fs.s3n.awsSecretAccessKey properties (respectively).
下面的代码使用S3 URL格式来显示Spark可以读取S3文件。使用开发机器(无 Hadoop 库)。
scala> val lyrics = sc.textFile("s3n://MyAccessKeyID:MySecretKey@zpub01/SafeAndSound_Lyrics.txt")
lyrics: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at textFile at <console>:21
scala> lyrics.count
res1: Long = 9
更好:如果 AWS key 包含前向“/”,则上述 S3N URI 中内联 AWS 凭证的代码将会中断。在 SparkContext 中配置 AWS 凭证即可修复此问题。无论 S3 文件是公共(public)的还是私有(private)的,代码都可以工作。
sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "BLABLA")
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "....") // can contain "/"
val myRDD = sc.textFile("s3n://myBucket/MyFilePattern")
myRDD.count
关于java - Spark 使用 sc.textFile 从 S3 读取文件(“s3n ://. ..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30851244/