在我的工作中,我需要解析許多歷史日誌。個別客戶(有成千上萬個)可能有數百個按日期分列的日誌子目錄。例如:將目錄不是文件傳遞給hadoop-streaming?
- 日誌/ Customer_One/2011-01-02-001
- 日誌/ Customer_One/2012-02-03-001
- 日誌/ Customer_One/2012-02-03-002
- 日誌/ Customer_Two/2009-03-03-001
- 日誌/ Customer_Two/2009-03-03-002
每個單獨的日誌集本身可能是五六級深,包含成千上萬的文件。
因此,我實際上希望個別地圖作業能夠處理子目錄的移動:簡單地列舉個別文件是我的分佈式計算問題的一部分!
不幸的是,當我嘗試將僅包含日誌子目錄的目錄傳遞給Hadoop時,它抱怨說我無法將這些子目錄傳遞給我的映射器。 (同樣,我已經寫了接受子目錄輸入):
$ hadoop jar "${HADOOP_HOME}/contrib/streaming/hadoop-streaming-${HADOOP_VERSION}.jar" -input file:///mnt/logs/Customer_Name/ -file mapper.sh -mapper "mapper.sh" -file reducer.sh -reducer "reducer.sh" -output .
[ . . . ]
12/04/10 12:48:35 ERROR security.UserGroupInformation: PriviledgedActionException as:cloudera (auth:SIMPLE) cause:java.io.IOException: Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 12/04/10 12:48:35 ERROR streaming.StreamJob: Error Launching job : Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 Streaming Command Failed! [[email protected] ~]$
有說服Hadoop的數據流允許我指定的目錄作爲工作項目一個簡單的方法?
wildcarding/globs should work,try'-input file:/// mnt/logs/Customer _ */**/*。log' – 2012-04-10 20:32:20
Globbing不是答案:首先,它只能找到給定的文件目錄樹中的級別而不是多級;其次,正如我最初描述的那樣,目錄和子目錄的數量是巨大的(事實上,遠遠超出了沒有xargs的shell擴展),走樹的時間正是我想要分發的問題的一部分。 (剛纔你所說的globbing會花費幾天,從字面上看,用1 ms rtt。) – 2012-04-10 20:56:02
有一段時間我有一些回憶,hadoop支持雙星(**)符號的遞歸球體,但一個快速測試在我的控制檯說不然 – 2012-04-10 21:16:59