2012-04-10 35 views
6

在我的工作中,我需要解析許多歷史日誌。個別客戶(有成千上萬個)可能有數百個按日期分列的日誌子目錄。例如:將目錄不是文件傳遞給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的數據流允許我指定的目錄作爲工作項目一個簡單的方法?

+0

wildcarding/globs should work,try'-input file:/// mnt/logs/Customer _ */**/*。log' – 2012-04-10 20:32:20

+0

Globbing不是答案:首先,它只能找到給定的文件目錄樹中的級別而不是多級;其次,正如我最初描述的那樣,目錄和子目錄的數量是巨大的(事實上,遠遠超出了沒有xargs的shell擴展),走樹的時間正是我想要分發的問題的一部分。 (剛纔你所說的globbing會花費幾天,從字面上看,用1 ms rtt。) – 2012-04-10 20:56:02

+1

有一段時間我有一些回憶,hadoop支持雙星(**)符號的遞歸球體,但一個快速測試在我的控制檯說不然 – 2012-04-10 21:16:59

回答

1

我想你需要研究編寫一個可以傳遞根目錄的自定義InputFormat,它會爲每個客戶創建一個分割,然後每個分割的記錄讀取器將執行目錄遍歷並推送文件內容到您的映射器

+0

我不清楚hadoop-streaming可以接受任何其他輸入格式。它可以? – 2012-04-11 20:51:50

+0

http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html - 請參閱'-inputformat'參數 – 2012-04-11 21:04:36

+0

是的。但是,如果我將其更改爲不同的現有InputFormat(例如,org.apache.hadoop.mapred.KeyValueTextInputFormat),它仍會抱怨「不是文件。「 – 2012-04-12 00:44:17

0

Hadoop支持輸入路徑爲正則表達式。我還沒有嘗試過很多複雜的正則表達式,但簡單的佔位符*確實有效。

所以你的情況,我認爲,如果你已經在爲你的輸入路徑下它會工作:

file:///mnt/logs/Customer_Name/*/* 

最後一個星號,則可能不需要在最終目錄中的所有文件會自動添加爲輸入路徑。

+0

我可以知道爲什麼這是低票?這確實是一個簡單的方法來傳遞目錄作爲你的輸入路徑,只是你需要事先知道深度,我已經成功地使用了它很多次。 – Amar 2014-01-02 11:04:03

+0

它不起作用,它只能找到給定級別的文件。 – Liton 2016-08-21 19:46:50