カテゴリー別アーカイブ: Hadoop

ローカル環境でのHBaseへのYCSBベンチマークの実行方法

YCSBベンチマークの実行方法のご紹介です。

インターネットに接続している状態でgitコマンドを使用した方法を紹介しているサイトが多いですが、もちろんローカル環境でもインストール・実行できます。

下記サイトにアクセス

Getting Started – GitHub

Tarballをダウンロード。2011/12/13時点では、バージョン0.1.3が最新版です。

解凍とHBaseライブラリのコピー、メイク

# tar zxvf brianfrankcooper-YCSB-0.1.3-0-geb1597f.tar.gz
# cd brianfrankcooper-YCSB-4af247f/

# cp /usr/lib/hbase/lib/*.jar db/hbase/lib/

# ant
Buildfile: /work/ycsb/brianfrankcooper-YCSB-4af247f/build.xml

compile:
    [mkdir] Created dir: /work/ycsb/brianfrankcooper-YCSB-4af247f/build/classes
    [javac] /work/ycsb/brianfrankcooper-YCSB-4af247f/build.xml:50: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 28 source files to /work/ycsb/brianfrankcooper-YCSB-4af247f/build/classes

makejar:
      [jar] Building jar: /work/ycsb/brianfrankcooper-YCSB-4af247f/build/ycsb.jar

BUILD SUCCESSFUL
Total time: 1 second


# ant dbcompile-hbase
Buildfile: /work/ycsb/brianfrankcooper-YCSB-4af247f/build.xml

compile:
    [javac] /work/ycsb/brianfrankcooper-YCSB-4af247f/build.xml:50: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

makejar:

dbcompile-hbase:

dbcompile:
    [javac] /work/ycsb/brianfrankcooper-YCSB-4af247f/build.xml:63: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 1 source file to /work/ycsb/brianfrankcooper-YCSB-4af247f/build/classes
    [javac] /work/ycsb/brianfrankcooper-YCSB-4af247f/db/hbase/src/com/yahoo/ycsb/db/HBaseClient.java:52: 警告:[deprecation] org.apache.hadoop.hbase.HBaseConfiguration の HBaseConfiguration() は推奨されません。
    [javac]     private static final HBaseConfiguration config = new HBaseConfiguration();
    [javac]                                                      ^
    [javac] 警告 1

makejar:
      [jar] Building jar: /work/ycsb/brianfrankcooper-YCSB-4af247f/build/ycsb.jar

BUILD SUCCESSFUL
Total time: 4 seconds

YCSB用のテーブルとcolumnfamilyの作成

# hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.90.1-cdh3u0, r, Fri Mar 25 16:10:51 PDT 2011


hbase(main):001:0>
hbase(main):002:0*
hbase(main):003:0* create 'usertable', 'family'
0 row(s) in 3.9600 seconds

YCSB用のテーブルのロード

ここではrecordcount=100を指定して作成

# java -cp /etc/hbase/conf:build/ycsb.jar:db/hbase/lib/* com.yahoo.ycsb.Client -load -db com.yahoo.ycsb.db.HBaseClient -P workloads/workloada -p columnfamily=family -p recordcount=100 -s > ycsb-load.log
Loading workload...
Starting test.
11/12/12 02:33:33 WARN hbase.HBaseConfiguration: instantiating HBaseConfiguration() is deprecated. Please use HBaseConfiguration#create() to construct a plain Configuration
 0 sec: 0 operations;
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:zookeeper.version=3.3.3-cdh3u0--1, built on 03/26/2011 00:21 GMT
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:host.name=localhost.localdomain
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:java.version=1.6.0_25
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:java.vendor=Sun Microsystems Inc.
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:java.home=/usr/java/jdk1.6.0_25/jre
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:java.class.path=/etc/hbase/conf:build/ycsb.jar:db/hbase/lib/jersey-json-1.4.jar:db/hbase/lib/jetty-6.1.26.jar:db/hbase/lib/jackson-mapper-asl-1.5.2.jar:db/hbase/lib/protobuf-java-2.3.0.jar:db/hbase/lib/slf4j-api-1.5.8.jar:db/hbase/lib/jsp-2.1-6.1.14.jar:db/hbase/lib/hbase-0.90.1-cdh3u0.jar:db/hbase/lib/jersey-server-1.4.jar:db/hbase/lib/commons-lang-2.5.jar:db/hbase/lib/zookeeper.jar:db/hbase/lib/asm-3.1.jar:db/hbase/lib/jsr311-api-1.1.1.jar:db/hbase/lib/jruby-complete-1.0.3.jar:db/hbase/lib/stax-api-1.0.1.jar:db/hbase/lib/thrift-0.2.0.jar:db/hbase/lib/jersey-core-1.4.jar:db/hbase/lib/core-3.1.1.jar:db/hbase/lib/jettison-1.1.jar:db/hbase/lib/jsp-api-2.1.jar:db/hbase/lib/hadoop-core.jar:db/hbase/lib/jackson-core-asl-1.5.2.jar:db/hbase/lib/commons-el-1.0.jar:db/hbase/lib/jasper-runtime-5.5.23.jar:db/hbase/lib/jackson-jaxrs-1.5.5.jar:db/hbase/lib/avro-1.3.3.jar:db/hbase/lib/slf4j-log4j12-1.5.8.jar:db/hbase/lib/servlet-api-2.5.jar:db/hbase/lib/guava-r06.jar:db/hbase/lib/commons-codec-1.4.jar:db/hbase/lib/log4j-1.2.16.jar:db/hbase/lib/xmlenc-0.52.jar:db/hbase/lib/jsp-api-2.1-6.1.14.jar:db/hbase/lib/jasper-compiler-5.5.23.jar:db/hbase/lib/jetty-util-6.1.26.jar:db/hbase/lib/activation-1.1.jar:db/hbase/lib/commons-httpclient-3.1.jar:db/hbase/lib/commons-logging-1.1.1.jar:db/hbase/lib/commons-cli-1.2.jar:db/hbase/lib/jaxb-impl-2.1.12.jar:db/hbase/lib/jackson-xc-1.5.5.jar:db/hbase/lib/jaxb-api-2.1.jar:db/hbase/lib/servlet-api-2.5-6.1.14.jar:db/hbase/lib/commons-net-1.4.1.jar
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:java.library.path=/usr/java/jdk1.6.0_25/jre/lib/i386/client:/usr/java/jdk1.6.0_25/jre/lib/i386:/usr/java/jdk1.6.0_25/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:java.io.tmpdir=/tmp
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:java.compiler=<NA>
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:os.name=Linux
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:os.arch=i386
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:os.version=2.6.18-238.9.1.el5
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:user.name=root
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:user.home=/root
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Client environment:user.dir=/work/ycsb/brianfrankcooper-YCSB-4af247f
11/12/12 02:33:33 INFO zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=hconnection
11/12/12 02:33:33 INFO zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181
11/12/12 02:33:33 INFO zookeeper.ClientCnxn: Socket connection established to localhost/127.0.0.1:2181, initiating session
11/12/12 02:33:33 INFO zookeeper.ClientCnxn: Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x13431433ef8001c, negotiated timeout = 40000
11/12/12 02:33:33 DEBUG client.HConnectionManager$HConnectionImplementation: Lookedup root region location, connection=org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@12d7a10; hsa=localhost.localdomain:60964
11/12/12 02:33:34 DEBUG client.HConnectionManager$HConnectionImplementation: Cached location for .META.,,1.1028785192 is localhost.localdomain:60964
11/12/12 02:33:34 DEBUG client.HConnectionManager$HConnectionImplementation: Cache hit for row <> in tableName .META.: location server localhost.localdomain:60964, location region name .META.,,1.1028785192
11/12/12 02:33:34 DEBUG client.MetaScanner: Scanning .META. starting at row=usertable,,00000000000000 for max=10 rows
11/12/12 02:33:34 DEBUG client.HConnectionManager$HConnectionImplementation: Cached location for usertable,,1323685483754.24aa2f92cfa7db2745b1c943c11f41b3. is localhost.localdomain:60964
11/12/12 02:33:34 DEBUG client.HConnectionManager$HConnectionImplementation: Cache hit for row <> in tableName usertable: location server localhost.localdomain:60964, location region name usertable,,1323685483754.24aa2f92cfa7db2745b1c943c11f41b3.
 0 sec: 100 operations; 101.42 current ops/sec; [INSERT AverageLatency(ms)=9.11]

YCSB用のテーブルがロードされていることの確認

# hbase shell
hbase(main):002:0> scan 'usertable'
ROW                   COLUMN+CELL
 user1008382536       column=family:field0, timestamp=1323686014286, value=kpL++
                      W;h45?0j-9i@fHIA</[5QyMPX5ESe|3ODE77=K>U:@|c7?'46L_~RT(3D
                      u]%jwd'N5/!YgXQ4}~Y')0A'fU=~Wc7%'^9M.
 user1008382536       column=family:field1, timestamp=1323686014286, value=%_%fC
                      ":f+.,8'+G?8skm9t\.'20JtB&G;az8_,1H.4.>"2"=:  o54=m~T7~$tV
                      756*&H9|Ko"
#Rn4E.:wDx2_9-ROTGj.]`i#qk
 user1008382536       column=family:field2, timestamp=1323686014286, value=[/;E2
                      kc0gn?"'?R7bF2uc8UM_Z:<i1$j/Q];+*Hd$+6<]x4&"VJvOGPQ=/2tw7F
                      /%3I-?(e@]D} dWB`=d*j^'!Q[t3t|jj72dUD
 user1008382536       column=family:field3, timestamp=1323686014286, value='
NkGg
                      =JSR4<-q3lT)#>j4A8Ix.Mbz'!%+;CL\@:L&%f-k.#+!4 -"4)L-kU!J.R
                      (.tv$0S2g)hP-:KiKYhq@^YN=Ri6$=gt8=5<w
 user1008382536       column=family:field4, timestamp=1323686014286, value=g U4X
                      L%+ih33{2;3/VE}x@*e=?speo::f\h#bMSoVORyh_6)z""4iI@D8hr3!g(
                      X=V'
+%q*K0G08156MYn 8F8T8:w]gF&'<x$to



100 row(s) in 3.3380 seconds

YCSBの実行

# java -cp /etc/hbase/:build/ycsb.jar:db/hbase/lib/* com.yahoo.ycsb.Client -t -db com.yahoo.ycsb.db.HBaseClient -P workloads/workloada -p columnfamily=family -p operationcount=100 -s -threads 10 > ycsb-test.log
Loading workload...
Starting test.
11/12/13 00:16:54 WARN hbase.HBaseConfiguration: instantiating HBaseConfiguration() is deprecated. Please use HBaseConfiguration#create() to construct a plain Configuration
 0 sec: 0 operations;
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:zookeeper.version=3.3.3-cdh3u0--1, built on 03/26/2011 00:21 GMT
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:host.name=localhost.localdomain
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:java.version=1.6.0_25
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:java.vendor=Sun Microsystems Inc.
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:java.home=/usr/java/jdk1.6.0_25/jre
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:java.class.path=/etc/hbase/:build/ycsb.jar:db/hbase/lib/jersey-json-1.4.jar:db/hbase/lib/jetty-6.1.26.jar:db/hbase/lib/jackson-mapper-asl-1.5.2.jar:db/hbase/lib/protobuf-java-2.3.0.jar:db/hbase/lib/slf4j-api-1.5.8.jar:db/hbase/lib/jsp-2.1-6.1.14.jar:db/hbase/lib/hbase-0.90.1-cdh3u0.jar:db/hbase/lib/jersey-server-1.4.jar:db/hbase/lib/commons-lang-2.5.jar:db/hbase/lib/zookeeper.jar:db/hbase/lib/asm-3.1.jar:db/hbase/lib/jsr311-api-1.1.1.jar:db/hbase/lib/jruby-complete-1.0.3.jar:db/hbase/lib/stax-api-1.0.1.jar:db/hbase/lib/thrift-0.2.0.jar:db/hbase/lib/jersey-core-1.4.jar:db/hbase/lib/core-3.1.1.jar:db/hbase/lib/jettison-1.1.jar:db/hbase/lib/jsp-api-2.1.jar:db/hbase/lib/hadoop-core.jar:db/hbase/lib/jackson-core-asl-1.5.2.jar:db/hbase/lib/commons-el-1.0.jar:db/hbase/lib/jasper-runtime-5.5.23.jar:db/hbase/lib/jackson-jaxrs-1.5.5.jar:db/hbase/lib/avro-1.3.3.jar:db/hbase/lib/slf4j-log4j12-1.5.8.jar:db/hbase/lib/servlet-api-2.5.jar:db/hbase/lib/guava-r06.jar:db/hbase/lib/commons-codec-1.4.jar:db/hbase/lib/log4j-1.2.16.jar:db/hbase/lib/xmlenc-0.52.jar:db/hbase/lib/jsp-api-2.1-6.1.14.jar:db/hbase/lib/jasper-compiler-5.5.23.jar:db/hbase/lib/jetty-util-6.1.26.jar:db/hbase/lib/activation-1.1.jar:db/hbase/lib/commons-httpclient-3.1.jar:db/hbase/lib/commons-logging-1.1.1.jar:db/hbase/lib/commons-cli-1.2.jar:db/hbase/lib/jaxb-impl-2.1.12.jar:db/hbase/lib/jackson-xc-1.5.5.jar:db/hbase/lib/jaxb-api-2.1.jar:db/hbase/lib/servlet-api-2.5-6.1.14.jar:db/hbase/lib/commons-net-1.4.1.jar
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:java.library.path=/usr/java/jdk1.6.0_25/jre/lib/i386/client:/usr/java/jdk1.6.0_25/jre/lib/i386:/usr/java/jdk1.6.0_25/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:java.io.tmpdir=/tmp
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:java.compiler=<NA>
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:os.name=Linux
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:os.arch=i386
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:os.version=2.6.18-238.9.1.el5
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:user.name=root
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:user.home=/root
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Client environment:user.dir=/work/ycsb/brianfrankcooper-YCSB-4af247f
11/12/13 00:16:54 INFO zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=hconnection
11/12/13 00:16:54 INFO zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181
11/12/13 00:16:54 INFO zookeeper.ClientCnxn: Socket connection established to localhost/127.0.0.1:2181, initiating session
11/12/13 00:16:54 INFO zookeeper.ClientCnxn: Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x13435f4a3ce000b, negotiated timeout = 40000
 0 sec: 100 operations; 251.26 current ops/sec; [UPDATE AverageLatency(ms)=17.67] [READ AverageLatency(ms)=42.41]

参考リンク

Getting Started – GitHub
Running a Workload – GitHub
 

Hadoop World 2011の資料 #hw2011jp

Hadoop World 2011の資料公開されてないかなーと思って探していたら、普通に公開されていました。

■ Hadoop World 2011 のプレゼンテーション資料一覧はこちら↓
Apache Hadoop for the Enterprise | Cloudera

上記サイトから各セッションのプレゼンテーション資料を閲覧することができます。
 
ちなみに下記のサイトからもプレゼンテーション資料を閲覧可能です。
Agenda | Hadoop World Conference

あと、下記サイトに日本語でいくつかのセッションのまとめが書かれていて良い感じです。
(1) Hadoop World 2011 NYC 情報交換
 
まだ全然キャッチアップできていないので、少しずつ読んでいこうと思います。
 

24 Interview Questions & Answers for Hadoop developersの和訳

24 Interview Questions & Answers for Hadoop developers : FromDevの和訳です。

Hadoopのアーキテクチャを良く理解していることは、Hadoopを理解するのに必要であり、Hadoopの力を活かすのに必要となる。ここでは、Hadoopデベロッパーインタビュー内で質問することができる、いくつかの重要な質問がある。これは主にHadoopアーキテクチャ、MapReduce、Hadoop API、HDFSに関連する質問をリストしている。

1. Hadoop内でのJobTrackerとは何?Hadoopクラスタ上ではいくつのJobTrackerインスタンスを起動できる?

JobTrackerはHadoop内で、MapReduceジョブを発行したりトラッキングするためのデーモンサービスである。Hadoopクラスタ内では、たった一つのJobTrackerが起動される。JobTrackerはJVMプロセス上で起動する。一般的な商用クラスタでは別のマシン上で実行する。各SlaveノードはJobTrackerのノード位置により構成される。JobTrackerはHadoop MapReduceサービスの単一障害点である。もしJobTrackerがダウンすると、すべての動いているジョブが停止する。

Hadoop上のJobTrackerは次のアクションを行う。(Hadoop Wikiから抜粋)
・クライアントアプリケーションがJobTrackerにジョブを発行
・JobTrackerはNameNodeと通信し、データの場所を決める
・JobTrackerは利用できるスロットを持つTaskTrackerノードやデータに近いTaskTrackerノードを示す
・JobTrackerは選ばれたTaskTrackerノードに仕事を割り振る
・TaskTrackerノードは監視される。もしハートビートが途切れた場合、失敗したと判断され、別のTaskTracker上で仕事がスケジューリングされる。
・タスクが失敗するとき、TaskTrackerはJobTrackerに知らせるでしょう。JobTrackerはその時どうするかを決める。ジョブをどこかに再発行するかもしれない、特定のレコードを避けるべきとしてマークするかもしれない、そして信頼できないものとしてTaskTrackerをブラックリストにさえするかもしれない。
・仕事が完了したとき、そのJobTrackerはステータスをアップデートする
・クライアントアプリケーションはJobTrakcerの除法を獲得することができる

2. どのようにJobTrackerはタスクをスケジュールする?

TaskTrackerはJobTrackerにハートビートメッセージを送っていた、通常数分ごと、JobTrackerにTaskTrackerがまだ生きていることを安心させるために。これらのメッセージはJobTrackerに利用できるスロットの数を伝えたりもし、そしてJobTrackerはクラスタの仕事を委任することができる場所を最新の状態に保つことができる。

JobTrackerがMapReduceオペレーションの間にタスクをスケジュールするためにどこかに見つけようとすると、データを保持しているDataNodeのホストと同じサーバーのカラのスロットを最初に探す、そして、もしダメであれば、同じラック内のマシンのカラのスロットを探す。

3. Hadoop内のTaskTrackerは何?Hadoopクラスタ上でいくつのTaskTrackerインスタンスが起動する?

TaskTrackerはJobTrackerからのMap、Reduce、シャッフルオペレーションタスクを受け入れる、クラスタ上のスレーブノードデーモンである。どんなHadoopスレーブノード上でも、たった一つのTaskTrackerプロセスが動作します。TaskTrackerはJVMプロセス上で実行します。

全てのTaskTrackerはスロットの集合で構成され、これらは受け入れることができるタスクの数を示します。TaskTrackerはTaskインスタンスと呼ばれる実際の仕事をするためのJVMプロセスに分離することで開始され、これはプロセスの失敗がTaskTrackerのダウンしないことを保証します。

TaskTrackerはTaskインスタンスを監視し、出力やexit codeをキャプチャします。Taskインスタンスが終了すると、成功もしくは失敗し、TaskTrackerはJobTrackerに通知します。

TaskTrackerもまた、JobTrackerにハートビートメッセージを送り、通常数分ごと、JobTrackerにTaskTrackerがまだ生きていることを安心させるために。これらのメッセージはJobTrackerに利用できるスロットの数を伝えたりもし、そしてJobTrackerはクラスタの仕事を委任することができる場所を最新の状態に保つことができる。

4. Hadoop内でのTaskインスタンスは何?それはどこで実行するの?

Taskインスタンスはそれぞれのスレーブノード上で実際のMapReduceジョブが実行される。TaskTrackerはTaskインスタンスと呼ばれる実際の仕事をするためのJVMプロセスに分離することで開始され、これはプロセスの失敗がTaskTrackerのダウンしないことを保証します。

それぞれのTaskインスタンスはJVMプロセス上で実行する。一つのスレーブノード上でタスクインスタンスのマルチ処理となるかもしれない。これはTaskTracer上で構成されるスロットの数に基づく。デフォルトでは、一つの新しいタスクインスタンスのJVMプロセスは一つのタスクによって生成される。

5. Hadoopシステム上ではどれくらいのデーモンプロセスが起動する?

Hadoopは5つの分離したデーモンで構成される。これらのそれぞれのデーモンは自分のJVM内で実行する。

マスターノード上で次の3つのデーモンが起動する

NameNode - このデーモンはHDFSのためのメタデータを保持する
Secondary NameNode - NameNodeのためのメンテナンス機能を行う
JobTracker - MapReduceジョブを管理し、独立したタスクをTaskTrackerを実行しているマシンに分配する

スレーブーノード上で次の2つのデーモンが起動する

DataNode - 実際のHDFSのデータブロックを保持する
TaskTracker - 独立したMapタスクとReduceタスクをインスタンス化し、モニタリングする責任を持つ

6. Hadoopクラスタ上で一般的なスレーブノードの構成は何?スレーブノード上でいくつのJVMを起動させる?

・TaskTrackerのシングルインスタンスは各スレーブノード上で実行する。TaskTrackerは独立したJVMプロセスとして実行する
・DataNodeデーモンのシングルインスタンスは各スレーブノードで実行する。DataNodeデーモンは独立したJVMプロセスとして実行する
・タスクインスタンスの一つもしくは複数のインスタンスは、各スレーブノードで実行する。各タスクインスタンスは独立したJVMプロセスとして実行する。タスクインスタンスの数はコンフィギュレーションによって制御できる。一般的にハイエンドマシンでは、多くのタスクインスタンスを実行するよう構成される。

7. HDFSとNASの違いは何?

HDFSはコモディティハードウェア上で動くようにデザインされたファイスシステムである。既存の分散ファイルシステムと似ている・が多くある。しかしながら、他の分散システムとの違いは重要である。

HDFSとNASの間に次の違いがある
・HDFSデータブロックはクラスタ内で、全てのマシンのローカルドライブにまたがって分散される。一方、NASデータは専用のハードウェア上で保存される
・HDFSは、計算処理がデータに移動されるため、MapReduceシステムで動作するようにデザインされている。NASは、データが計算とは別に保存されているので、MapReduceには適していない。
・HDFSはマシンの集合によって実行され、レプリケーションプロトコルを使用して冗長性を提供する。一方、NASは単一のマシンによって提供され、データ冗長性は提供しない。

8. どのようにNameNodeはDataNodeの障害を扱う?

NameNodeは定期的に各DataNodeからハートビートとクラスタ内のブロックレポートを受け取る。ハートビートを受け取ることは、DataNodeが正常に機能していることを暗に意味する。ブロックレポートはDataNode上の全てのブロックのリストを含む。

NameNodeがDataNodeから一定の時間ハートビートを受信していないことを検知すると、そのDataNodeは死んだものとしてマークされる。死んだDataNode上に保管されていたブロックは、複製されるでしょう。

NameNodeは一つのDataNodeから別のデータノードへデータブロックのレプリケーションを編成する。そのレプリケーションデータはDataNode間で直接転送され、そのデータは決してNameNodeを通過しない。

9. MapReduceプログラミングモデルはreducerがお互いにやりとりし合う方法を提供する?MapReduceジョブ内で、reducerは別のreducerと通信する?

いいえ、MapReduceプログラミングモデルはreducerがお互い通信し合うことを許可しない。redducerは独立して実行する。

10. reducerの数を0にセットできる?

はい、reducerの数を0にセットすることはHadoopでは妥当なコンフィギュレーションです。reducerを0にセットした時、reducerは一つも実行されないでしょう。そして、各mapperの出力がHDFS上の分割されたファイルとして保存されるでしょう。
[reducerを0以上にセットした時は条件が違い、mapperの出力(中間データ)は各mapperスレーブノードのローカルファイルシステム(not HDFS)に書かれる]

11. どこにmapper出力(中間key-valueデータ)は保存される?

mapper出力(中間データ)は各個別のmapperノードのローカルファイルシステム(not HDFS)に保存される。これは一般的にテンポラリディレクトリの場所であり、Hadoopアドミニストレータによるコンフィグ上でセットアップすることができる。中間データはHadoopジョブが完了後に綺麗にされる。

12. combinerって何?いつ私のMapReduceジョブないでcombinerを使うべき?

combinerはMapReduceプログラムの効率を上げるために使われる。combinerは中間map出力を集約するために使われる。combinerはreducerに転送するために必要なデータ量を減らすのを助けることができる。

あなたはreducerのコードをcombinerとして使うことができる。もし実行されるオペレーションが交換可能で、関連しているのであれば。

combinerの実行は保証されない、Hadoopはcombinerを実行するかもしれないし、しないかもしれない。また、一回しか実行しないかもしれない。したがって、MapReduceジョブはcombinerの実行に依存すべきではない。

13. WritableとWritableComparableインターフェースって何?

・org.apache.hadoop.io.WritableはJavaインターフェースである。Hadoop MapReduceフレームワーク内のどんなkeyもしくはvalueタイプも、このインターフェースを実装する。実装は、一般的に、新しいインスタンスを構築するstatic read(DataInput)メソッドの実装で、readFields(DataInput)を呼び出し、インスタンスを返す。

・org.apache.hadoop.io.WritableComparableはJavaインターフェースである。Hadoop MapReduce内のkeyとして使われるどんなタイプもこのインターフェースを実装する。WritableComparableオブジェクトはComparatorを使いお互いを比較することができる。

14. Hadoop MapReduce APIはkeyとvalueクラスにとって何か規約がある?

・keyはorg.apache.hadoop.io.WritableComparableインターフェースを実装しなければならない
・valueは org.apache.hadoop.io.Writableインターフェースを実装しなければならない

15. MapReduce内でIdentity MapperとIdentity Reducerは何?

・org.apache.hadoop.mapred.lib.IdentityMapperは固有の機能を実装し、mappingインプットを直接アウトプットする。もしMapReduceプログラマがJobConf.setMapperClassを使うMapperクラスをセットしないなら、IdentityMapperクラウはデフォルトvalueとして使用される。
・org.apache.hadoop.mapred.lib.IdentityReducerはreduceを実行せず、すべてのインプットvalueを直接アウトプットする。もしMapReduceプログラマがJobConf.setReducerClassを使用するreducerクラスをセットしない場合、 IdentityReducerクラスがデフォルトとして使用される。

16. Hadoop内での投機的実行の意味は?なざ重要なの?

投機的実行は個々のマシンパフォーマンスへの対処方法である。数百、数千台のマシンの巨大なクラスタは他のマシンと同等のパフォーマンスを持たないマシンも含まれているかもしれない。
これはたった一つのマシンがパフォーマンスがよくないというために、全てのジョブ内で遅延を引き起こすかもしれない。これを避けるために、投機的実行は同じmapもしくはreduceタスクの複数のコピーを別のスレーブノード上で実行することができる。最初に完了したノードの結果が使用される。

17. MapReduceジョブ内でいつreducerが始まるの?

MapReduceジョブ内でreducerは全てのMapジョブが完了するまでreduceメソッドが開始されない。reducerは中間key-valueペアをmapperから利用できるようになるとすぐにコピーを開始する。プログラマは全てのmapperが終了した後でreduceメソッドが呼ばれるように定義する。

18. もしreducerがすべてのmapperが完了しないと開始されないのなら、なぜMapReduceジョブの進行状況がMap(50%)、Reduce(10%)のように表示されるの?なぜreducer進捗パーセンテージはmapperがまだ終了していない時に表示されるの??

reducerは中間key-valueペアが利用できるようになるとすぐにmapperからコピーを開始します。進捗状況の計算もまたreducerプロセスによってデータ転送処理の計算が含まれ、そしてreduceの進捗状況ははmapperにとってのどの中間key-valueペアがreducerに転送できるようになるとすぐに表示を開始します。

reducerの進捗状況が更新されているが、プログラマが定義したreduceメソッドはすべてのmapperが終了した後にのみ呼ばれる。

19. HDFSは何?従来のFileSystemとはどう違うの?

HDFS、 Hadoop Distributed File System、はクラスタ上で巨大なデータを保存する責任を持ちます。これはコモディティハードウェア上で分散ファイルシステムを実行するためにデザインされている。既存の分散ファイルシステムと多くの類似点がある。しかしながら、他の分散ファイルシステムとの違いも大きい。

・HDFSは高度なフォールトトレラントであり、ローコストハードウェア上でデプロイするためにデザインされている
・HDFSはアプリケーションデータに対して大きなスループットを提供し、巨大なデータセットを持つアプリケーションに適している
・HDFSはとても大きなファイルをサポートするようにデザインされている。HDFSと互換性のあるアプリケーションでは、大規模なデータセットを扱う。これらのアプリケーションはたった一度だけ書き込みをするが、一回もしくは複数回読み込みをする。そして、ストリーミング速度を満足させる読み込みを必要とする。HDFSはファイル上の write-once-read-many動作をサポートする。

20. HDFSのブロックサイズは?既存のファイルシステムのブロックサイズとどう違う?

HDFS上では、データはブロックに分割され、クラスタ内の複数ノードに分散される。各ブロックは一般的に64MB もしくは128MBのサイズである。
各ブロックは複数回複製される。デフォルトは各ブロックは3回複製される。レプリカは違うノードに保存される。HDFSは各HDFSはブロックを一つの分割したファイルとして保存し、ローカルファイルシステムを利用する。HDFSはブロックサイズは既存のファイルシステムのブロックサイズと比較できない。

21. NameNodeは何?Hadoopクラスタ上でいくつのNameNodeインスタンスが起動するの?

NameNodeはHDFSファイルシステムの中心的存在である。ファイルシステム上の全てのファイルのディレクトリツリーを保持し、クラスタ全体でファイルデータが保持されている場所を追跡する。ファイル自体のデータは保持しない。

たった一つのNameNodeプロセスがどのHadoopクラスタ上でも実行される。NameNodeはJVMプロセス上で実行する。一般的に商用クラスタ内では、別のマシン上で実行される。

NameNodeはHDFSクラスタにとって単一障害点である。NameNodeがダウンすると、ファイルシステムはオフラインになる。

クライアントアプリケーションは、ファイルを探したいとき、もしくはファイルをadd/copymove/deleteしたいときは、いつもNameNodeに問い合わせる。NameNodeはデータが存在する、関連するDataNodeサーバーのリストを返すことにより、正常なリクエストの反応をする。

22. DataNodeは何?Hadoopクラスタ上でいくつのDataNodeインスタンスが起動するの?

DataNodeはHDFS内でデータを保持する。どのHadoopスレーブノード上でもたった一つのDataNodeプロセスがいる。DataNodeはJVMプロセス上で起動する。起動時に、DataNodeはNameNodeに接続する。DataNodeインスタンスはお互い話すことができ、これは主にデータの複製である。

23. どのようにクライアントはHDFSとコミュニケーションする?

HDFSとのクライアントコミュニケーションはHadoop HDFS APIを使うことにより起こる。クライアントアプリケーションはファイルを探したいとき、もしくはHDFS上のファイルをadd/copy/move/deleteしたいときいつでもNameNodeと通信する。NameNodeはデータが存在する関連するDataNodeサーバーのリストを返すことにより、成功したリクエストを返す。クライアントアプリケーションはDataNodeと直接通信することができ、いったんNameNodeはデータの配置を提供する。

24. どのようにHDFSブロックは複製される?

HDFSは大規模なクラスタ内でマシン間で非常に大きなファイルを確実に格納するためにデザインされている。ブロックの配列として、各ファイルを格納する;最後のブロックを除く、ファイル内のすべてのブロックは同じサイズである。

ファイルのブロックはフォールトトレラントのために複製される。ブロックサイズとレプリケーション要素は各ファイルごとに構成できる。アプリケーションはファイルのレプリカの数を特定できる。レプリケーション要素はファイル生成時間を特定することができ、後で変更されることもできる。HDFSは上のファイルはwrite-onceであり、、いつでも厳密に一つのwriterを持っている。

NameNodeはブロックの複製に関する全ての決定を行う。HDFSはユーザーは rack-aware レプリカ配置ポリシーを使う。デフォルト構成では、HDFS上には全部で3つのデータブロックのコピーがあり、2番目コピーは同じラック上のDataNodeに格納され、3番目のコピーは違うラックに格納される。
※和訳は上記の通りだが、象本では、2番目のコピーは別のラック上のDataNodeと書いてあるので、上記の記述は誤りである。
 

Hortonworks CEO Eric Baldeschwieler: Hadoop, the ‘Data Cloud’の和訳

英語の勉強も兼ねて、Hortonworks CEO Eric Baldeschwieler: Hadoop, the 'Data Cloud' – ReadWriteCloudの記事の和訳を載せておきます。まだまだ英語力が低いので、間違って訳している部分もあるかもしれませんので、原文も合わせてよむとよいかもです。また、もし誤訳があれば気軽にコメント頂けると幸いですm(__)m

以下、和訳。一部省略あり

この記事はReadWriteCloude channelの一部であり、仮想化とクラウドコンピューティングをカバーするために捧げられている。チャンネルのスポンサーはインテルとVMwareである。

最近、Oracleは世界の大多数のデータを管理したシステムを構築することに対する所有権を主張した。今年、同じ主張をしているグループはYahooからスピンオフしたものである。

インターネットサイズのデータベースやクラウドアーキテクチャの始まりは、リレーショナルデータベースの性質について困惑をもたらした、ちょうど2、3年より前には、その困惑について考えなければならないとは誰も考えていなかった。とても短い期間でこの部署はとても大きな歩みを見せ ーー 文字通りこの6月 ーー Hortonworksは新しい独立した会社となる。そしてApacheライセンスのオープンソースデータベースシステムであるHadoopを生み出す。そして最新のパートナーはMicrosoftである。今週、ReadWriteWebがHadoopの共同創始者であるHortonworksのCEO、Eric Baldeschwielerに取材した。

トピック:どのように、Windows ServerとHadoopを組み合わせていくのか;他のシステムよりHadoopが、データ構造が適しているのかどうかにかかわらず、数人のNoSQL支持者が主張として;そして、BaldeschwielerはHadoopをNoSQLの一部として把握していないという驚くべき意外な事実。これはHadoopとNoSQLがよく同等に扱われるという事実に反していることだ。

Scott Fulton, ReadWriteWeb:
Windows Server内での役割としてHadoopはどのような役割となるか理解していますか?もしくは役割に値するものはありますか?Domain Name Server やInternet Information ServerはServer Manager内での役割です。

Eric Baldeschwieler:
それは違う、Hadoopはたくさんのコンピューターが組み合わさったものだ。Windows ServerはHadoopクラスターを構築するために、完璧によいコンポーネントである。HadoopクラスターはOSが入った複数のマシンを必要とする。私はHadoopをWindowsのサービスとして考えていない。さらに言えば、Hadoopはコンピューターの集合の外側にあるものである、そしてWindowsでも組織が最も快適に使用しているどんなOSでも動作させることができる。

Microsoftとのパートナーシップというエキサイティングなことは、Windowsを好んで使用するとても多くの組織にHadoopを身近にすることを可能にする。

RWW:
Windowsの機能や単位としてというよりはむしろ、会社の機能、つまりWindowsを実行する全てのコンピューターのコレクションとして置かれるということを好むということですか?

EB:
はい。私はcloud offeringという類似した単語でそれを考えています。ある意味、Hadoopはdata cloudであると。いったん、Hadoopサービスで集めるなら、それがどんなOS上で動いているかは気にするべきではない。今、あなたはHadoopが入ったWindowsによってカスタマイズされたアプリケーションを使用することを選べるかもしれない。OSによって区別しないといけない機会があるが、HadoopはOSによって区別されない。Hadoopによって作られるサービスは、OSにとらわれることなく続けることができる。

Is cloud data different from “regular” data?

RWW:
構造化されたデータの性質に対する本質的ものは何かありますか?SQL Server, Oracle, DB2のようなRDBMSのクラスは、クラウド構成では動作しない、マルチプロセッサやデバイスに広がっていく、そしてHadoopはそれらの代替になると?

EB:
データについては何もない。Hadoopは競合が提供するものよりも、とてもとてもシンプルである。2つの目的のためにボトムアップで作られているので、本当にシンプルなレイヤーとなる。1つめが巨大なスケールアウト。伝統的などのシステムにもない、数千、数万ノードに到達できるようデザインし作られている。例えば、競合するデータベースは1ダースもしくは2ダースまで増やすことができるでしょう。だからHadoopは本当に広くスケールできるようにボトムアップから作られた。

もう一つの違いは、Hadoopはとてもローコストのコモディティハードウェアで構築できるように、ボトムアップから作られた。ハードウェアは壊れるという前提で作られている、そして、もしハードウェアが壊れても動き続けなければならない。これらの2つの目的でHadoopはデザインされている。つまり数千ノードで動けるように、そしてコモディティハードウェア上で動けるようにだ。そしてそれは伝統的なシステムとはとてもことなるデザインのポイントである。伝統的なシステムは基本的にとても複雑なハードウェアソリューションで問題を解決し、それをエクスポートしたものである。よりシンプルに解決できるとても多くの問題がある、もしあなたがスケールアウトについて考えていないのであれば。それは全く違うエコシステムから発達した2匹の動物を見ているようだ。

RWW:
NoSQLの概念 のまわりで点線を引いて 、 それの最中に真正面にHadoopの 象を置く人々がい ます。彼らはNoSQLの基本的な原理は、big dataは構造化されたクエリ言語のために決してデザインされるべきでなかった、と私に言います。単体、結合そして全ての数学的推論のために設計されるべきでなかったというわけではない。big dataはよりシンプルなはずであった、key/valueペアやkeyvalueアーキテクチャは受け入れられるべき、すべてのデータが最終的にあとに続く何かとして。部分的にでも同意してもらえますか?

EB:
述べられたものはない。まず第一に、Hadoopはあなたがリストしたプリミティブを持ついくつかのデータ処理言語をサポートする。HiveはSQLのサブセットを直接サポート。Pigも同様に古典的なテープルオペレーターを全員サポートする。joins, unions, すべてのセット、そして関係演算子を。そして我々はrelational algebraとそういう処理をすることに全く反対ではない。Hadoopは本当に処理エンジンでもある。

一般的に、あなたはNoSQLの動向を話すとき、私はMongoDB, Riak, Redisのような、多くのreal-time storeのことを考える。Hadoopはわずかに異なる獣です。これらはミリ秒以内に、どのようにクエリに反応するかを考えます。Hadoopはこれとは異なり、ミリ秒のレスポンスについては考えない。Hadoopが本当にフォーカスしているのは、バッチ処理である。Hadoopはコモディティハードウェアを使うことで、本当に少ないお金で構成できます。そして、あなたの仕事がある程度の潜在性を持つという仮定をすることによって、集中的な捜査の代わりに、まさしく集約型のデータスキャンニングができる。SQLデータベース、NoSQLストアでさえ、ある特定の行のデータをとてもとても速く引き出すことができるように設計されている。Hadoopはペタバイトのデータをとてもとても速くスキャンできるように設計されている。これらは違うデザインポイントである。

すべての事柄で、これらのシステムの多くが単純な分類を拒否すると思う。Hadoopが進化して、よりローレイテンシーの仕事ができるようになる。データベースが進化して、より大きなシステムにスケールすることができるようになる。そして、NoSQLが進化して、より複雑なクエリを扱えるようになる。

他のシステムがHadoopができることで上回ることができる場所は、high-bahdwidth random accessである。もしあなたが本当にできるだけ速くkey/valueペアをあなたのデータから取り出したいのなら、他のシステムを使うほうがよい。しかしもしあなたが昨年のデータをスキャンしたり、新しいパターンを発見したり、ユーザーにとってパーソナライズしたページを最もよい方法を暗示するための機械学習アルゴリズムを走らせたい場合、それもとてもとても多くのデータで、そして全てのデータを処理する必要がある場合、Hadoopは本当に優れている。

Complementary, not transitional

RWW:
Microsoftの人々は私に話します、彼らはシステム上で動かしており、時期にベータ版を置くでしょうと。そしてそれはユーザー移行データベースを助けるために、Hadoopを使うと。私は尋ねるつもりだった、なぜこの移行のために全てのデータベースではダメなのかと。しかし、私があなたが言っていることを正しく理解すれば、100万の中の1つを探すための分析のタイプではないかと。山積みの針で、シーケンシャルリードの代わりに。

EB:
はい、そのワークロードはHadoopよりも伝統的なデータベースのほうがよりコストパフォーマンスに優れています。それは疑いようがない。あなたは、人々がトランザクションのデータベースをHadoopにリプレイスするのをみないでしょう、彼らがトランザクションのシステムを構築しようとしているときは。ほとんど全てのケースにおいて意味をなすことは、トランザクションシステムからあるデータをコピーし、そして、それをHadoop上保存することです。それをするために増加するコストはとても小さく、Hadoopはそのデータを良くするために使うことができる。

例えば、私たちはYahooでの沢山のことを見てきている、数週間、数ヶ月、30、60、90日の期間かもしれない、トランザクションシステム上でデータが生きているということを。なぜなら、それくらいの長さが、生産ニーズを満たすのに必要となるからだ。しかし、Hadoopの中には1年、2年、それ以上の期間のデータを保持すべきである。それにより、前年比や複数年の粒度で調査することができる。それはあなたに違う方法でデータを理解させ、すべて利用可能となる。ところが、オンラインデータは全く利用できない、なぜならトランザクションシステム内のペタバイトデータは保持することは費用対効果がよくないからである。そして、たとえそれがそうであるとしても、我々が実際のユースケースでよく見るものは、そういう仕事はHadoopで行うことにより、既存システムの一つをちょうど壊すことができる。

だからあなたは人々が仕事を分割することを見る、例えば、トランザクションデータベースを必要とするユーザーリクエストを扱う生産システムと、数日間以上のユーザーのアクティビティを集計してレポートする生産システムの2つがある。何が起こっていたか、そのレポーティング機能はちょうどデータベースを停滞させていた。それはもはやトランザクション要件を時間内に満たすことはできない、負荷が上がるにつれて。だから彼らは集計処理をHadoopに移行してきた、そしてトランザクション処理はトランザクションデータベースに残したままである。今、彼らはより速くレポートを得ることができ、既存の従来のシステムを切り離し、毎秒より多くのトランザクションをさばいている。

RWW:
だから、補完的なユースケースがあるんですね、人々のために説明するだけでなく概念図が ーー どのように彼らのシステムを分割することができるか、彼らが1年から2年以上の間細い観察を必要とするときに、彼らは方法がある ーー

EB:
まさにそのとおり。同じことがビジネス分析システムにも適用できる。これらもまたあまりよくスケールしない。だから我々が見ていることは、人々はHadoopを使えるだろうと、新しいデータの見方を生み出すために、それらのシステムに役に立つ、データを調査するためのこれらのツールを教えられたアナリスト達によって使われることができる。それはYahooが多くのことをしている何かである;彼らは従来のツールを使っているデータの”segments”と呼ばれるものが好きであることを調査しているが、彼らは全てのデータの小さな断片で集団を組むことができるだけだ、データマートやキューの中で。だから彼らは見解を生み出すためにHadoopを使うでしょう、そしてHadoopをデータマートに積み込む。。。それはHadoopにリプレイスするケースではない、しかし他のシステムをよく補完する場所でHadoopを使用するケースである。
 

[Hadoop]象本第2版 9章 「Hadoopクラスタ構築」のまとめ

2010年頃における、Hadoopのデータノードやtasktrackerを動作させるマシンの典型的な構成
・プロセッサ
クアッドコアのIntel Xeon 2.0~2.5GHz x2
・メモリ
16~24GB
・ストレージ
4 x 1TB SATAディスク
・ネットワーク
ギガビットイーサネット

RAIDを使わないのはなぜ?

RAID0は、HDFSが使用するJBOD(Just a Bunch Of Disks:単純に大量のディスクを並べただけ)構成よりも低速であることがわかっている
HDFSのJBOD構成では、すべてのディスク間でHDFSブロックをラウンドロビンで配置。
RAID0がJBODよりも低速な理由は、RAID0の読み書き操作がRAIDアレイ中の最も低速なディスクによって制限されてしまうから
JBODでは、ディスクの操作は独立しているので、操作の平均速度は最も低速なディスクの速度よりも高速になる
Yahoo!のクラスタで実施されたベンチマークテスト(Re: RAID vs. JBOD – Runping Qi – org.apache.hadoop.core-user – MarkMail)においては、あるテスト(Gridmix)でJBODはRAID0より、10%高速であり、別のテスト(HDFSの書き込みのスループット)では30%高速
さらに、JOBD構成においてディスクの障害が発生した場合でも、HDFSは障害の発生したディスクを除外して動作を続けることができるが、RAIDにおいては1つのディスクの障害が、アレイ全体(したがってノードそのもの)を使用不可にする

小規模なクラスタ(10ノード程度)の場合、通常ネームノードとjobtrackerを同じマスターマシンで実行することができる

セカンダリネームノードはプライマリネームノードと同じ量のメモリを要求する

Hadoopの設定

Hadoopの設定ファイル
ファイル名 フォーマット 説明
hadoop-env.sh Bashスクリプト Hadoopを実行するためのスクリプトで使われる環境変数
core-site.xml Hadoopの設定用XML Hadoop Coreの設定。HDFSとMapReduceが共通に利用するI/Oなど
hdfs-site.xml Hadoopの設定用XML HDFSデーモンの設定。ネームノード、セカンダリネームノード、データノード用
mapred-site.xml Hadoopの設定用XML MapReduceデーモンの設定。jobtrackerとtasktracker用
masters テキスト セカンダリネームノードが実行されるマシンのリスト(1行に1台)
slaves テキスト データノードとtasktrackerが実行されるマシンのリスト(1行に1台)
hadoop-metrics.properties Javaのプロパティ Hadoopへメトリクスを公開する方法を制御するプロパティ
log-4j.properties Javaのプロパティ システムログファイル、ネームノードの監査ログ、tasktracker の子プロセスのtaskログのプロパティ

上記のファイルはすべてHadoopディストリビューションのconfディレクトリにある。

mastersというファイル名は、実際には誤解を招くファイル名で、これはセカンダリネームノードを実行するべきマシンのリスト。slavesファイルは、データノードやtasktrackerを実行するべきマシンのリスト。これらのファイルは、ネームノードやjobtrackerで実行される制御スクリプトからのみ使われるものなので、ワーカーノードへ配布する必要はない。

ネームノードやjobtrackerをどのマシンで実行するかは、スクリプトをどのマシンで実行するかによって決まるので、mastersファイルで指定する必要はない

start-dfs.shの挙動

1. ローカルマシン(このスクリプトが実行されたマシン)上でネームノードを起動
2. slavesファイルに書かれている各マシン上でデータノードを起動
3. mastersファイルに書かれている各マシン上でセカンダリネームノードを起動

start-mapred.shの挙動

1. ローカルマシン上でjobtrackerを起動
2. slavesファイルに書かれている各マシン上でtasktrackerを起動

メモリ

ワーカーノードのメモリの試算
JVM デフォルトのメモリ使用量(MB) 8プロセッサ、400MB/子(MB)
データノード 1000 1000
tasktracker 1000 1000
tasktrackerの子mapタスク 2 x 200 7 x 400
tasktrackerの子reduceタスク 2 x 200 7 x 400
合計 2800 7600

ネームノードに割り当てられるメモリ量は、hadoop-env.shのHADOOP_NAMENODE_OPTSを修正し、メモリサイズを設定するJVMのオプションを指定。
セカンダリネームノードの要求するメモリはプライマリと同様なので、ネームノードのメモリ割り当てを変更した場合は、セカンダリネームノードにも同様の修正が必要(HADOOP_SECONDARYNAMENODE_OPTSで設定)。

システムのログファイル

Hadoopが生成するシステムログファイルは、デフォルトで$HADOOP_INSTALL/logsに保存。
この場所は、hadoop-env.shのHADOOP_LOG_DIRによって変更することが可能。

マシン上で実行されているHadoopの各デーモンは、それぞれ2つのログファイルを生成。1つめはlog4jを使って出力されるログ。このファイルは.logで終わるファイル名を持っており、ほとんどのアプリケーションのログメッセージはこちらに出力されるので、診断すべき問題が生じた場合には、まずこのログを調べてみるべき。標準的なHadoopのlog4jの設定では、ログをローテートするためにDailyRolling File Appenderが使われる。古いログファイルは決して自動的には削除されないので、ローカルノードのディスク領域を使い切らないよう、定期的にそれらのファイルが削除されるか、アーカイブされるようにしてやらなければならない。

2番目のログファイルは、標準出力と標準エラー出力を集約したログ。このログファイルは.outで終わるファイル名を持ち、Hadoopがロギングにはlog4jを使うことから、通常はわずかな出力しかされないか、あるいはまったく出力されないか。このログはデーモンが再起動したときにのみローテートされ、最新の5つのログだけ残される。古いログファイルは1から5の数字がファイル名の末尾に付けられ、5が最も古いファイル。

SSHの設定

接続のタイムアウトを短くしたい時
→ConnectTimeoutオプション

新しいホストのキーが自動的にknown hostファイルに追加されるようにする
→StrictHostKeyCheckingでnoに設定

HDFS

HDFSデーモンの重要なプロパティ
プロパティ名 デフォルト値 説明
fs.default.name URI file:/// デフォルトのファイルのシステム。このURIは、namenodeのRPCサーバーが動作しているホストの名前とポート番号を定義する。デフォルトのポートは8020。このプロパティはcore-site.xmlで設定するべきである。
dfs.name.dir カンマ区切りのディレクトリ名 ${hadoop.tmp.dir}/dfs/name ネームノードが永続的にメタデータを保存するディレクトリのリスト。ネームノードは、リスト中の各ディレクトリにメタデータをコピーする。
dfs.data.dir カンマ区切りのディレクトリ名 ${hadoop.tmp.dir}/dfs/data データノードがブロックを保存するディレクトリのリスト。それぞれのブロックは、これらのディレクトリの中の1つにだけ保存される。
fs.checkpoint.dir カンマ区切りのディレクトリ名 ${hadoop.tmp.dir}/dfs/namesecondary セカンダリネームノードがチェックポイントを保存するディレクトリのリスト。セカンダリネームノードは、リスト中の各ディレクトリにチェックポイントのコピーを保存する。

dfs.name.dirは、1つないし2つのローカルディスクと(例えばNFSマウントされたディレクトリのような)リモートのディスクに書かれるように設定するのが一般的。

最大のパフォーマンスを得るためには、ストレージディスクをマウントする際にnoatimeオプションを付けるべき。この設定は、ファイルの読み込み時に最終アクセス時刻の情報を書かないようにするもので、かなりパフォーマンスが向上する。

HDFSのストレージディレクトリは、デフォルトではHadoopの一時ディレクトリの下にあることに注意。hadoop.tmp.dirプロパティで指定されており、デフォルトは/tmp/hadoop-${user.name}

MapReduce

MapReduceデーモンの重要なプロパティ
プロパティ名 デフォルト値 説明
mapred.job.tracker ホスト名とポート local jobtrackerのRPCサーバーが動作するホスト名とポート。デフォルト値のlocalに設定された場合、jobtrackerはMapReduceジョブが実行されたときに、要求に応じてインプロセスで実行される(この場合、jobtrackerデーモンを起動する必要はない。実際、このモードでjobtrackerを起動しようとするとエラーになる)
mapred.local.dir カンマ区切りのディレクトリ名 ${hadoop.tmp.dir}/mapred/local MapReduceがジョブの中間データを保存するディレクトリのリスト。それらのデータは、ジョブの実行終了時にクリアされる
mapred.local.dir カンマ区切りのディレクトリ名 ${hadoop.tmp.dir}/mapred/local fs.default.nameに対する相対ディレクトリ。ジョブの実行中、ここで指定されたディレクトリに共有ファイルが保存される
mapred.tasktracker.map.tasks.maximum int 2 任意の時点においてtasktracker上で同時に実行可能なmapタスク数
mapred.tasktracker.reduce.tasks.maximum int 2 任意の時点においてtasktracker上で同時に実行可能なreduceタスク数
mapred.child.java.opts String -Xmx200m mapタスクとreduceタスクを実行するtasktrackerの子プロセスを起動するのに使われるJVMオプション。このプロパティはジョブごとに設定することもでき、例えばデバッグのためにJVMのプロパティを設定したい場合などに便利
RPCサーバーのプロパティ
プロパティ名 デフォルト値 説明
fs.default.name file:/// HDFSのURIが設定された場合、このプロパティはネームノードのRPCサーバーのアドレスとポートを決定する。指定されなかった場合のデフォルトのポート番号は8020
dfs.datanode.ipc.address 0.0.0.:50020 データノードのRPCサーバーのアドレスとポート
mapred.job.tracker local ホスト名とポートを指定した場合、このプロパティはjobtrackerのRPCサーバーのアドレスとポートを決定する。一般的に使われるポートは8021
mapred.task.tracker.report.address 127.0.0.1:0 tasktrackerのRPCサーバーのアドレスとポート。これは、tasktrackerの子JVMがtasktrackerと通信するために使われる。この場合、サーバーがバインドするのはローカルのループバックアドレスだけなので、空いている任意のポートを使っても構わない。この設定を変更するのは、マシンがループバックアドレスを持たないときに限るべきである
HTTPサーバーのプロパティ
プロパティ名 デフォルト値 説明
mapred.job.tracker.http.address 0.0.0.:50030 jobtrackerのHTTPサーバーのアドレスとポート
mapred.task.tracker.http.address 0.0.0.:50060 tasktrackerのHTTPサーバーのアドレスとポート
dfs.http.address 0.0.0.:50070 ネームノードのHTTPサーバーのアドレスとポート
dfs.datanode.http.address 0.0.0.:50075 データノードのHTTPサーバーのアドレスとポート
dfs.secondary.http.address 0.0.0.:50090 セカンダリネームノードのHTTPサーバーのアドレスとポート

バッファサイズ

Hadoopは、I/O操作のバッファサイズとして4KB(4096バイト)を使用する。これは控えめな設定であり、近年のハードウェアやオペレーティングシステムであれば、バッファサイズを大きくすることで、パフォーマンスを改善することができる。64KBあるいは128KBが一般的な選択肢。この値は、core-site.xmlでio.file.buffer.sizeプロパティによって設定。

HDFSのブロックサイズ

デフォルトで64MBだが、多くのクラスタでは128MBあるいはさらに大きい256MBに設定して、ネームノードのメモリ負荷を軽減するとともに、mapperにより多くのデータを処理させている。この値は、hdfs-site.xmlのdfs.block.sizeプロパティで設定

Hadoopクラスタのベンチマーク

TestDFSIOを使ったHDFSのベンチマーク

TestDFSIOは、HDFSのI/O性能をテスト。ファイルを並列に読み書きするための便利な方法としてMapReduceジョブを使い、テストを実施。各ファイルは個別のmapタスクによって読み書きされ、mapタスクの出力は、処理されたばかりのファイルに関連する統計情報を収集するために使われる。この統計情報はreduceによって集計され、サマリが生成される。

以下のコマンドは、それぞれが1000MBのファイルを10個書きだす。

% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar TestDFSIO -write -nrFiles 10 -fileSize 1000

実行が完了すると、結果がコンソールに出力されると同時に、ローカルファイルにも記録(TestDFSIO_results.log)

読み込みのベンチマークを実行するには、引数に-readを使う。読み込むファイルはテストの時点で存在していなければならないことに注意。(TestDFSID -writeで書かれたファイルを使う)

% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar TestDFSIO -read -nrFiles 10 -fileSize 1000

ベンチマークが終了したら、生成されたファイルは引数-cleanを使ってHDFSから削除することができる

% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar TestDFSIO -clean

ソートを含むMapReduceのベンチマーク

ランダムデータの生成、ソートの実行、結果の検証の3ステップ。
まず、RandomWriterでランダムなデータを生成。RandomWriterはMapReduceのジョブをノードあたり10のmapで実行し、それぞれのmapは(おおよそ)10GBのランダムなバイナリデータを、様々なサイズのキーと値として生成。

以下に、RandomWriterにrandom-dataというディレクトリへ出力を書き出させる方法を示す。

% hadoop jar $HADOOP_INSTALL/hadoop-*-examples.jar randomwriter random-data

以下に、Sortプログラムを実行。

% hadoop jar $HADOOP_INSTALL/hadoop-*-examples.jar sort random-data sorted-data

最終的な動作チェックとして、sorted-dataにあるデータが、実際に正しくソートされているかどうかを確認

% hadoop jar $HADOOP_INSTALL/hadoop-*-test.jar testmapredsort -sortInput random-data -sortOutput sorted-data

その他のベンチマーク

・MRBench
小さなジョブを多くの回数実行。これは小さなジョブがレスポンスよく実行されるかどうかをテストするものなので、ソートのテストとはよい具合に対照的

・NNBench
ネームノードのハードウェアの負荷テストに便利。

・Gridmix
クラスタのリアルな負荷をモデル化するように設計されたベンチマークスイートで、現実の運用で見られる様々なデータアクセスのパターンをまねるもの。

最後にサイバーエージェントさんのスライドも載せておきます。



 

Hadoop 第2版

Tom White オライリージャパン 2011-07-23
売り上げランキング : 19904
by ヨメレバ

 

[Hadoop]象本第2版 まとめ

Hadoopのバイブル、Hadoop 第2版を自分用にまとめたものを公開しています。
まだまとめていない章は、まとめ次第公開予定です。
また、既にまとめている章も、適宜修正予定です。

1章 Hadoop事始め

2章 MapReduce

3章 Hadoop分散ファイルシステム

4章 HadoopのI/O

5章 MapReduceアプリケーションの開発

6章 MapReduceの動作

7章 MapReduceの型とフォーマット

8章 MapReduceの機能

9章 Hadoopクラスタの構築

10章 Hadoopの管理

11章 Pig

12章 Hive

13章 HBase

14章 ZooKeeper

15章 Sqoop

16章 ケーススタディ

付録A Apache Hadoopのインストール

付録B ClouderaのDistribution including Apache Hadoopについて

付録C NCDC気象情報データの準備

付録D NTTデータの実証事業におけるHadoop活用のポイント

Hadoop 第2版

Tom White オライリージャパン 2011-07-23
売り上げランキング : 19904
by ヨメレバ

 

Hadoop Conference Japan 2011 FALLで使用された資料やつぶやき #hcj11f

Hadoop Conference Japan 2011 FALLで使用された資料やつぶやきを抜粋しています。
まだ公開されていない資料もあるので、公開され次第掲載予定です。
また、既に公開されており、このエントリに載っていない資料があれば教えて頂けると幸いです。

開催情報はこちら↓
Hadoop Conference Japan 2011 Fall – Eventbrite

QAサイトはこちら↓
QuestionVOTE!! | Hadoop Conference Japan 2011 Fall

当日のつぶやきはこちら↓
#hcj11f – Topsy

講演資料や動画一覧はこちら↓
QuestionVOTE!! | Hadoop Conference Japan 2011 Fall

続きを読む