【问题标题】:Curl, Kerberos authenticated file copy on hadoop卷曲,Kerberos 在 hadoop 上经过身份验证的文件副本
【发布时间】:2017-07-05 01:23:32
【问题描述】:

我们需要在 HDFS 位置,在 HDFS 文件夹之间建立文件副本。我们目前在 shell 脚本循环中使用了 curl 命令,如下所示。

/usr/bin/curl -v --negotiate -u : -X PUT "<hnode>:<port>/webhdfs/v1/busy/rg/stg/"$1"/"$table"/"$table"_"$3".dsv?op=RENAME&destination=/busy/rg/data/"$1"/"$table"/"$table"_$date1.dsv"

然而,这实现了文件移动。我们需要建立一个文件副本,以便将文件保存在原始暂存位置。

想知道有没有对应的curl操作? op=RENAME&amp;destination 而不是 Rename,还有什么可以用的?

【问题讨论】:

  • 有什么原因你不能使用hdfs dfs -cp
  • 感谢您的回复。是的,当您在 hdfs 框内时,这有效。但我的要求是从外部 unix 框连接,自动 kerberos 登录到 hdfs,然后在 hdfs 中移动文件,因此 curl。
  • 提示一下,elinks(根据我的经验)将使用您的 kerberos 票证。

标签: shell hadoop curl webhdfs


【解决方案1】:

WebHDFS 本​​身并不在其界面中提供复制操作。 WebHDFS 接口提供较低级别的文件系统原语。复制操作是更高级别的应用程序,它使用这些原始操作来完成其工作。

hdfs dfs -cp 针对webhdfs: URL 的实现本质上结合了op=OPENop=CREATE 调用来完成复制。您可能会在脚本中重新实现该逻辑的子集。如果您想追求这个方向,CopyCommands 类是 Apache Hadoop 代码库中的一个很好的起点,可以了解它是如何工作的。

这是如何工作的起点。 /hello1 中有一个现有文件,我们希望将其复制到 /hello2。该脚本调用curl 打开/hello1 并将输出通过管道传送到另一个curl 命令,该命令使用stdin 作为输入源创建/hello2。

> hdfs dfs -ls /hello*
-rw-r--r--   3 cnauroth supergroup          6 2017-07-06 09:15 /hello1

> curl -sS -L 'http://localhost:9870/webhdfs/v1/hello1?op=OPEN' |
>     curl -sS -L -X PUT -d @- 'http://localhost:9870/webhdfs/v1/hello2?op=CREATE&user.name=cnauroth'

> hdfs dfs -ls /hello*
-rw-r--r--   3 cnauroth supergroup          6 2017-07-06 09:15 /hello1
-rw-r--r--   3 cnauroth supergroup          5 2017-07-06 09:20 /hello2

但我的要求是从外部 unix 框连接,自动 kerberos 登录到 hdfs,然后在 hdfs 中移动文件,因此 curl。

另一种选择是在您的外部主机上安装仅限客户端的 Hadoop。您将安装 Hadoop 软件和来自 Hadoop 集群的相同配置文件,然后您可以发出 hdfs dfs -cp 命令,而不是针对 HDFS 运行 curl 命令。

【讨论】:

  • 是的,结果就是这样。但出现“未指定 URL”错误:请承担格式。下一条评论中的代码
  • /usr/bin/curl -L --negotiate -u : -X GET "hdnode:hdport/webhdfs/v1/bus/rg/file1.dsv?op=OPEN" -o /etrade /home/suser/file11.dsv /usr/bin/curl -i -s --negotiate -u : –X PUT "hdnode:hdport/webhdfs/v1/bus/rg/data/file11.dsv?op=CREATE" | grep 位置:/usr/bin/curl -i -s --negotiate -u : -X PUT -T /etrade/home/suser/file11.dsv $Location
  • @SwathiR ,我已经编辑了我的答案,以显示如何将 OPEN 调用传递到 CREATE 调用的起点。这工作正常。我的示例是使用简单身份验证(无 Kerberos),但要使其在 Kerberos 安全集群中工作,只需将 SPNEGO 选项添加到 curl 调用,我看到您已经熟悉这些。我希望这会有所帮助。
  • 你好。感谢您的投入。是的,这种方法奏效了。
  • @SwathiR ,我很高兴听到这个成功!如果这有帮助,那么请考虑接受答案。 stackoverflow.com/help/someone-answers
【解决方案2】:

我不知道你使用什么发行版,如果你使用 Cloudera,请尝试通过 REST API 使用 BDR(备份、数据恢复模块)。

我用它来复制 hadoop 集群内和跨 hadoop 集群的文件/文件夹,它也适用于加密区域 (TDE)

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 2019-05-20
    • 2014-02-13
    • 1970-01-01
    • 2022-01-03
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多