2011-04-18 136 views

回答

2

DistCp實際上只是一個常規的map-reduce作業:您可以使用與用於輸入常規map-reduce作業相同的通配語法。一般來說,你可以使用foo/*.log,這應該足夠了。你可以在這裏試用hadoop fs -ls聲明 - 如果globbing與fs -ls一起使用,那麼如果能與DistCp一起工作(好吧,差不多,但差異相當微妙)。

+4

似乎沒有與s3n://路徑一起工作。 Hadoop -ls可以和s3n://通配符一起使用,但是很奇怪。 – 2013-03-18 15:34:02

+1

這個問題是從2011年開始的,是否有通過通配符啓用distcp的更改? – Dimitry 2013-06-18 19:40:12

+0

版本2支持通配符,doc在這裏:https://hadoop.apache.org/docs/r1.2.1/distcp2.html – 2016-08-01 20:27:34

12

我意識到這是一個古老的線程。但我自己對這個問題的答案感興趣 - 而且dk89在2013年也再次提出了問題。所以,我們來看看:

distcp不支持通配符。你可以做的最接近的是:

找到您要複製(源)的文件,過濾器,然後用grep,使用AWK HDFS格式,並把結果輸出到「輸入文件」列表:

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

把輸入文件列表到HDFS

hadoop dfs -put input-files.txt . 

創建目標目錄

hadoop dfs -mkdir hdfs://localhost:9000/path/to/target/ 

運行distcp使用輸入文件列表並指定目標hdfs目錄:

hadoop distcp -i -f input-files.txt hdfs://localhost:9000/path/to/target/