【发布时间】:2021-11-01 13:02:08
【问题描述】:
我有很多文件要在 HDFS 上复制,我遇到了操作系统的最大参数列表限制。当前可行的解决方法是为要处理的单个文件生成单个命令。不过,这需要时间。
我正在尝试使用 xargs 来绕过参数限制并减少处理时间。但我无法让它工作。
这是目前的情况。
我回显(因为我在某处读到回显不受参数限制)文件名并将它们通过管道传输到 xarg。
echo "/user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl" | xargs -I % hdfs dfs -cp -p % /user/florian_castelain/test/xargs/
但是这会引发:
cp: `/user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl': 没有这样的文件或目录
基于this example,我尝试过:
echo "/user/florian_castelain/test/yolo" "/user/florian_castelain/ignore_dtl" | xargs -0 -I % hdfs dfs -cp -p % /user/florian_castelain/test/xargs/
哪些打印:
cp: `/user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl
但是根本没有复制任何文件。
如何使用xarg 结合hdfs dfs -cp 命令一次处理多个文件的副本?
- Hadoop 2.6.0-cdh5.13.0
编辑 1
使用详细标志和此配置',我有以下输出:
echo "/user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl" | xargs -I % -t hdfs dfs -cp -p % /user/florian_castelain/test/xargs/
hdfs dfs -cp -p /user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl /user/florian_castelain/test/xargs/
哪个抛出:
cp: `/user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl': 没有这样的文件或目录
手动执行此命令时可以正常工作。这是为什么呢?
编辑 2
根据 jjo 的回答,我尝试了以下方法:
printf "%s\n" /user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl | xargs -0 -t -I % hdfs dfs -cp -p % /user/florian_castelain/test/xargs/
哪些打印:
hdfs dfs -cp -p /user/florian_castelain/test/yolo
/user/florian_castelain/ignore_dtl
/user/florian_castelain/test/xargs/
并且不复制任何东西。
所以我尝试在传递给 xargs 之前删除换行符:
printf "%s\n" /user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl | tr -d "\n" | xargs -0 -t -I % hdfs dfs -cp -p % /user/florian_castelain/test/xargs/
哪些打印:
hdfs dfs -cp -p /user/florian_castelain/test/yolo/user/florian_castelain/ignore_dtl /user/florian_castelain/test/xargs/
但也没有任何内容被复制。 :(
【问题讨论】:
标签: hdfs ubuntu-16.04 xargs