【问题标题】:Converting hadoop fs paths to hdfs:// paths on EMR在 EMR 上将 hadoop fs 路径转换为 ​​hdfs:// 路径
【发布时间】:2018-02-18 12:41:21
【问题描述】:

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

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

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

  • hdfs:///[public IP]/path/to/file
  • hdfs:///[public IP]:8020/path/to/file
  • hdfs:///localhost/path/to/file
  • hdfs:///path/to/file
  • /path/to/file(以及许多变体)

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

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

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

【问题讨论】:

    标签: hadoop amazon-s3 emr amazon-emr


    【解决方案1】:

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

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

    您在 hdfs:// 路径中遇到“找不到文件”错误的原因是(对于您的大多数示例)您将主机名放在错误的位置,因为在主机名。如果包含主机名,则在它之前应该只有两个斜杠。您实际上并不需要包含主机名,因此您也可以编写 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 .

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 2010-10-13
      • 2014-01-28
      • 2016-01-07
      • 2017-08-23
      • 2010-10-27
      • 1970-01-01
      相关资源
      最近更新 更多