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方案的一些注意事项:
s3://
.s3a://
就是要走的路.s3n://
已经在开源方面被弃用了s3a://
.只有s3n://
在Hadoop 2.6或更早版本上运行Spark 时才应该使用.注意:在Spark 1.2下,正确的格式如下:
val rdd = sc.textFile("s3n://<bucket>/<foo>/bar.*.gz")
Run Code Online (Sandbox Code Playgroud)
这就是s3n://
,不 s3://
您还需要将您的凭据放入conf/spark-env.sh
as AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
.
归档时间: |
|
查看次数: |
12894 次 |
最近记录: |