2月 11th, 2014
HadoopStreamingバイナリ対応ぜ ImageMagickを使う
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 closed!