在 EMR 上将 hadoop fs 路径转换为 ​​hdfs:// 路径

Converting hadoop fs paths to hdfs:// paths on EMR

我想知道如何将数据从 EMR 集群的 HDFS 文件系统移动到 S3 存储桶。我承认我可以在 Spark 中直接写入 S3,但原则上它之后应该也很简单,到目前为止我还没有发现在实践中是这样。

AWS 文档建议 s3-dist-cp 用于在 HDFS 和 S3 之间移动数据。 s3-dist-cpdocumentation 指出 HDFS 源应以 URL 格式指定,即 hdfs://path/to/file。到目前为止,我已经通过使用 hadoop fs -get 在 HDFS 和我的本地文件系统之间移动数据,它采用 path/to/file 而不是 hdfs://path/to/file 的语法。不清楚两者之间如何映射。

我正在从 SSH 连接到主节点。我尝试了以下,每个都有两个和三个斜杠:

在每种情况下,我的命令都按照文档进行格式化:

s3-dist-cp --src hdfs://... --dest s3://my-bucket/destination

我试过单个文件和整个目录。在每种情况下,我都会收到源文件不存在的错误消息。我做错了什么?

相对and/or非完全限定路径根据默认文件系统自动解析为完全限定路径(在core-site.xml中配置为fs.defaultFS,默认为hdfs在 EMR 上)和当前工作目录,默认为 /user/。

在 EMR 上,像 /path/to/file 这样的绝对路径等同于 hdfs:///path/to/file。像 path/to/file 这样的相对路径解析为 hdfs:///user/hadoop/path/to/file(假设你是 运行 作为 hadoop 用户的命令)。

您的 hdfs:// 路径遇到 "file not found" 错误的原因是(对于您的大多数示例)您将主机名放在错误的位置,因为斜杠太多在主机名之前。如果包含主机名,则它前面应该只有两个斜杠。你实际上不需要包括主机名,所以你也可以写 hdfs:///path/to/file。 (连续三个斜杠表示将使用默认主机名。)在大多数示例中,由于三个斜杠 包含主机名,因此主机名成为其中的一部分路径而不是主机名。

在您的第四个示例 (hdfs:///path/to/file) 中,该路径实际上是一个有效路径,但它与 path/to/file 指的不是同一个东西,它是一个相对路径小路。与我上面提到的类似,/path/to/file 相当于 hdfs:///path/to/file,而 path/to/file 相当于 hdfs:///user/hadoop/path/to/file.

顺便说一下,如果您使用主机名,我很确定您需要使用私有主主机名,而不是 public IP。 (不过,同样,您可以完全不使用主机名,只需连续使用三个斜杠来表示您不包括主机名。)我建议不要使用主机名,因为那样您就需要随时更改路径你 运行 在不同的集群上执行命令。

最后,"hadoop fs -get" 仅采用非 uri 样式路径而 s3-dist-cp 仅采用 uri 样式路径并不完全正确。其中任何一个都采用任何一种路径。 "hadoop fs -get /path/to/file" 和 "hadoop fs -get hdfs:///path/to/file" 均有效且等效。