我们需要在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"
然而,这实现了文件移动。我们需要建立一个文件复制,以便在原始的登台位置维护文件。
我想知道是否有相应的卷曲操作? op=RENAME&destination
代替Rename
,还有什么可行?
答案 0 :(得分:0)
单独的WebHDFS在其界面中不提供复制操作。 WebHDFS接口提供较低级别的文件系统原语。复制操作是一个更高级别的应用程序,它使用这些基本操作来完成其工作。
针对hdfs dfs -cp
网址webhdfs:
的实施基本上结合了op=OPEN和op=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中移动文件,因此卷曲。
另一个选项可能是外部主机上仅限客户端的Hadoop安装。您可以从Hadoop集群安装Hadoop软件和相同的配置文件,然后您可以发出hdfs dfs -cp
命令,而不是针对HDFS运行curl
命令。
答案 1 :(得分:0)
我不知道你使用什么发行版,如果你使用Cloudera,尝试使用REST API使用BDR(备份,数据恢复模块)。
我用它来复制hadoop集群中的文件/文件夹和hadoop集群,它也适用于加密区域(TDE)