如何从S3读取多个gzip压缩文件到一个RDD?

shi*_*eng 14 amazon-s3 apache-spark

我在S3上存储了许多gzip压缩文件,这些文件按项目和每小时组织,文件路径的模式如下:

s3://<bucket>/project1/20141201/logtype1/logtype1.0000.gz
s3://<bucket>/project1/20141201/logtype1/logtype1.0100.gz
....
s3://<bucket>/project1/20141201/logtype1/logtype1.2300.gz
Run Code Online (Sandbox Code Playgroud)

由于数据应该每天进行分析,我必须下载并解压缩属于特定日期的文件,然后将内容组合为单个RDD.

应该有几种方法可以做到这一点,但我想知道Spark的最佳实践.

提前致谢.

Nic*_*mas 22

Spark用于访问S3的基础Hadoop API允许您使用glob表达式指定输入文件.

来自Spark文档:

Spark的所有基于文件的输入方法(包括textFile)都支持在目录,压缩文件和通配符上运行.例如,你可以使用textFile("/my/directory"),textFile("/my/directory/*.txt")textFile("/my/directory/*.gz").

因此,在您的情况下,您应该能够使用以下内容将所有这些文件作为单个RDD打开:

rdd = sc.textFile("s3://bucket/project1/20141201/logtype1/logtype1.*.gz")
Run Code Online (Sandbox Code Playgroud)

只是为了记录,您还可以使用逗号分隔的列表指定文件,甚至可以将它与*?通配符混合使用.

例如:

rdd = sc.textFile("s3://bucket/201412??/*/*.gz,s3://bucket/random-file.txt")
Run Code Online (Sandbox Code Playgroud)

简而言之,这样做是:

  • *场比赛的所有字符串,所以在这种情况下,所有gz的所有文件夹下的文件201412??将被载入.
  • ?匹配单个字符,所以201412??将覆盖在2014年12月像所有的日子20141201,20141202等.
  • ,让你只是一次加载单独的文件到同一RDD,像random-file.txt在这种情况下.

关于S3路径的适当URL方案的一些注意事项:

  • 如果您在EMR上运行Spark,则使用正确的URL方案s3://.
  • 如果你正在运行基于Hadoop 2.7或更新版本的开源Spark(即没有专有的亚马逊库),那s3a://就是要走的路.
  • s3n://已经在开源方面被弃用s3a://.只有s3n://在Hadoop 2.6或更早版本上运行Spark 时才应该使用.


Jos*_*ust 7

注意:在Spark 1.2下,正确的格式如下:

val rdd = sc.textFile("s3n://<bucket>/<foo>/bar.*.gz")
Run Code Online (Sandbox Code Playgroud)

这就是s3n://, s3://

您还需要将您的凭据放入conf/spark-env.shas AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY.