めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

RHS2.0(Beta1)/GlusterFS3.3.0(qa34)のHadoop API

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