我们需要在 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&destination
而不是 Rename
,还有什么可以工作?
最佳答案
WebHDFS 本身不在其界面中提供复制操作。 WebHDFS 接口(interface)提供较低级别的文件系统原语。复制操作是使用这些原始操作来完成其工作的更高级别的应用程序。
针对 webhdfs:
URL 的 hdfs dfs -cp
的实现基本上结合了 op=OPEN和 op=CREATE调用完成复制。您可能会在脚本中重新实现该逻辑的一个子集。如果你想追求那个方向,CopyCommands
类是 Apache Hadoop 代码库中了解其工作原理的良好起点。
这是它如何工作的起点。/hello1 中有一个现有文件,我们要将其复制到/hello2。此脚本调用 curl
打开/hello1 并将输出通过管道传输到另一个 curl
命令,该命令使用标准输入作为输入源创建/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
But my requirement is to connect from an external unix box, automated kerberos login into hdfs and then move the files within hdfs, hence the curl.
另一种选择是在您的外部主机上安装仅客户端 Hadoop。您将安装 Hadoop 软件和来自 Hadoop 集群的相同配置文件,然后您可以发出 hdfs dfs -cp
命令而不是运行 curl
命令HDFS。
关于shell - Curl,Hadoop 上的 Kerberos 身份验证文件副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915786/