【问题标题】:How to use hdfs dfs cp with xargs to work around linux argument list limit?如何使用 hdfs dfs cp 和 xargs 来解决 linux 参数列表限制?
【发布时间】: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


    【解决方案1】:

    我看到你面临的问题是yolo 中的空格,加上 xargs 以换行符分隔的标准输入条目

    由于您的文件是本地文件,您应该利用 find -0 | xargs -0 例如:

    find /user/florian_castelain/foo/bar -type f -0 | xargs -0 -I hdfs dfs -cp -p % /some/dst
    

    如果您仍然需要/想要为 xargs 提供“空格分隔的文件名”,请改用 printf "%s\n"(这也是 bash 中的内置函数 echo),以便 每个文件将输出一个换行符:

    printf "%s\n" /user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl | xargs -I %  hdfs dfs -cp -p % /some/dst
    

    【讨论】:

    • 我需要 xargs 来处理多个参数。第二个选项每个参数启动一个命令,因此不可行。第一个选项也不可行,因为参数列表是从 python 脚本构建的。我根据您的建议用我尝试过的方法更新了我的问题,但没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多