列出EMR上的S3文件夹

时间:2017-05-15 13:03:29

标签: amazon-web-services hadoop amazon-s3 amazon-emr

我无法理解如何在火花作业期间简单地在EMR上列出S3存储桶的内容。 我想做以下

Configuration conf = spark.sparkContext().hadoopConfiguration();
FileSystem s3 = S3FileSystem.get(conf);
List<LocatedFileStatus> list = toList(s3.listFiles(new Path("s3://mybucket"), false))

这总是失败并出现以下错误

java.lang.IllegalArgumentException: Wrong FS: s3://*********/, expected: hdfs://**********.eu-central-1.compute.internal:8020

在hadoopConfiguration fs.defaultFS -> hdfs://**********.eu-central-1.compute.internal:8020

我理解它的方式如果我不使用协议只是/ myfolder / myfile而不是hdfs:// myfolder / myfile它将默认为df.defaultFS。 但我希望如果我指定我的s3:// mybucket / fs.defaultFS应该无关紧要。

如何访问目录信息? spark.read.parquet(“s3://mybucket/*.parquet”)工作得很好但是对于这个任务我需要检查一些文件的存在,并且还想删除一些。我假设org.apache.hadoop.fs.FileSystem是正确的工具。

PS:我也不明白日志记录是如何工作的。如果我使用部署模式集群(我想从s3部署无法在客户端模式下工作的jar),我只能在s3:// logbucket / j -... / containers / application中找到我的日志... /conatiner...0001。在S3中的那些节目之前有相当长的延迟。如何通过主服务器上的ssh找到它?或者是否有一些更快/更好的方法来检查火花应用程序日志? 更新:刚刚在/mnt/var/log/hadoop-yarn/containers下找到它们但它由纱线:纱线拥有,而作为hadoop用户,我无法读取它。 :(想法?

3 个答案:

答案 0 :(得分:0)

我不认为你正在接受FS;只需使用静态FileSystem.get()方法或Path.get()

即可

尝试以下方法: Path p = new Path("s3://bucket/subdir"); FileSystem fs = p.get(conf); FileStatus[] status= fs.listStatus(p);

关于日志,YARN UI应该通过节点管理器让你了解它们。

答案 1 :(得分:0)

在我的情况下,我需要阅读由先前的EMR作业生成的镶木地板文件,我正在寻找给定s3前缀的文件列表,但是好事情是我们不需要做所有这些事情,我们可以只需这样做: spark.read.parquet(bucket + prefix_directory)

答案 2 :(得分:0)

URI.create() 应该用于将其指向正确的文件系统。

val fs: FileSystem = FileSystem.get(spark.sparkContext.hadoopConfiguration)

val dirPaths = FileSystem.get(URI.create("<s3-path>"), fs.getConf).listStatus(new Path("<s3-path>"))```