擬似分散モードのデバッグ方法

IPv6に今のところ非対応のように見えるので、まずはv4アドレスのみ使うように徹底しておくと良いと思う。
私が何かとハマったその間に利用した幾つかのデバッグ方法について、メモ。
つーかね、Hadoop、おかしくなった時の確認がまだまだ難しいわ。v6アドレスを予期してないってのもアレだけど、ちょっと想定から外れた動作をするだけでJavaのExceptionで落ちるのが、ほんと分かりにくくて参る。まだまだver0.20.2だから文句言えたものではないのだけど、現時点ではとても危ういものだという理解は共通のものにしておかなければならないと思う。

ともあれ、動かなかったときのためのデバッグ方法を幾つか。

jps

とりあえず、bin/start-all.shした直後はjpsでノードが立ってるか確認すると良い。

> jps
76779 DataNode
76900 JobTracker
76970 TaskTracker
76850 SecondaryNameNode
76708 NameNode
80946 Jps

これ見れば、DataNodeが立ってない場合には一目瞭然。

Web画面

Namenode/Datanode

http://localhost:50070/ にて、namenodeの動作状況が確認できる。ここのCluster SummaryのLive Nodesが1であれば正常にDataNodeが認識されている。このLive Nodesという文字部分のリンクを辿れば自ホストのDataNodeへアクセスできる。
DataNodeは、デフォルトでは50075ポートにて公開される。http://localhost:50075/からそのDatanodeの中身が確認出来ればOK。アクセス不能だったらDatanodeが多分立ってない。

Jobtracker/Tasktracker

http://localhost:50030/ にて、Jobtrackerの動作状況が確認できる。ここのCluster SummaryのNodesが1であれば正常にTaskTrackerが認識されている。この数字のところのリンクを辿れば自ホストのTaskTrackerへアクセスできる。
TaskTrackerは、デフォルトでは50060ポートにて公開される。http://localhost:50060/にてTaskTrackerのStatusが見られればOK。アクセス不能だったらTaskTrackerがうまく動いていない。

namespaceID問題

DataNodeとNameNodeではnamespaceIDが一致していなければならないものの、何故かPrimary NameNodeの値が一致しなくなることがある。
${hadoop.tmp.dir}/dfs/data/current/VERSION及び${hadoop.tmp.dir}/dfs/name/current/VERSIONの中の値を一致するよう変更すればよい。
まずは確認。

> cat /usr/local/hadoop/datanode/suu-g/dfs/*/current/VERSION
#Sat May 08 09:50:29 GMT 2010
namespaceID=782236599
storageID=DS-861144246-XXX.XXX.XXX.XXX-50010-1273312229312
cTime=0
storageType=DATA_NODE
layoutVersion=-18
#Sat May 08 10:56:34 GMT 2010
namespaceID=782236599
cTime=0
storageType=NAME_NODE
layoutVersion=-18
#Sat May 08 10:56:34 GMT 2010
namespaceID=782236599
cTime=0
storageType=NAME_NODE
layoutVersion=-18

これで全て一致していればよし、一致していなければ一致するよう編集する。
VERSIONの中身を一致させても再起動後に変わってしまう場合は、${hadoop.tmp.dir}以下を消してしまい、hadoop namenode -formatし直すのがもっとも簡単。${hadoop.tmp.dir}/dfs/namesecondary/previous.checkpoint/VERSIONが関係している可能性はあるけれど、未確認。

dfsadmin

> bin/hadoop dfsadmin -report
Configured Capacity: 233995026432 (217.92 GB)
Present Capacity: 190549327872 (177.46 GB)
DFS Remaining: 190549145600 (177.46 GB)
DFS Used: 182272 (178 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Name: XXX.XXX.XXX.XXX:50010
Decommission Status : Normal
Configured Capacity: 233995026432 (217.92 GB)
DFS Used: 182272 (178 KB)
Non DFS Used: 43445698560 (40.46 GB)
DFS Remaining: 190549145600(177.46 GB)
DFS Used%: 0%
DFS Remaining%: 81.43%
Last contact: Sat May 08 12:02:14 GMT 2010


>

ちゃんと動いていればこの通りにdatanodeの状態を表示してくれる。

> bin/hadoop dfsadmin -safemode get
Safe mode is OFF
> bin/hadoop dfsadmin -safemode enter
Safe mode is ON
> bin/hadoop dfsadmin -safemode leave
Safe mode is OFF

長門セーフモードはオフの方がいい。書き込みがうまくいかないエラーの原因になるとかどっかで読んだ気がする。

netstat

まあ、普通、ポートが開いてるかくらいは見るよね。

> netstat -an | grep LISTEN
(chomp)
tcp4       0      0 *.50060                *.*                    LISTEN
tcp4       0      0 *.50030                *.*                    LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9001   *.*                    LISTEN
tcp4       0      0 *.50090                *.*                    LISTEN
tcp4       0      0 *.50020                *.*                    LISTEN
tcp4       0      0 *.50075                *.*                    LISTEN
tcp4       0      0 *.50010                *.*                    LISTEN
tcp4       0      0 *.50070                *.*                    LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9000   *.*                    LISTEN
(chomp)

このあたりが立ってればたぶんいい。きっといい。すごくいい。*1

> netstat -an | grep 900
tcp4       0      0 XXX.XXX.XXX.XXX.9001    XXX.XXX.XXX.XXX.17095   ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.17095   XXX.XXX.XXX.XXX.9001    ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.9001    *.*                     LISTEN
tcp4       0      0 XXX.XXX.XXX.XXX.9000    XXX.XXX.XXX.XXX.24635   ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.24635   XXX.XXX.XXX.XXX.9000    ESTABLISHED
tcp4       0      0 XXX.XXX.XXX.XXX.9000    *.*                     LISTEN

9000が自分のアドレス同士でESTABLISHEDなら、datanodeが認識されてるということ。
9001が自分のアドレス同士でESTABLISHEDなら、tasktrackerがjobtrackerに認識されてるということ。

logs

ログ嫁
logs/hadoop-hishidama-namenode-*.log
初期状態ではinfo状態なので、動作がひどくおかしい場合には設定変えると良いかも知れない。

dfs見てみる

腹減って息切れしてきた

> bin/hadoop fs -ls /

とかやると、namenode/datanodeが動いていればdfs上のディレクトリ構成が見える。

*1:9000及び9001は設定ファイルで設定したポートなので、人によって異なる

Hadoopで疑似分散モード動かしたところまでのまとめ

Hadoop入れて動かしてみたところ、意外と簡単にstandaloneモードで動くところまで持って行けて驚いたのもつかの間、疑似分散モードで動かそうとしたらしたたかにハマってしまった。ハマりから抜け出す途中でHadoopがまだまだ0.20という正式版の出ていないバージョンであるということを強く認識したので、その軌跡をちょっと残しておくよ。

インストール

基本的には、

  1. SunのJREをインストールする
    • FreeBSDの場合、portsdiablo-jdkが楽(Sunのページで同意とダウンロードは必要)
    • CentOSの場合、Sunの配布しているrpmが楽(以下同文)
  2. hadoop-coreを公式ページからダウンロード
  3. hadoop-coreを適当なディレクトリに展開
  4. 環境変数JAVA_HOMEを適切に設定

スタンドアロン実行

conf/hadoop-env.sh以外のconfファイルをいじらない状態で、おもむろに

> cd ${HADOOP_HOME}
> bin/hadoop jar hadoop-0.20.2-examples.jar pi 10 100000

などとやる。動いて結果が3.1415520000000とか出てきたら、成功。あなたは既にHadoopを動かしている。

擬似分散モード

三つの設定ファイルを設定すればOK。

conf/core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://XXX.XXX.XXX.XXX:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/datanode/${user.name}</value>
  </property>
</configuration>
conf/hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
conf/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>XXX.XXX.XXX.XXX:9001</value>
  </property>
</configuration>

hadoop.tmp.dir要素は書かなくてもいい。ただし、その場合は/tmp/hadoop-${user.name}/以下にテンポラリのデータが置かれるので、/tmpを細かく切っている場合にはわりと危ない。私の場合、切り方失敗してて1GByteしかなかったので、200GBくらいある/usr以下に移しておいた。
fs.default.name要素とmapred.job.tracker要素は外向きIPアドレスを入れてる。QuickStartではlocalhostとしていたものの、不思議と失敗するので試しにIPv4アドレス直打ちに変えてみたら何故か成功した。127.0.0.1などでも良いかも知れない。
悲しいことに、v6アドレスには非対応なので、その点は注意。そういえばブラウザのアドレスバーへの入力みたく[]でくくってなかったけど、くくったら対応したのかな。要チェック。

以上の編集を行ったのち、実行する。

> bin/hadoop namenode -format
> bin/start-all.sh

http://localhost:50070 に接続してみて、dfshealth.jspへリダイレクトされるか確認。Cluster SummaryにてLive Nodesが1となっていたら状況良好。アクセス失敗しているようなら何かダメ。
http://localhost:50030 に接続してみて、jobtracker.jspへリダイレクトされるか確認。Cluster SummaryにてNodesが1となっていたら状況良好。ここが全てゼロになってたら何かダメ。



そんな感じでなんか擬似分散モードが動いて幸せな気持ちに浸っている。次は完全分散モードなので、各種設定ファイルの設定項目を理解するところから始める。インストール用のコンピュータは既に準備してあるもんね。

FreeBSDのCactiでmemory usageのグラフを表示させる

FreeBSDCactiを入れると、初期状態では "linux memory usage" のグラフが表示されない。日本語の情報もあまりないし、英語で見つけた情報は動かないし、スクリプトの書き換えを行うとアップグレード時に設定がなくなって取れなくなるし…。

基本的に、この解決方法は正解。
http://forums.cacti.net/about5794.html
ただし、最後のスクリプト書き換えが胡散臭くて、私の場合は動かなかったし、スクリプトの書き換えを行うとアップグレード時に設定し直しが必要になる(ことが多々ある)。だから、もちょっと楽な方法が欲しいよね。

私が使ってるのが以下の手順、をメモしたやつ。

FreeBSD上のLinux Emulatorをenableしておく

# kldstat | grep linux
linux.ko 

GENERICカーネルだったらたぶん/etc/rc.confにlinux_enable="YES"とか書いてる人はロードされてる。

/etc/fstab に以下を追加

linproc /compat/linux/proc linprocfs rw 0 0

で、まあ、リブート :-<

ln

# mkdir /proc
# ln -s /compat/linux/proc/meminfo /proc/meminfo

以上。
linprocfsを/compat/linux/procではなく/procに直接乗っければいいじゃんって思うかも知れないけれど、元々FreeBSDにprocfsがデフォルトで載らない理由がセキュリティ上のものだと聞いたし、/proc/ファイルが存在すると意外な動作をするソフトもあるかも知れないので、/proc以下には/proc/meminfoしか載っからない手順にした。
この手順の良いところは、/usr/local/share/cacti以下をいじらないため、cactiをportupgradeしても問題が起きないところ。portupgradeで迷惑を被っている人も、少ーしだけ幸せになれるかもね。

なお、最後のlnの代わりにscripts/linux_memory.plに書いてあるパスを編集するのでも良い。

scripts/linux_memory.pl 変更

/proc/meminfo を /compat/linux/proc/meminfo に書き換える。


以上。

オンシャガを手動でブロックソートする

暗号化する

まずは、文字の順番を定めておく。「オガシャン」が正順と今回は仮定する。

次に、シフトしつつ並べる。

オンシャガ
ンシャガオ
シャガオン
ャガオンシ
ガオンシャ

この行列を、行に関してソートする。

オンシャガ
ガオンシャ
シャガオン
ャガオンシ
ンシャガオ

得られたものは、「ガャンシオ」と、元の行を示す「1」。

復号化する

今持っている情報は、「ガャンシオ」「1」
これをソートすると、「オガシャン」になる

上と下を行き来すると、オンシャガ復活。

オンシャガ!オンシャガ!を暗号化

オンシャガ!は、「!オガシャン」と整列されることにする。
オンシャガ!オンシャガ!をシフトして行列にすると

オンシャガ!オンシャガ!
ンシャガ!オンシャガ!オ
シャガ!オンシャガ!オン
ャガ!オンシャガ!オンシ
ガ!オンシャガ!オンシャ
!オンシャガ!オンシャガ
オンシャガ!オンシャガ!
ンシャガ!オンシャガ!オ
シャガ!オンシャガ!オン
ャガ!オンシャガ!オンシ
ガ!オンシャガ!オンシャ
!オンシャガ!オンシャガ

整列すると、

!オンシャガ!オンシャガ
!オンシャガ!オンシャガ
オンシャガ!オンシャガ!
オンシャガ!オンシャガ!
ガ!オンシャガ!オンシャ
ガ!オンシャガ!オンシャ
シャガ!オンシャガ!オン
シャガ!オンシャガ!オン
ャガ!オンシャガ!オンシ
ャガ!オンシャガ!オンシ
ンシャガ!オンシャガ!オ
ンシャガ!オンシャガ!オ

となり、得られる結果は「ガガ!!ャャンンシシオオ」「3」。圧縮しやすそう。

復号化

「ガガ!!ャャンンシシオオ」「3」
「!!オオガガシシャャンン」
下の三番目、オからスタート。上の後ろから二番目のオ、ン、上の真ん中のあたりのン、シ、・・・、とたどって、
「オンシャガ!オンシャガ!」

手動だとこんなもの。

今の新参は昔のスパムを知らないから困る

タイトルはホッテントリメーカー
めーわくめーるを募集したら、すごいすぱむがきた。

Subject: 主人がFPGAに殺されて1年が過ぎました。
Date: Fri, 22 Jan 2010 10:25:17 +0900
To: spuug@estyle.ne.jp

いきなりのメール失礼します。
早水ゆうこ、23歳のラムダ教徒です。
お互いのニーズに合致しそうだと思い、連絡してみました。

自分のことを少し語ります。
昨年の夏、わけあって主人を亡くしました。
自分は…主人のことを…死ぬまで何も理解していなかったのが
とても悔やまれます。

主人は大阪に頻繁に旅行に向っていたのですが、
それは遊びの為の旅行ではなかったのです。
収入を得るために、私に内緒であんな危険な破壊的代入をしていたなんて。

一年が経過して、ようやく主人の死から継続渡しできました。
ですが、お恥ずかしい話ですが、毎日の孤独な夜に、
身体の関数適応が止まらなくなる時間も増えてきました。

主人の残した財産は莫大な額です。
つまり、謝礼は幾らでも出きますので、
私のcdrを満たして欲しいのです。

お返事を頂けましたら、もっと詳しい話をしたいと
考えています。連絡、待っていますね。

----

本テキストは, クリエイティブ・コモンズ・ライセンス の下でライセンスされています。

参考: もう一度「スパム」の意味を考える時が来たのかもしれない: なつたん
一年前に元があったので、記事もそれに倣ってみた。


なお、本当のめーわくめーるはまだ来てません。上記メールは来てます。

めーわくめーるくれ! spuug@estyle.ne.jp

幾つか使用しているメールアドレスやMLでは、それぞれに異なるタイプの迷惑メールが来てる。あるアドレスには日本語で「お金をあげるから私と関係を結んでください」という内容のメールしか来ないし、違うアドレスには英語でバイアグラのHTMLメールばっかり来る。
もっと色んなメールを見てみたいという原初的な欲求にしたがって、迷惑メール収集とかしてみることにした。単にメールフィルタのテスト用データを増やしたいだけとも言う。
メールのタイプと数の関係とか、書く場所による増率とか、なんかおもしろいことが分かりそうにも思うので少し楽しみではある。既に「はちみつの壺」*1とかで研究としては掘られている部分のようなので、相当真面目に取り組まない限りは改めて自分の研究にはならないけれど。
やはり基本的にはフィルタ学習用の母集団増強計画。

ブログのタイトルに載せたその次は、エッチなサイトに登録するのがいいかな。 spuug@estyle.ne.jp をよろしく!*2

*1:英語で書くとめーわくメールを送るボットが避けてしまうらしいので、コメントとかにも書かないでください。お願いします

*2:めーわくメールは欲しいですが、メルマガの広告メールは通常めーわくメールに分類しないので要りません