java - Spark 使用 sc.textFile 从 S3 读取文件(“s3n ://. ..)

标签 java scala apache-spark rdd hortonworks-data-platform

尝试使用 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/

相关文章:

scala - 来自对余积进行运算的单态函数的多函数

xml - 有条件地在 XML 文字中包含属性

java - Apache Spark Streaming 的集成测试失败

Scala 括号 java.lang.StackOverflowError

json - 在 Apache Spark 中读取多行 JSON

python - 为什么我的 Spark 比纯 Python 运行得慢?性能比较

java - 指定 Hibernate 的 aliasToBean 使用的 setter

java - Junit mockito when(..).thenReturn() 抛出 NullPointerException

java - 在抽象类中实现接口(interface)参数

javascript - HTTP 状态 404 打开 HTML 页面时请求的资源不可用