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

时间:2017-09-09 23:14:01

标签: hadoop amazon-s3 emr amazon-emr

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

AWS文档建议s3-dist-cp用于在HDFS和S3之间移动数据。 s3-dist-cp documentation表示应以URL格式指定HDFS源,即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:// ... - - s3:// my-bucket / destination

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

1 个答案:

答案 0 :(得分:4)

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

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

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