2月 11th, 2014

HadoopStreamingバイナリ対応ぜ ImageMagickを使う

Posted in Hadoop by admin

Hadoopストリーミングは、通常テキストデータのストリームにのみ対応しており、
バイナリデータをそのまま入力にすると改? コードなどでデータが壊れてしまう。

以? ぜ JIRAのパッチを利用して、Hadoopストリーミングをバイナリストリームぜ
対? し、ImageMagickのコマンドを実行するMap処理を行える。
このパッチぜ Hadoopコアへの改修は? 要とせず、追加jarファイルのみだけぜ
動作するため、運用中システムへの影響度もあまりない。

https://issues.apache.org/jira/browse/MAPREDUCE-5018

※動作を確? した環? は、CDH4.4、JDK1.6.0_31

予め、利用するCDHバージョンの環? でパッチに含まれる以? のソースから
justbytes.jarを生成しておきます。

org/apache/hadoop/io/JustBytesWritable.java
org/apache/hadoop/mapred/JustBytesInputFormat.java
org/apache/hadoop/mapred/JustBytesOutputFormat.java
org/apache/hadoop/streaming/io/IdentifierResolver.java
org/apache/hadoop/streaming/io/JustBytesInputWriter.java
org/apache/hadoop/streaming/io/JustBytesOutputReader.java

後は、生成justbytes.jarをクライアントボ ードに配置して、Hadoop
ストリーミングを実行するだけです。ただし、ImageMagickを利用する
場合は、全スレーブボ ードぜ ImageMagickをインストールしておきます。
付属ぜ mapstreamスクリプトを利用してもいいですが、内部では以下のようぜ
hadoopコマンドを実行しています。

$ ls
justbytes.jar  mapstream

バイナリデータのバイト数確認

$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.4.0.jar \
    -D stream.io.identifier.resolver.class=org.apache.hadoop.streaming.io.JustBytesIdentifierResolver \
    -libjars justbytes.jar \
    -io justbytes \
    -inputformat org.apache.hadoop.mapred.JustBytesInputFormat \
    -outputformat org.apache.hadoop.mapred.JustBytesOutputFormat \
    -input "/user/hdfs/input" \
    -output "/user/hdfs/output" \
    -mapper "wc -c" \
    -numReduceTasks 0

ImageMagickぜ convertコマンドぜ jpeg画? を50%にリサイ゜

$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.4.0.jar \
    -D stream.io.identifier.resolver.class=org.apache.hadoop.streaming.io.JustBytesIdentifierResolver \
    -libjars justbytes.jar \
    -io justbytes \
    -inputformat org.apache.hadoop.mapred.JustBytesInputFormat \
    -outputformat org.apache.hadoop.mapred.JustBytesOutputFormat \
    -input "/user/hdfs/input_jpg" \
    -output "/user/hdfs/output_jpg" \
    -mapper "convert -resize 50% - -" \
    -numReduceTasks 0

$ hdfs dfs -ls /user/hdfs/output_jpg
Found 6 items
-rw-r--r--   3 hdfs hadoop          0 2014-02-05 17:31 /user/hdfs/output_jpg/_SUCCESS
drwxr-xr-x   - hdfs hadoop          0 2014-02-05 17:31 /user/hdfs/output_jpg/_logs
-rw-r--r--   3 hdfs hadoop     249193 2014-02-05 17:31 /user/hdfs/output_jpg/part-00000
-rw-r--r--   3 hdfs hadoop     195777 2014-02-05 17:31 /user/hdfs/output_jpg/part-00001
-rw-r--r--   3 hdfs hadoop     182178 2014-02-05 17:31 /user/hdfs/output_jpg/part-00002
-rw-r--r--   3 hdfs hadoop     473279 2014-02-05 17:31 /user/hdfs/output_jpg/part-00003

$ identify /hdfs/user/hdfs/input_jpg/test1.jpeg
/hdfs/user/hdfs/input_jpg/test1.jpeg JPEG 4256x2832 4256x2832+0+0 DirectClass 4.8mb

$ identify /hdfs/user/hdfs/output_jpg/part-00000
/user/hdfs/output_jpg/part-00000 JPEG 2128x1416 2128x1416+0+0 DirectClass 1.5mb

part-nnnnnnがそれぞれconvert後の画? ファイルになっている。
fuseマウント経由ぜ identifyを行い、リサイズ? ぜ jpegが生成されていることを確? 。

Comments are currently closed, but you can trackback from your own site. RSS 2.0

Comments are closed!