Hadoop DistCp使用通配符?

zzz*_*mbo 16 hadoop

是否可以使用DistCp仅复制与特定模式匹配的文件?例如.对于/ foo我只想要*.log文件.

jav*_*dba 15

我意识到这是一个老线程.但我自己对这个问题的答案很感兴趣 - 而dk89也在2013年再次提出过问题.所以我们走了:

distcp不支持通配符.你最接近的是:

找到要复制的文件(源),然后使用grep过滤,使用awk格式化hdfs,并将结果输出到"input-files"列表:

hadoop dfs -lsr hdfs://localhost:9000/path/to/source/dir/ 
  | grep -e webapp.log.3. | awk '{print "hdfs\://localhost\:9000/" $8'}   > input-files.txt
Run Code Online (Sandbox Code Playgroud)

将输入文件列表放入hdfs

hadoop dfs -put input-files.txt  .
Run Code Online (Sandbox Code Playgroud)

创建目标目录

hadoop dfs -mkdir hdfs://localhost:9000/path/to/target/
Run Code Online (Sandbox Code Playgroud)

使用输入文件列表运行distcp并指定目标hdfs目录:

hadoop distcp -i -f input-files.txt hdfs://localhost:9000/path/to/target/  
Run Code Online (Sandbox Code Playgroud)


Gre*_*Cat 2

DistCp 实际上只是一个常规的 Map-Reduce 作业:您可以使用与用于常规 Map-Reduce 作业的输入相同的通配语法。一般来说,你可以直接使用foo/*.log就足够了。您可以在这里尝试hadoop fs -ls语句 - 如果 globbing 适用于fs -ls,那么 if 将适用于 DistCp (好吧,几乎,但差异相当微妙)。

  • 似乎不适用于 s3n:// 路径。Hadoop -ls 可与 s3n:// 通配符配合使用,不过……很奇怪。 (5认同)
  • 版本 2 支持通配符,文档位于:https://hadoop.apache.org/docs/r1.2.1/distcp2.html (2认同)