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

时间:2014-12-15 05:10:39

标签: 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

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

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

提前致谢。

3 个答案:

答案 0 :(得分:21)

Spark用于访问S3的基础Hadoop API允许您使用glob expression指定输入文件。

来自the Spark docs

  

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

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

rdd = sc.textFile("s3://bucket/project1/20141201/logtype1/logtype1.*.gz")

仅为记录,您还可以使用逗号分隔列表指定文件,甚至可以将其与*?通配符混合使用。

例如:

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

简而言之,它的作用是:

  • *匹配所有字符串,因此在这种情况下,gz下的所有文件夹中的所有201412??文件都将被加载。
  • ?匹配单个字符,因此201412??将涵盖2014年12月的所有日期,例如2014120120141202,等等。
  • ,允许您一次将单独的文件加载到同一个RDD中,例如本例中的random-file.txt

有关S3路径的相应URL方案的一些注意事项:

  • 如果您在EMR上运行Spark,the correct URL scheme is s3://
  • 如果您正在运行基于Hadoop 2.7或更高版本的开源Spark(即没有专有的亚马逊库),s3a://是可行的方法。
  • s3n:// has been deprecated在开源方面支持s3a://。如果您在Hadoop 2.6或更早版本上运行Spark,则应该只使用s3n://

答案 1 :(得分:7)

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

val rdd = sc.textFile("s3n://<bucket>/<foo>/bar.*.gz")

那是s3n://不是 s3://

您还希望将自己的凭据置于conf/spark-env.sh AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

答案 2 :(得分:1)

在RStudio中使用AWS EMR和Spark 2.0.0以及SparkR我已经设法使用以下命令读取存储在S3中的gz压缩维基百科stat文件:

df <- read.text("s3://<bucket>/pagecounts-20110101-000000.gz")

同样,对于“2011年1月”下的所有文件,您可以使用上面的命令,如下所示:

df <- read.text("s3://<bucket>/pagecounts-201101??-*.gz")

有关更多方法,请参阅SparkR API文档。 https://spark.apache.org/docs/latest/api/R/read.text.html