Hadoop APIとは?
これを使うとRHS2.0(Beta1)/GlusterFS3.3.0(qa34)をHDFSの代替として使用することができます。全体の構成はこんな感じです。
GlusterFSサーバのクラスタ上でTask Trackerが動いてMapReduceジョブを実行します。ジョブ管理を行うJob Trackerは、GlusterFSクライアントになります。Job TrackerはGlusterFSのボリュームをローカルにマウントして、処理対象ファイルの拡張属性を見ることで、そのファイルがどのノード上にあるかを確認します。これによって、実際にファイルを持っているノードにそのファイルの処理を優先的に割り当てます。
HDFSの場合は、処理するファイルの出し入れが面倒ですが、GlusterFSであれば、通常のファイルシステムとしてアクセスできますので、アプリケーションからの出力をGlusterFS上に貯めたものをそのままMapReduceで処理することができます。REST APIで保存したものを処理するような連係も考えられます。
検証環境
RHS2.0/GlusterFS3.3、Hadoop API、Hadoop、この3種類のバージョン依存があるため、使用するバージョンの組み合わせには少し気を使う必要があります。特にRHS2.0/GlusterFS3.3とHadoop APIはどちらもまだBeta版ですので、動作する組み合わせは、今後、いろいろ変わると予想されます。
この記事を執筆中のタイミングでは、とりあえず、下記の組み合わせで動作確認ができています。
・GlusterFS: RHS2.0Beta1、もしくは、GlusterFS3.3.0qa34
・Hadoop API: glusterfs-hadoop-0.20.2-0.1.x86_64.rpm
・Hadoop: hadoop-0.20.2.tar.gz
RHS2.0(Red Hat Storage 2.0)はレッドハットがサポートするディストリビューションですが、Hadoop APIについては、RHS2.0ではサポート対象外のTechnology Preview機能になる予定です。正式サポートはRHS2.1以降になる予定です。
環境構築手順
各ノードは、/etc/hostsで名前解決できるようにしておきます。
/etc/hosts
192.168.122.20 hadoop01 192.168.122.21 rhs20-01 192.168.122.22 rhs20-02 192.168.122.23 rhs20-03
また、各ノードに適切なJDKを導入しておきます。ここでは、OpenJDKを使用します。
# yum install java-1.6.0-openjdk java-1.6.0-openjdk-devel
rhs20-01〜rhs20-03の3ノードでGlusterFSサーバのクラスタを構成して、ボリュームvol01を作成します。
# gluster vol create vol01 rhs20-01:/data/brick01 rhs20-02:/data/brick01 rhs20-03:/data/brick01 # gluster vol start vol01
それぞれのノードで、/mnt/vol01にNativeマウントしておきます。
# mkdir /mnt/vol01 # mount -t glusterfs localhost:/vol01 /mnt/vol01
/etc/fstabにもエントリを記載しておきます。
localhost:/vol01 /mnt/vol01 glusterfs defaults,_netdev0 0
hadoop01からは、Nativeクライアントとして、rhs20-01を指定してマウントします。
# mkdir /mnt/vol01 # mount -t glusterfs rhs20-01:/vol01 /mnt/vol01
/etc/fstabにもエントリを記載しておきます。
rhs20-01:/vol01 /mnt/vol01 glusterfs defaults,_netdev0 0
hadoop01、rhs20-01〜rhs20-03の各ノードにHadoop APIのRPMをインストールします。
# yum localinstall http://download.gluster.com/pub/gluster/glusterfs/qa-releases/glusterfs-hadoop-0.20.2-0.1.x86_64.rpm
続いて、Haddopのセットアップです。ここからは、hadoop01からSSH経由で集中操作します。以下の作業はすべてhadoop01で行います。なお、現在の実装では、Job Tracker/Task Trackerはrootで実行する必要があるようです。
公開鍵認証を仕込みます。
# ssh-keygen # ssh-copy-id hadoop01 # ssh-copy-id rhs20-01 # ssh-copy-id rhs20-02 # ssh-copy-id rhs20-03
Hadoopのコードを展開します。
# pushd /tmp; wget http://www.apache.org/dist/hadoop/common/hadoop-0.20.2/hadoop-0.20.2.tar.gz; popd # scp /tmp/hadoop-0.20.2.tar.gz rhs20-01:/tmp/ # scp /tmp/hadoop-0.20.2.tar.gz rhs20-02:/tmp/ # scp /tmp/hadoop-0.20.2.tar.gz rhs20-03:/tmp/ # pushd /opt; tar -xvzf /tmp/hadoop-0.20.2.tar.gz; ln -s /opt/hadoop-0.20.2 /root/hadoop ; popd # ssh rhs20-01 "cd /opt; tar -xvzf /tmp/hadoop-0.20.2.tar.gz; ln -s /opt/hadoop-0.20.2 /root/hadoop" # ssh rhs20-02 "cd /opt; tar -xvzf /tmp/hadoop-0.20.2.tar.gz; ln -s /opt/hadoop-0.20.2 /root/hadoop" # ssh rhs20-03 "cd /opt; tar -xvzf /tmp/hadoop-0.20.2.tar.gz; ln -s /opt/hadoop-0.20.2 /root/hadoop"
/root/hadoop/lib以下にHadoop APIのjarファイルへのリンクを作成します。
# ln -s /usr/local/lib/glusterfs-0.20.2-0.1.jar /root/hadoop/lib/glusterfs-0.20.2-0.1.jar # ssh rhs20-01 ln -s /usr/local/lib/glusterfs-0.20.2-0.1.jar /root/hadoop/lib/glusterfs-0.20.2-0.1.jar # ssh rhs20-02 ln -s /usr/local/lib/glusterfs-0.20.2-0.1.jar /root/hadoop/lib/glusterfs-0.20.2-0.1.jar # ssh rhs20-03 ln -s /usr/local/lib/glusterfs-0.20.2-0.1.jar /root/hadoop/lib/glusterfs-0.20.2-0.1.jar
/root/.bashrcに下記を追加します。JAVA_HOMEは環境に合わせて書き換えてください。
export HADOOP_HOME=/root/hadoop export JAVA_HOME=/usr/lib/jvm/jre export PATH=$PATH:$HADOOP_HOME/bin:$JAVA_HOME/bin export CLASSPATH for f in $HADOOP_HOME/*.jar; do CLASSPATH=${CLASSPATH}:$f; done for f in $HADOOP_HOME/lib/*.jar; do CLASSPATH=${CLASSPATH}:$f; done
他ノードにも配っておきます。
# . ~/.bashrc # scp ~/.bashrc rhs20-01:/root/ # scp ~/.bashrc rhs20-02:/root/ # scp ~/.bashrc rhs20-03:/root/
/root/hadoop/conf/hadoop-env.shに下記を追加します。それぞれの値は環境に合わせて書き換えてください。(テスト環境なのでHEAPの値は小さくしています。)
export JAVA_HOME=/usr/lib/jvm/jre export HADOOP_LOG_DIR=/root/logs export HADOOP_HEAPSIZE=200
/root/hadoop/conf/masters、/root/hadoop/conf/slaves、および/root/hadoop/conf/mapred-site.xmlは、通常のHadoopの設定と同じです。ここでは、下記の設定を使用します。(先と同じくHEAPは小さくとっています。)
/root/hadoop/conf/masters
hadoop01
/root/hadoop/conf/slaves
rhs20-01 rhs20-02 rhs20-03
/root/hadoop/conf/mapred-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>mapred.job.tracker</name> <value>hadoop01:8021</value> </property> <property> <name>mapred.local.dir</name> <value>/data/mapred/local</value> </property> <property> <name>mapred.system.dir</name> <value>/tmp/hadoop/mapred/system</value> </property> <property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>3</value> </property> <property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>3</value> </property> <property> <name>mapred.child.java.opts</name> <value>-Xmx200m</value> </property> </configuration>
/root/hadoop/conf/core-site.xmlには、Glusterに関する情報を記載します。
/root/hadoop/conf/core-site.xml
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.glusterfs.impl</name> <value>org.apache.hadoop.fs.glusterfs.GlusterFileSystem</value> <!-- Hadoop APIのパッケージを指定 --> </property> <property> <name>fs.default.name</name> <value>glusterfs://rhs20-01:9000</value> <!-- 本来はNameNodeを指定する部分。ダミーでGlusterFSサーバの1つを入れます --> </property> <property> <name>fs.glusterfs.volname</name> <value>vol01</value> <!-- GlusterFSのボリューム名を指定 --> </property> <property> <name>fs.glusterfs.mount</name> <value>/mnt/vol01</value> <!-- ボリュームのマウントポイントを指定 --> </property> <property> <name>fs.glusterfs.server</name> <value>rhs20-01</value> <!-- ボリュームを自動マウントする際に使用するGlusterFSサーバを指定 --> </property> <property> <name>quick.slave.io</name> <value>Off</value> <!-- Experimentalな機能なのでOffにしておきます --> </property> </configuration>
最後に設定ファイル一式をTaskTrackerノードにも配布します。
# rsync -av ~/hadoop/conf/ rhs20-01:~/hadoop/conf/ # rsync -av ~/hadoop/conf/ rhs20-02:~/hadoop/conf/ # rsync -av ~/hadoop/conf/ rhs20-03:~/hadoop/conf/
動作確認
Hadoopに同梱のサンプルジョブで動作確認します。これもhadoop01上で操作します。
JobTracker/TaskTrackersを起動します。(HDFSは起動しないように。)
# start-mapred.sh
以下の実行例は、うまく動いたものを掲載していますが、ジョブによっては、まだうまく動かないものもあるようです。
まずは、ありがちな円周率の計算。
# hadoop jar ~/hadoop/hadoop-0.20.2-examples.jar pi 6 10000 Number of Maps = 6 Samples per Map = 10000 Initializing GlusterFS Wrote input for Map #0 Wrote input for Map #1 Wrote input for Map #2 Wrote input for Map #3 Wrote input for Map #4 Wrote input for Map #5 Starting Job 12/04/20 01:52:38 INFO mapred.FileInputFormat: Total input paths to process : 6 12/04/20 01:52:38 INFO mapred.JobClient: Running job: job_201204200150_0005 12/04/20 01:52:39 INFO mapred.JobClient: map 0% reduce 0% 12/04/20 01:52:46 INFO mapred.JobClient: map 100% reduce 0% 12/04/20 01:52:58 INFO mapred.JobClient: map 100% reduce 100% 12/04/20 01:53:00 INFO mapred.JobClient: Job complete: job_201204200150_0005 12/04/20 01:53:00 INFO mapred.JobClient: Counters: 17 12/04/20 01:53:00 INFO mapred.JobClient: Job Counters 12/04/20 01:53:00 INFO mapred.JobClient: Launched reduce tasks=1 12/04/20 01:53:00 INFO mapred.JobClient: Rack-local map tasks=3 12/04/20 01:53:00 INFO mapred.JobClient: Launched map tasks=6 12/04/20 01:53:00 INFO mapred.JobClient: Data-local map tasks=3 12/04/20 01:53:00 INFO mapred.JobClient: FileSystemCounters 12/04/20 01:53:00 INFO mapred.JobClient: FILE_BYTES_READ=138 12/04/20 01:53:00 INFO mapred.JobClient: FILE_BYTES_WRITTEN=498 12/04/20 01:53:00 INFO mapred.JobClient: Map-Reduce Framework 12/04/20 01:53:00 INFO mapred.JobClient: Reduce input groups=12 12/04/20 01:53:00 INFO mapred.JobClient: Combine output records=0 12/04/20 01:53:00 INFO mapred.JobClient: Map input records=6 12/04/20 01:53:00 INFO mapred.JobClient: Reduce shuffle bytes=168 12/04/20 01:53:00 INFO mapred.JobClient: Reduce output records=0 12/04/20 01:53:00 INFO mapred.JobClient: Spilled Records=24 12/04/20 01:53:00 INFO mapred.JobClient: Map output bytes=108 12/04/20 01:53:00 INFO mapred.JobClient: Map input bytes=144 12/04/20 01:53:00 INFO mapred.JobClient: Combine input records=0 12/04/20 01:53:00 INFO mapred.JobClient: Map output records=12 12/04/20 01:53:00 INFO mapred.JobClient: Reduce input records=12 Job Finished in 22.36 seconds Estimated value of Pi is 3.14200000000000000000
Terasortのテスト
# hadoop jar ~/hadoop/hadoop-0.20.2-examples.jar teragen -Dmapred.map.tasks=3 300000 output Initializing GlusterFS Generating 300000 using 3 maps with step of 100000 12/04/20 13:48:47 INFO mapred.JobClient: Running job: job_201204201348_0001 12/04/20 13:48:48 INFO mapred.JobClient: map 0% reduce 0% 12/04/20 13:49:03 INFO mapred.JobClient: map 4% reduce 0% 12/04/20 13:49:06 INFO mapred.JobClient: map 16% reduce 0% 12/04/20 13:49:09 INFO mapred.JobClient: map 23% reduce 0% 12/04/20 13:49:12 INFO mapred.JobClient: map 31% reduce 0% 12/04/20 13:49:15 INFO mapred.JobClient: map 38% reduce 0% 12/04/20 13:49:18 INFO mapred.JobClient: map 45% reduce 0% 12/04/20 13:49:21 INFO mapred.JobClient: map 52% reduce 0% 12/04/20 13:49:24 INFO mapred.JobClient: map 59% reduce 0% 12/04/20 13:49:27 INFO mapred.JobClient: map 63% reduce 0% 12/04/20 13:49:30 INFO mapred.JobClient: map 70% reduce 0% 12/04/20 13:49:33 INFO mapred.JobClient: map 73% reduce 0% 12/04/20 13:49:36 INFO mapred.JobClient: map 77% reduce 0% 12/04/20 13:49:39 INFO mapred.JobClient: map 81% reduce 0% 12/04/20 13:49:42 INFO mapred.JobClient: map 85% reduce 0% 12/04/20 13:49:45 INFO mapred.JobClient: map 89% reduce 0% 12/04/20 13:49:48 INFO mapred.JobClient: map 93% reduce 0% 12/04/20 13:49:54 INFO mapred.JobClient: map 100% reduce 0% 12/04/20 13:49:56 INFO mapred.JobClient: Job complete: job_201204201348_0001 12/04/20 13:49:56 INFO mapred.JobClient: Counters: 5 12/04/20 13:49:56 INFO mapred.JobClient: Job Counters 12/04/20 13:49:56 INFO mapred.JobClient: Launched map tasks=3 12/04/20 13:49:56 INFO mapred.JobClient: Map-Reduce Framework 12/04/20 13:49:56 INFO mapred.JobClient: Map input records=300000 12/04/20 13:49:56 INFO mapred.JobClient: Spilled Records=0 12/04/20 13:49:56 INFO mapred.JobClient: Map input bytes=300000 12/04/20 13:49:56 INFO mapred.JobClient: Map output records=300000 # hadoop jar ~/hadoop/hadoop-0.20.2-examples.jar terasort output sorted 12/04/20 13:50:14 INFO terasort.TeraSort: starting Initializing GlusterFS 12/04/20 13:50:14 INFO mapred.FileInputFormat: Total input paths to process : 3 12/04/20 13:50:14 INFO util.NativeCodeLoader: Loaded the native-hadoop library 12/04/20 13:50:14 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library 12/04/20 13:50:14 INFO compress.CodecPool: Got brand-new compressor Making 1 from 99999 records Step size is 99999.0 12/04/20 13:50:15 INFO mapred.JobClient: Running job: job_201204201348_0002 12/04/20 13:50:16 INFO mapred.JobClient: map 0% reduce 0% 12/04/20 13:50:24 INFO mapred.JobClient: map 66% reduce 0% 12/04/20 13:50:26 INFO mapred.JobClient: map 100% reduce 0% 12/04/20 13:50:33 INFO mapred.JobClient: map 100% reduce 33% 12/04/20 13:50:36 INFO mapred.JobClient: map 100% reduce 67% 12/04/20 13:50:39 INFO mapred.JobClient: map 100% reduce 69% 12/04/20 13:50:42 INFO mapred.JobClient: map 100% reduce 70% 12/04/20 13:50:45 INFO mapred.JobClient: map 100% reduce 72% 12/04/20 13:50:48 INFO mapred.JobClient: map 100% reduce 73% 12/04/20 13:50:51 INFO mapred.JobClient: map 100% reduce 75% 12/04/20 13:50:54 INFO mapred.JobClient: map 100% reduce 76% 12/04/20 13:50:58 INFO mapred.JobClient: map 100% reduce 78% 12/04/20 13:51:01 INFO mapred.JobClient: map 100% reduce 79% 12/04/20 13:51:04 INFO mapred.JobClient: map 100% reduce 80% 12/04/20 13:51:07 INFO mapred.JobClient: map 100% reduce 82% 12/04/20 13:51:10 INFO mapred.JobClient: map 100% reduce 83% 12/04/20 13:51:13 INFO mapred.JobClient: map 100% reduce 85% 12/04/20 13:51:19 INFO mapred.JobClient: map 100% reduce 87% 12/04/20 13:51:22 INFO mapred.JobClient: map 100% reduce 88% 12/04/20 13:51:25 INFO mapred.JobClient: map 100% reduce 90% 12/04/20 13:51:28 INFO mapred.JobClient: map 100% reduce 91% 12/04/20 13:51:31 INFO mapred.JobClient: map 100% reduce 93% 12/04/20 13:51:34 INFO mapred.JobClient: map 100% reduce 94% 12/04/20 13:51:37 INFO mapred.JobClient: map 100% reduce 96% 12/04/20 13:51:40 INFO mapred.JobClient: map 100% reduce 97% 12/04/20 13:51:46 INFO mapred.JobClient: map 100% reduce 100% 12/04/20 13:51:48 INFO mapred.JobClient: Job complete: job_201204201348_0002 12/04/20 13:51:48 INFO mapred.JobClient: Counters: 16 12/04/20 13:51:48 INFO mapred.JobClient: Job Counters 12/04/20 13:51:48 INFO mapred.JobClient: Launched reduce tasks=1 12/04/20 13:51:48 INFO mapred.JobClient: Launched map tasks=3 12/04/20 13:51:48 INFO mapred.JobClient: Data-local map tasks=3 12/04/20 13:51:48 INFO mapred.JobClient: FileSystemCounters 12/04/20 13:51:48 INFO mapred.JobClient: FILE_BYTES_READ=30600393 12/04/20 13:51:48 INFO mapred.JobClient: FILE_BYTES_WRITTEN=61200120 12/04/20 13:51:48 INFO mapred.JobClient: Map-Reduce Framework 12/04/20 13:51:48 INFO mapred.JobClient: Reduce input groups=300000 12/04/20 13:51:48 INFO mapred.JobClient: Combine output records=0 12/04/20 13:51:48 INFO mapred.JobClient: Map input records=300000 12/04/20 13:51:48 INFO mapred.JobClient: Reduce shuffle bytes=30600018 12/04/20 13:51:48 INFO mapred.JobClient: Reduce output records=300000 12/04/20 13:51:48 INFO mapred.JobClient: Spilled Records=600000 12/04/20 13:51:48 INFO mapred.JobClient: Map output bytes=30000000 12/04/20 13:51:48 INFO mapred.JobClient: Map input bytes=30000000 12/04/20 13:51:48 INFO mapred.JobClient: Combine input records=0 12/04/20 13:51:48 INFO mapred.JobClient: Map output records=300000 12/04/20 13:51:48 INFO mapred.JobClient: Reduce input records=300000 12/04/20 13:51:48 INFO terasort.TeraSort: done # hadoop jar ~/hadoop/hadoop-0.20.2-examples.jar teravalidate sorted result Initializing GlusterFS 12/04/20 13:51:53 INFO mapred.FileInputFormat: Total input paths to process : 1 12/04/20 13:51:53 INFO mapred.JobClient: Running job: job_201204201348_0003 12/04/20 13:51:54 INFO mapred.JobClient: map 0% reduce 0% 12/04/20 13:52:01 INFO mapred.JobClient: map 100% reduce 0% 12/04/20 13:52:13 INFO mapred.JobClient: map 100% reduce 100% 12/04/20 13:52:15 INFO mapred.JobClient: Job complete: job_201204201348_0003 12/04/20 13:52:15 INFO mapred.JobClient: Counters: 16 12/04/20 13:52:15 INFO mapred.JobClient: Job Counters 12/04/20 13:52:15 INFO mapred.JobClient: Launched reduce tasks=1 12/04/20 13:52:15 INFO mapred.JobClient: Rack-local map tasks=1 12/04/20 13:52:15 INFO mapred.JobClient: Launched map tasks=1 12/04/20 13:52:15 INFO mapred.JobClient: FileSystemCounters 12/04/20 13:52:15 INFO mapred.JobClient: FILE_BYTES_READ=64 12/04/20 13:52:15 INFO mapred.JobClient: FILE_BYTES_WRITTEN=160 12/04/20 13:52:15 INFO mapred.JobClient: Map-Reduce Framework 12/04/20 13:52:15 INFO mapred.JobClient: Reduce input groups=2 12/04/20 13:52:15 INFO mapred.JobClient: Combine output records=0 12/04/20 13:52:15 INFO mapred.JobClient: Map input records=300000 12/04/20 13:52:15 INFO mapred.JobClient: Reduce shuffle bytes=0 12/04/20 13:52:15 INFO mapred.JobClient: Reduce output records=0 12/04/20 13:52:15 INFO mapred.JobClient: Spilled Records=4 12/04/20 13:52:15 INFO mapred.JobClient: Map output bytes=54 12/04/20 13:52:15 INFO mapred.JobClient: Map input bytes=30000000 12/04/20 13:52:15 INFO mapred.JobClient: Combine input records=0 12/04/20 13:52:15 INFO mapred.JobClient: Map output records=2 12/04/20 13:52:15 INFO mapred.JobClient: Reduce input records=2 # cat /mnt/vol01/result/part-00000 # ※成功しているので、何もエラーが記録されていない
ワードカウント
# mkdir work # cd work # wget http://www.gutenberg.org/files/28054/28054.zip # wget http://www.gutenberg.org/files/2197/2197.zip # wget http://www.gutenberg.org/files/2554/2554.zip # wget http://www.gutenberg.org/dirs/etext05/inqus10.zip # wget http://www.gutenberg.org/files/2638/2638.zip # wget http://www.gutenberg.org/files/600/600.zip # for i in $(ls *zip);do unzip $i;done # mkdir /mnt/vol01/texts # cp *txt /mnt/vol01/texts/ # hadoop jar ~/hadoop/hadoop-0.20.2-examples.jar wordcount texts words Initializing GlusterFS 12/04/20 02:07:22 INFO input.FileInputFormat: Total input paths to process : 5 12/04/20 02:07:22 INFO mapred.JobClient: Running job: job_201204200150_0010 12/04/20 02:07:23 INFO mapred.JobClient: map 0% reduce 0% 12/04/20 02:07:33 INFO mapred.JobClient: map 20% reduce 0% 12/04/20 02:07:35 INFO mapred.JobClient: map 60% reduce 0% 12/04/20 02:07:36 INFO mapred.JobClient: map 100% reduce 0% 12/04/20 02:07:42 INFO mapred.JobClient: map 100% reduce 33% 12/04/20 02:07:45 INFO mapred.JobClient: map 100% reduce 69% 12/04/20 02:07:48 INFO mapred.JobClient: map 100% reduce 71% 12/04/20 02:07:51 INFO mapred.JobClient: map 100% reduce 74% 12/04/20 02:07:54 INFO mapred.JobClient: map 100% reduce 78% 12/04/20 02:07:57 INFO mapred.JobClient: map 100% reduce 82% 12/04/20 02:08:00 INFO mapred.JobClient: map 100% reduce 85% 12/04/20 02:08:03 INFO mapred.JobClient: map 100% reduce 89% 12/04/20 02:08:06 INFO mapred.JobClient: map 100% reduce 93% 12/04/20 02:08:09 INFO mapred.JobClient: map 100% reduce 96% 12/04/20 02:08:15 INFO mapred.JobClient: map 100% reduce 100% 12/04/20 02:08:17 INFO mapred.JobClient: Job complete: job_201204200150_0010 12/04/20 02:08:17 INFO mapred.JobClient: Counters: 15 12/04/20 02:08:17 INFO mapred.JobClient: Job Counters 12/04/20 02:08:17 INFO mapred.JobClient: Launched reduce tasks=1 12/04/20 02:08:17 INFO mapred.JobClient: Launched map tasks=5 12/04/20 02:08:17 INFO mapred.JobClient: Data-local map tasks=5 12/04/20 02:08:17 INFO mapred.JobClient: FileSystemCounters 12/04/20 02:08:17 INFO mapred.JobClient: FILE_BYTES_READ=2099616 12/04/20 02:08:17 INFO mapred.JobClient: FILE_BYTES_WRITTEN=3642791 12/04/20 02:08:17 INFO mapred.JobClient: Map-Reduce Framework 12/04/20 02:08:17 INFO mapred.JobClient: Reduce input groups=56405 12/04/20 02:08:17 INFO mapred.JobClient: Combine output records=105141 12/04/20 02:08:17 INFO mapred.JobClient: Map input records=97706 12/04/20 02:08:17 INFO mapred.JobClient: Reduce shuffle bytes=1543015 12/04/20 02:08:17 INFO mapred.JobClient: Reduce output records=56405 12/04/20 02:08:17 INFO mapred.JobClient: Spilled Records=248346 12/04/20 02:08:17 INFO mapred.JobClient: Map output bytes=8734520 12/04/20 02:08:17 INFO mapred.JobClient: Combine input records=915508 12/04/20 02:08:17 INFO mapred.JobClient: Map output records=915508 12/04/20 02:08:17 INFO mapred.JobClient: Reduce input records=105141 # grep -E "God" /mnt/vol01/words/part-r-00000 "God 28 "God's 1 "God, 2 God 280 God! 27 God!" 34 God!"... 1 God!' 2 God!--Every 1 God'! 2 God'?" 1 God's 52 God's, 1 God, 93 God," 7 God,' 3 God--an 1 God--and 1 God--thank 2 God--that's 1 God-fearing 2 God-fearing, 1 God-forsaken 1 God. 29 God." 10 God.' 5 God.... 1 God; 7 God? 11 God?" 9 Goddess 1 Zossima--God 1 earnestly--'God 1 embarrassed--God 1