Pivotal Knowledge Base

フォローする

DFSIO mapreduce ベンチマークテストの実行

環境

製品 バージョン
Pivotal HD(PHD)  
Hadoop  

DFSIOとは?

DFSIO は Hadoop ディストリビューションの一部で、MR2 の "hadoop-mapreduce-client-jobclient-*-tests.jar" に含まれている。DFSIO ツールには二種類のタイプが存在するが、ここでは TestDFSIO のみに言及する。TestDFSIO は以下のヘルプの記述にあるように、分散 I/O ベンチマークツールである。本ツールに対して設定可能ないくつかのオプションが存在する

使用方法

オプション説明
-read

こちらを実行するには、事前に write オプションでの TestDFSIO が完了している必要がある。こちらは以下で生成されたデータを読み込む。
hdfs://namendoe:8020/benchmarks/TestDFSIO/io_data

-write

こちらは file 系オプションの設定に基づいてデータを生成し、以下に書き込む。
hdfs://namendoe:8020/benchmarks/TestDFSIO/io_data
-append write オプションでの TestDFSIO 完了後に実行可能。結果を以下にある既存のデータに追加する。
hdfs://namendoe:8020/benchmarks/TestDFSIO/io_data
-clean TestDFSIO によって生成された、以下の全データを削除。
hdfs://namendoe:8020/benchmarks/TestDFSIO/io_data
-nrFiles HDFS に生成するファイル数。こちらはまた、実行される map タスクの数と同値。
-fileSize ここで設定したサイズに従って、各 map タスク(-nrFiles )に対してファイルが生成される。たとえば、"-nrFiles 10 -fileSize 250GB" と指定すると、HDFS クラスターに合計 2500GB のデータが生成される。
-resFile TestDFSIO のテスト結果を格納する、ローカルファイルシステムへのパス(HDFS のパスではない)。
-bufferSize 各 map タスクの読み込み・書き込みで発生する I/O におけるバッファーサイズ(バイト単位)。デフォルト値は、1000000 バイト(およそ、1MB)。

 CLIから使用

[gpadmin@hdm3 ~]$ hadoop jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.0.2-alpha-gphd-2.0.1.0-tests.jar TestDFSIO -help
13/08/21 11:27:41 INFO fs.TestDFSIO: TestDFSIO.0.0.6 Illegal argument: -help Usage: TestDFSIO [genericOptions] -read | -write | -append | -clean [-nrFiles N] [-fileSize Size[B|KB|MB|GB|TB]] [-resFile resultFileName] [-bufferSize Bytes] [-rootDir]     Other Available benchmarck tools: [gpadmin@hdm3 ~]$ hadoop jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar An example program must be given as the first argument. Valid program names are: DFSCIOTest: Distributed i/o benchmark of libhdfs. DistributedFSCheck: Distributed checkup of the file system consistency. JHLogAnalyzer: Job History Log analyzer. MRReliabilityTest: A program that tests the reliability of the MR framework by injecting faults/failures SliveTest: HDFS Stress Test and Live Data Verification. TestDFSIO: Distributed i/o benchmark. fail: a job that always fails filebench: Benchmark SequenceFile(Input|Output)Format (block,record compressed and uncompressed), Text(Input|Output)Format (compressed and uncompressed) loadgen: Generic map/reduce load generator mapredtest: A map/reduce test check. minicluster: Single process HDFS and MR cluster. mrbench: A map/reduce benchmark that can create many small jobs nnbench: A benchmark that stresses the namenode. sleep: A job that sleeps at each map and reduce task. testbigmapoutput: A map/reduce program that works on a very big non-splittable file and does identity map/reduce testfilesystem: A test for FileSystem read/write. testmapredsort: A map/reduce program that validates the map-reduce framework's sort. testsequencefile: A test for flat files of binary key value pairs. testsequencefileinputformat: A test for sequence file input format. testtextinputformat: A test for text input format. threadedmapbench: A map/reduce benchmark that compares the performance of maps with multiple spills over maps with 1 spill

テストの実行

Write ジョブの実行(ファイル数 64)

hadoop jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.0.2-alpha-gphd-2.0.1.0-tests.jar TestDFSIO -write -nrFiles 64 -fileSize 16GB -resFile /tmp/TestDFSIOwrite.txt

13/08/21 10:56:45 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
13/08/21 10:56:45 INFO fs.TestDFSIO:            Date & time: Wed Aug 21 10:56:45 PDT 2013
13/08/21 10:56:45 INFO fs.TestDFSIO:        Number of files: 64
13/08/21 10:56:45 INFO fs.TestDFSIO: Total MBytes processed: 1048576.0
13/08/21 10:56:45 INFO fs.TestDFSIO:      Throughput mb/sec: 23.046824301966463
13/08/21 10:56:45 INFO fs.TestDFSIO: Average IO rate mb/sec: 23.143465042114258
13/08/21 10:56:45 INFO fs.TestDFSIO:  IO rate std deviation: 1.5490700854356283
13/08/21 10:56:45 INFO fs.TestDFSIO:     Test exec time sec: 796.676
13/08/21 10:56:45 INFO fs.TestDFSIO:

[gpadmin@hdm3 ~]$ hdfs dfs -cat /benchmarks/TestDFSIO/io_write/part*
f:rate	1481181.8
f:sqrate	3.4433252E7
l:size	1099511627776
l:tasks	64
l:time	45497635

Read ジョブの実行(ファイル数 64)

hadoop jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.0.2-alpha-gphd-2.0.1.0-tests.jar TestDFSIO -read -nrFiles 64 -fileSize 16GB -resFile /tmp/TestDFSIOwrite.txt

13/08/21 11:03:45 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
13/08/21 11:03:45 INFO fs.TestDFSIO:            Date & time: Wed Aug 21 11:03:45 PDT 2013
13/08/21 11:03:45 INFO fs.TestDFSIO:        Number of files: 64
13/08/21 11:03:45 INFO fs.TestDFSIO: Total MBytes processed: 1048576.0
13/08/21 11:03:45 INFO fs.TestDFSIO:      Throughput mb/sec: 46.94650035960607
13/08/21 11:03:45 INFO fs.TestDFSIO: Average IO rate mb/sec: 47.33715057373047
13/08/21 11:03:45 INFO fs.TestDFSIO:  IO rate std deviation: 4.734873712739776
13/08/21 11:03:45 INFO fs.TestDFSIO:     Test exec time sec: 414.219
13/08/21 11:03:45 INFO fs.TestDFSIO:

[gpadmin@hdm3 ~]$ hdfs dfs -cat /benchmarks/TestDFSIO/io_write/part*
f:rate	1481181.8
f:sqrate	3.4433252E7
l:size	1099511627776
l:tasks	64
l:time	45497635

Write ジョブの実行

hadoop jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.0.2-alpha-gphd-2.0.1.0-tests.jar TestDFSIO -write -nrFiles 4 -fileSize 250GB -resFile /tmp/TestDFSIOwrite.txt

13/08/20 23:17:38 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
13/08/20 23:17:38 INFO fs.TestDFSIO:            Date & time: Tue Aug 20 23:17:38 PDT 2013
13/08/20 23:17:38 INFO fs.TestDFSIO:        Number of files: 4
13/08/20 23:17:38 INFO fs.TestDFSIO: Total MBytes processed: 1024000.0
13/08/20 23:17:38 INFO fs.TestDFSIO:      Throughput mb/sec: 161.73416935999862
13/08/20 23:17:38 INFO fs.TestDFSIO: Average IO rate mb/sec: 161.75624084472656
13/08/20 23:17:38 INFO fs.TestDFSIO:  IO rate std deviation: 1.8999879033336318
13/08/20 23:17:38 INFO fs.TestDFSIO:     Test exec time sec: 1603.932
13/08/20 23:17:38 INFO fs.TestDFSIO:

[gpadmin@hdm3 ~]$ hdfs dfs -cat /benchmarks/TestDFSIO/io_write/part*
f:rate	647024.94
f:sqrate	1.04674768E8
l:size	1073741824000
l:tasks	4
l:time	6331377

Read ジョブの実行

hadoop jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-2.0.2-alpha-gphd-2.0.1.0-tests.jar TestDFSIO -read -nrFiles 4 -fileSize 250GB -resFile /tmp/TestDFSIOwrite.txt
 
13/08/21 09:40:12 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
13/08/21 09:40:12 INFO fs.TestDFSIO:            Date & time: Wed Aug 21 09:40:12 PDT 2013
13/08/21 09:40:12 INFO fs.TestDFSIO:        Number of files: 4
13/08/21 09:40:12 INFO fs.TestDFSIO: Total MBytes processed: 1024000.0
13/08/21 09:40:12 INFO fs.TestDFSIO:      Throughput mb/sec: 122.51965010589454
13/08/21 09:40:12 INFO fs.TestDFSIO: Average IO rate mb/sec: 122.5361557006836
13/08/21 09:40:12 INFO fs.TestDFSIO:  IO rate std deviation: 1.4152211082822392
13/08/21 09:40:12 INFO fs.TestDFSIO:     Test exec time sec: 2141.713
13/08/21 09:40:12 INFO fs.TestDFSIO:

[gpadmin@hdm3 ~]$  hdfs dfs -cat /benchmarks/TestDFSIO/io_write/part*
f:rate	647024.94
f:sqrate	1.04674768E8
l:size	1073741824000
l:tasks	4
l:time	6331377

結果の理解

TestDFSIO.java の以下の部分を参照

835     double med = rate / 1000 / tasks;
836     double stdDev = Math.sqrt(Math.abs(sqrate / 1000 / tasks - med*med));
837     String resultLines[] = {
838       "----- TestDFSIO ----- : " + testType,
839       "           Date & time: " + new Date(System.currentTimeMillis()),
840       "       Number of files: " + tasks,
841       "Total MBytes processed: " + toMB(size),
842       "     Throughput mb/sec: " + size * 1000.0 / (time * MEGA),
843       "Average IO rate mb/sec: " + med,
844       " IO rate std deviation: " + stdDev,
845       "    Test exec time sec: " + (float)execTime / 1000,
846       "" };

計算式について

64 個のファイルからなる 1TB ジョブの詳細結果表示

 
最初に未加工の mapreduce の結果を収集する必要がある。
####################################################################
[gpadmin@hdm3 ~]$ hdfs dfs -cat /benchmarks/TestDFSIO/io_write/part*
f:rate	1481181.8
f:sqrate	3.4433252E7
l:size	1099511627776
l:tasks	64
l:time	45497635
 
テストによる実際の結果
####################################################################
13/08/21 10:56:45 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
13/08/21 10:56:45 INFO fs.TestDFSIO:            Date & time: Wed Aug 21 10:56:45 PDT 2013
13/08/21 10:56:45 INFO fs.TestDFSIO:        Number of files: 64
13/08/21 10:56:45 INFO fs.TestDFSIO: Total MBytes processed: 1048576.0
13/08/21 10:56:45 INFO fs.TestDFSIO:      Throughput mb/sec: 23.046824301966463
13/08/21 10:56:45 INFO fs.TestDFSIO: Average IO rate mb/sec: 23.143465042114258
13/08/21 10:56:45 INFO fs.TestDFSIO:  IO rate std deviation: 1.5490700854356283
13/08/21 10:56:45 INFO fs.TestDFSIO:     Test exec time sec: 796.676

以下、結果がどのように計算されたか出力
###################################################################
Throughput = size * 1000 / time * 1048576
Throughput = 1099511627776 * 1000 / 45497635 * 1048576
Throughput = 1099511627776000 / 47707728117760 = 23.04682430196646
AVG IO Rate = rate / 1000 / tasks
AVG IO Rate = 1481181.8 / 1000 / 64 = 23.143465625
Standard Deviation = square root of ( absolute value(sqrate / 1000 / tasks - AvgIoRate * AvgIoRate))
Standard Deviation = square root of ( absolute value(34433252 / 1000 / 64 - 23.143465625 * 23.143465625)) =  1.549051762996757

ファイル数 64 での write テスト全体のスループットがファイル数 4 での同テストよりも良い理由とは?

ファイル数 64 でのテストにおける、単体の write スループットは 23MB/s で、ファイル数 4 の場合は 161MB/s である。したがって、ファイル数 64 でのテスト結果の方が良いのは別の理由が考えられる

  1. テスト実行時間(Test exec time sec)は、ファイル数 64 でのテストの方が 50% 短い。これは、hadoop jar コマンドを実行するのにかかった時間の合計である。

  2. これらのテストでは、全ての map タスクが完了した後、いつも単一の reducer が実行される。Reducer は、/benchmarks/TestDFSIO/io_write/part-00000 に結果セットを生成する役割を担う。その処理内容は、基本的に各 map タスクから得られた 「rate、sqrate、size」といった値を各々合計することである。したがって、スループットや I/O 速度、標準偏差といった結果は、それぞれ個別の map タスクに基づき、クラスター全体のスループットには基づいていない。知っての通り、nrFiles の値は map タスク数と同値であり、上述の例のような特定のクラスターにおいては、最大 79 の map タスクを同時に実行可能である。ファイル数 64 でのテストにおいては、各ノードマネージャーノード上で 16 の map タスクを同時実行するのに対して、ファイル数 4 でのテストにおいては、各ノードで 1 map タスクのみ実行される。ファイル数 4 でのテストにおいては、各ノードマネージャーノードで、161MB/s というスループットを結果として出す。ファイル数 64 でのテストにおいては、ノードマネージャノード毎では、実質 368MB/s(16 map タスク × 23MB/s)というスループットを出しているのである。明らかに、ファイル数 64 のテストでは、mapreduce/HDFS のパフォーマンスが最適化されており、ファイル数 4 のテストでは最適化されていないことが分かる。同時に、いかに mapreduce I/O パフォーマンスが、データサイズや map/reduce タスク数、使用可能なクラスターリソースに応じて、変化し得るかが分かる。 

  3. 最終的に重要なポイントの一つは標準偏差である。もし、標準偏差が相当高い場合(実例は割愛)、クラスターノードの一つがパフォーマンス関連の問題があることを示していると考えられる。その場合、ハードウェア関連の問題であり得るし、ソフトウェア関連の問題であるとも考えられる。

コメント

Powered by Zendesk