我想知道如何将数据从 EMR 集群的 HDFS 文件系统移动到 S3 存储桶。我认识到我可以直接在 Spark 中写入 S3,但原则上,之后执行它也应该很简单,到目前为止,我还没有发现在实践中这是正确的。
AWS 文档建议s3-dist-cp
用于在 HDFS 和 S3 之间移动数据。这文档 http://docs.aws.amazon.com/emr/latest/ReleaseGuide/UsingEMR_s3distcp.html for s3-dist-cp
规定 HDFS 源应以 URL 格式指定,即hdfs://path/to/file
。到目前为止,我已使用以下命令在 HDFS 和本地文件系统之间移动数据hadoop fs -get
,其语法为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
我尝试过单个文件和整个目录。在每种情况下,我都会收到源文件不存在的错误。我究竟做错了什么?
相对和/或非完全限定路径会根据默认文件系统(在 core-site.xml 中配置为 fs.defaultFS,在 EMR 上默认为 hdfs)和当前工作目录(默认)自动解析为完全限定路径到/用户/。
在 EMR 上,像 /path/to/file 这样的绝对路径相当于 hdfs:///path/to/file。像 path/to/file 这样的相对路径解析为 hdfs:///user/hadoop/path/to/file (假设您以 hadoop 用户身份运行命令)。
您的 hdfs:// 路径遇到“文件未找到”错误的原因是(对于大多数示例)您将主机名放在了错误的位置,因为主机名前有太多斜杠。如果包含主机名,则其前面应该只有两个斜杠。不过,您实际上不需要包含主机名,因此您也可以编写 hdfs:///path/to/file。 (连续三个斜杠意味着将使用默认主机名。)在大多数示例中,因为您有三个斜杠and包括主机名,它将主机名作为路径的一部分,而不是主机名。
在第四个示例(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”都是有效且等效的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)