我不明白如何在火花作业期间简单地列出 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
在 hadoopConfigurationfs.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 找到它?或者是否有一些更快/更好的方法来检查Spark应用程序日志? 更新:刚刚在/mnt/var/log/hadoop-yarn/containers
下找到它们,但它归 yarn:yarn 所有,作为 hadoop 用户,我无法阅读它。:(想法?
就我而言,我需要读取由以前的 EMR 作业生成的镶木地板文件,我正在寻找给定 s3 前缀的文件列表,但好在我们不需要做所有这些,我们可以简单地这样做: spark.read.parquet(bucket+prefix_directory)
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>"))```
我认为你没有正确选择FS;只需使用静态FileSystem.get()
方法,或者Path.get()
尝试类似操作:
Path p = new Path("s3://bucket/subdir");
FileSystem fs = p.get(conf);
FileStatus[] status= fs.listStatus(p);
关于日志,YARN UI 应该允许您通过节点管理器访问它们。