相关疑难解决方法(0)

从技术上讲,s3n,s3a和s3有什么区别?

我知道https://wiki.apache.org/hadoop/AmazonS3的存在以及以下词语:

S3 Native FileSystem(URI scheme:s3n)用于在S3上读取和写入常规文件的本机文件系统.此文件系统的优点是您可以访问使用其他工具编写的S3上的文件.相反,其他工具可以访问使用Hadoop编写的文件.缺点是S3强加的文件大小限制为5GB.

S3A(URI方案:s3a)S3 Native的继承者s3n fs,S3a:系统使用亚马逊的库与S3交互.这允许S3a支持更大的文件(不超过5GB限制),更高性能的操作等等.文件系统旨在替代S3 Native的/后继者:只需替换URL模式,也可以从s3a访问从s3n:// URL访问的所有对象.

S3 Block FileSystem(URI scheme:s3)由S3支持的基于块的文件系统.文件存储为块,就像它们在HDFS中一样.这允许有效地实现重命名.此文件系统要求您为文件系统专用存储桶 - 不应使用包含文件的现有存储桶,也不应将其他文件写入同一存储桶.此文件系统存储的文件可能大于5GB,但它们不能与其他S3工具互操作.

为什么URI上的字母更改会产生这样的差异?例如

val data = sc.textFile("s3n://bucket-name/key")
Run Code Online (Sandbox Code Playgroud)

val data = sc.textFile("s3a://bucket-name/key")
Run Code Online (Sandbox Code Playgroud)

这种变化背后的技术差异是什么?有什么好文章我可以读到这个吗?

amazon-s3 amazon-web-services aws-sdk

105
推荐指数
2
解决办法
5万
查看次数

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

尝试使用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 ...
Run Code Online (Sandbox Code Playgroud)

IOException异常:没有文件系统的方案:S3N与发生错误:

  • 开发机器上的Spark 1.31或1.40(没有Hadoop库)
  • Hortonworks Sandbox HDP v2.2.4(Hadoop 2.60)运行,它集成了Spark 1.2.1开箱即用
  • 使用s3://或s3n:// scheme

这个错误的原因是什么?缺少依赖,缺少配置或误用sc.textFile()

或者可能是因为这个帖子似乎暗示了影响Hadoop 2.60特有的Spark构建的错误.我将尝试Spark for Hadoop 2.40,看看这是否解决了这个问题.

hortonworks-data-platform apache-spark rdd

45
推荐指数
7
解决办法
9万
查看次数