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