我在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的最佳实践。
提前致谢。
答案 0 :(得分:21)
Spark用于访问S3的基础Hadoop API允许您使用glob expression指定输入文件。
所有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月的所有日期,例如20141201
,20141202
,等等。,
允许您一次将单独的文件加载到同一个RDD中,例如本例中的random-file.txt
。有关S3路径的相应URL方案的一些注意事项:
s3://
。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_ID
和AWS_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