Hadoopのインプット指定にワイルドカードが使える件について

Pocket

 

Hadoopへのインプットはふつう、ディレクトリかファイルの指定で行う。

しかし以下のような場合にどうするか。

  • 複数のディレクトリの下にあるファイルをhadoopに処理させたいとき。
  • 特定拡張子のファイルのみをhadoopに処理させたいとき。

実はワイルドカードが使えるので、それで解決。
以下、hadoop-1.0.0で確認。

ケース1:複数ディレクトリの下に処理対象ファイルがある場合。

 

top-+-dir1-file1
    |     -file2
    |     -file3
    |
    +-dir2-file4
          -file5
          -file6

以上のような状態でhadoopへのinputにtopを指定すると、hadoopはdir1をファイルとして処理しようとし、失敗する。
たとえばこのように。

13/11/13 22:26:03 ERROR security.UserGroupInformation: PriviledgedActionException as:hadoop cause:java.io.IOException: Not a file: hdfs://namenode/user/hadoop/top/dir1
13/11/13 22:26:03 ERROR streaming.StreamJob: Error Launching job : Not a file:
hdfs://namenode/user/hadoop/top/dir1
Streaming Job Failed!

このような場合には、top/*と指定してあげればよい。
たとえばこのように。

$ hadoop jar ${HADOOP_PREFIX}/contrib/streaming/hadoop-streaming-1.0.0.jar \
-D mapred.reduce.tasks=0 \
-input top/*  \
-output sampleoutput \
-mapper /home/hadoop/map.py \
-file /home/hadoop/map.py

 

ケース2:特定のファイルのみ処理したい場合

たとえば以下のdir3で.txtのみを処理したい場合。

-dir3-file1.txt
     -file2.bin
     -file3.txt

-input dir3/*.txtとすればよい。

 

ケース3:ケース1/2の複合ケース

 

top-+-dir4-file1.txt
    |     -file2.bin
    |     -file3.txt
    |
    +-dir5-file4.txt
          -file5.bin
          -file6.txt

 

合わせ技でtop/*/*.txtと指定すればよい。

No tags for this post.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です