HadoopのIPC/RPC

Hadoopは内部的に独自のIPC/RPCフレームワークを用いています。
このフレームワークは、Writableを用いてバイナリでやりとりをします。


以下、実際に使ってみたメモです。


まず、プロトコルのインターフェースを定義します。
この時、versionIDも指定します。

public interface ClientProtocol extends org.apache.hadoop.ipc.VersionedProtocol {
	public static final long versionID = 1L;
	Text aaa();
}


次に、サーバー側のコードです。

public class Server implements ClientProtocol {
	public void start() throws IOException {
		Configuration conf = new Configuration();
		org.apache.hadoop.ipc.RPC.Server server = RPC.getServer(this, "localhost", 16000, conf);
		server.start();
	}

	@Override
	public long getProtocolVersion(String protocol, long clientVersion)
			throws IOException {
		return 1L;
	}

	@Override
	public Text aaa() {
		return new Text("aaa");
	}
}


RPC.getServerの第一引数に、プロトコルのインターフェースを実装した
クラスのインスタンスを指定します(上記ではthis)。
getProtocolVersionメソッドでは、プロトコルのインターフェースのversionIDと
同じバージョンを返さないとエラーになります。
バージョン管理のためのものですね。


最後にクライアントのコードです。

// サーバの起動
Server s = new Server();
s.start();

// クライアント
Configuration conf = new Configuration();
InetSocketAddress addr = new InetSocketAddress("localhost", 16000);

ClientProtocol client = (ClientProtocol) RPC.waitForProxy(
		ClientProtocol.class, ClientProtocol.versionID, addr, conf);
		
Text res = client.aaa();
System.out.println(res.toString()); // aaa


RPC.waitForProxyでプロトコルを取得し、
定義したメソッドを実行すると裏側で通信が起こりIPC/RPCが実現されます。


Hadoopではこのフレームワークを用いて、NameNodeやDataNode、JobTracker、TaskTracker、
そしてHDFSクライアント間で連携をしています。
ちなみに、HBaseもこのフレームワークを使っているっぽいです。


Hadoop内の関連プロダクトとしてはAvroがありますね。
http://avro.apache.org/

HDFSのWeb UIの項目の意味

メモ。

項目 意味
Configured Capacity 各DataNodeのdfs.data.dirで指定したディレクトリのパーティションのサイズ(File.getTotalSpace())からdfs.datanode.du.reservedで指定したサイズ(デフォルト0)を引いたものの和。予約領域以外の全領域のサイズ。
DFS Used 各DataNodeのdfs.data.dirで指定したディレクトリの使用サイズ(du -sk)の和。HDFSで使っている領域のサイズ。
Non DFS Used Configured Capacity - DFS Used - DFS Remaining。HDFS以外で使っている領域のサイズ。OSとかアプリケーションとかその他。
DFS Remaining Configured Capacity - DFS Usedか、各DataNodeのdfs.data.dirで指定したディレクトリのパーティションの使用可能サイズ(File.getUsableSpace)の和の、どちらか小さい方。HDFSで使用可能な領域のサイズ。
DFS Used% DFS Used / Configured Capacity * 100。全体からHDFSが使っている領域の割合。
DFS Remaining% DFS Remaining / Configured Capacity * 100。全体からHDFSが使用できる領域の割合。


hadoop dfsadmin -reportも似たような感じ。
基本的に、レプリカも含めてトータルのサイズが出ている。


hadoop fs -lsとかhadoop fs -duとかで出てくるのは、
純粋なファイルサイズ(レプリカも含めてのサイズではない)。

HT-03AにAndroid2.2(Froyo)を入れる

友人からHT-03Aを借りて、Android2.2(Froyo)をいれたのでメモします。

root権限をを取得する

以下のサイトが参考になります。

http://d.hatena.ne.jp/ShingoS63/20100914/1284409135


root権限の取り方は、調べるとたいていGoldCardを作り、
OSのダウングレードをする方法が書かれているのですが、
このサイトに書かれている方法はそれが必要ありません。

リカバリイメージの変更

以下のサイトが参考になります。

http://okanekangaeru.blog129.fc2.com/blog-entry-133.html


ちなみに、SDカードは/sdcardにマウントされてるので、

adb push ファイル /sdcard

という感じでSDカードにファイルをコピーできます。

Android2.2(Froyo)のカスタムROMを入れる

以下のサイトが参考になります。

http://okanekangaeru.blog129.fc2.com/blog-entry-139.html


私は、update-cm-6.0.0-DS-RC3-signedを使いました。


ファイルを探すのに苦労しました。
Googleでファイル名で検索するといいかも。

MySQLによってタフになる会

先日、会社の同期でやっている勉強会のひとつ
MySQLによってタフになる会」の発表をしました。


タイトル通りMySQLの勉強会です。
課題図書は以下です。
会社の先輩方が書いた本です。


MySQLによるタフなサイトの作り方

MySQLによるタフなサイトの作り方


担当は12章 「ボトルネック対策例」でした。
基本的に、グッドノウハウとバットノウハウの繰り返し的な内容でした


発表資料は以下です。




しかし、みんな忙しくて、自分以外に3人しかいませんでした。。

MacFusionがSnow Leopardの64ビットモードで動かない

MacFusionが便利そうなのでインストールして、マウントしようとしたら
「Could not mount filesystem: Remote host has disconnected.」というエラーが。。


そこで、http://certio-lab.sblo.jp/article/36863310.html
に書いてある通り、Macfusion 2.0.4-SL.zipをインストールしたら、
今度は別のエラーが。。


ログを見ると以下のように書いてありました。

Failed to load /Library/Filesystems/fusefs.fs/Support/fusefs.kext - (libkern/kext) link error.


ここに解決策が書いてありました。
http://superuser.com/questions/75332/is-truecrypt-macfuse-supported-on-snow-leopard-with-64-bit-kernel


64ビット版のMacFuseを入れればいけます。


結構はまりました。。


しかし、MacFusionは便利だ。
ほんとにCyberduckいらないっすね。


さらにProxyCommandを使った多段sshを使えば最強。。

NoSQL in Afternoonに参加した

先日、NoSQL in Afternoonに参加してきました。
NoSQLについていろいろ興味があったので参加したのですが、
全体的にプロダクトの概要レベルまででした。
時間も多くなかったので当然ですが。


ATND
http://atnd.org/events/8460

USTREAM
http://www.ustream.tv/recorded/10575011

発表スライド
http://d.hatena.ne.jp/szk-takanori/20101102/p1


内容については、USTREAMや発表スライドを見ていただくとして
以下、私の個人的な所感を書いていきたいと思います。

Hibari/NoSQL for Bigdata

名前は聞いたことありましたが、
中身については殆ど知らなかったので、面白かったです。
Erlang実装の分散型KVSで、ラージバリュー(チャンキング)に対応していているそうです。
Consistent Hashing & Chain Replicationを採用していて、
Strong Consistencyを意識してるということで、
可用性は多少落ちるんだと思います。


YCMBを使ったベンチマークでは、
さすがにWriteはCassandraが早かったが、
ReadはHibariかと思ったらそうでもなかった的な感じで、
よくわからなかったです。


CAP定理のどこを重視してるかという質問で
発表者が詰まっていました。
CAP定理は難しくて、シナリオによっても変わってくるので一概に言えないとのことでした。

Okuyama

全然知りませんでした。
Iwaseさんという日本人がJavaで完全フルスクラッチで書いた分散型KVSだそうです。
永続化の方式はメモリのみとディスクのみ、メモリ+ディスクの3つがあるそうです。
ゲートウェイサーバ経由でアクセスする(ゲートウェイは冗長化が可能)。
keyにタグを付けることができて、タグごとに操作することもできたり、
JavaScriptをkeyと一緒に投げて処理をさせることができるそうで、
ちょっと面白いと思いました。

ただ、結構qpsも出ていて、リニアにスケールするとのことでしたが、
検証が30台までしかしてないということで、
ちょっと信頼性が疑問でした。

Cassandra

Cassandraを知っている人はほぼ全員でしたが、
実際に業務として使っている人は1人くらいでした。
Cassandraの基礎的なことの説明でした。

DC間レプリケーションに対応していて、
実際に3回DCが落ちたところを見たことあるらしいです。

ROMA

楽天の一部(セッションデータ、パーソナルページ履歴)で使われているKVSです。
Ruby実装でConsistent Hash & Chain Replicationを採用しているとのことでした。
また、プラグイン機能もあってDSLなどでも記述できるらしいです。
英語のプレゼンだったのですが、日本人のしゃべる英語はわかりやすかったです。

MongoDB

C++実装のドキュメント指向DBです。
MongoDBの使い方がメインで、
中身についての説明はレプリケーションくらいでした。
セカンダリインデックスを付けることができて、
MapReduceもサポートしてるとのことでした。
今一番使ってみたいDBですね。

Kumofs and The MessagePack

何回か古橋さんの発表を聞いたり、
発表のスライドを見ていたりしていたので
目新しいことはあまりありませんでした。
MessagePackは使ってみたいです。
古橋さんも英語のプレゼンでした。

CouchDB

MongoDBに似ている感じでした。
スキーマフリーでドキュメント指向、RestfulなAPI
MongoDBとの違いはレプリケーションの仕方で、
CouchDBは、HTTPを使って差分のみをレプリケーションするらしいです。
また、BIGCOUCHというCouchDBにScalingをプラスできる
フレームワークがあるらしいです。Amazon Dynamoを参考にしてるとのことでした。
パフォーマンスがどれくらいでるのでしょうか。

Hadoop/HBase

Hadoop、HBaseについての基礎的なことでした。
HBaseはMaster/Slave型アーキテクチャで、
Keyのレンジでパーティショニングを行うそうです。
可用性より一貫性を重視しているそうです。


先日にHBase Trainingも受けましたが、
HBaseを業務として使いたいですね。どこがいいかなぁ。

全体を通して

目指しているものによって、設計が少しずつ違っているという印象でした。
それぞれの特徴を見極めてどれを使うのが最適かを考える必要がありそうです。
ただ、すべて自分で検証するのは辛いので、こういう場合はこれっていう
ベストプラクティスが早く出てきてくれないかなぁっていう感じです。
まあ、自分で作れって話ですよね。。


また、飛び込みでLTをしたMyCassandraも面白かったです。
CassandraのストレージにMySQLを使ってみたという内容でした。
東工大の学生らしいですが、将来が楽しみですね。


あとは、ベンチマークはYCSBがよく使われているみたいですね。
http://wiki.github.com/brianfrankcooper/YCSB/getting-started


最後の方は、正直辛くなってきてましたが、
NoSQLをある意味で俯瞰的に見ることができたのでよかったです。

Cloudera Hadoop Training for Developer & HBase Trainingに参加した

先日、Hadoop Training for DeveloperとHBase Trainingに参加してきました。


Hadoop Training for Developer
http://www.eventbrite.com/event/878322085

HBase Training
http://www.eventbrite.com/event/878364211


Hadoop Training for Developerは10/25〜10/28の3日間で、
HBase Trainingは、10/28の1日でした。

前回は4月にあったのですが、出れなかったので、
今回は会社に頼んで行かせてもらいました。


以下内容になります。

Hadoop Training for Developer

Hadoop Training for Developerは、PFIの太田さんが講師でした。
ClouderaのTodd Lipconさん(HBaseのコミッター)も横にいて、
質問があるときに答えてもらうという感じでした。

レクチャーとエクササイズを交互にやる感じで進んでいきました。

一日目

一日目はHadoopの基礎知識からでした。

HDFSやMapReuduceの概要や仕組みから、その他のエコシステムの概要、
MapReduceのアルゴリズムについてのレクチャーがあり、
エクササイズでは、実際にMapReduceをJavaやHadoop Streamingを
使って書いたりしました。


Hadoop輪読会などで、Hadoopについてはある程度勉強していたので
ここらへんは難なく理解することができました。

二日目

二日目は、HadoopとRDBMSの違いから入り、
その後は、SqoopやHive, Pigの話でした。


Hiveは業務で使っていることもあり、
結構知ってることが多かったんですが、
Sqoop, Pigについてはいろいろ勉強になりました。
Sqoop, Pigは今後業務でも導入していこうと思いました。

三日目

三日目は、MapReudeのデバッグの話や、
もっと高度に使うためにどうカスタマイズしたらいいかという話があり、
パフォーマンスチューニングの話も少しやって、
最後にグラフアルゴリズムの話でした。


まあ、ある程度知識があったのでついていけましたが、
結構ハイペースで進んでいった気がします。


最後にテストがあったのですが、なんとか合格!
何点かはわかりませんでしたが、
後でなんか賞状的なもの?がもらえるらしいです。


今、ちょうどログ収集のソリューションを探していて
ScribeとFlumeの状況を太田さんとToddさんに質問したのですが、
Flumeの方がいいらしいということでした。
まあ、Clouderaの人に聞いたらそう答えますよね。。

懇親会

太田さんが来れなかったのは残念でしたが、
いろいろな話を聞くことができて楽しかったです!

HBase Training

HBase Trainingは、HBaseのコミッターであるTodd Lipconさんが講師でした。
講義は全部英語でしたが、日本語の資料があったので、
英語ができない私でも、なんとか理解することができました。
こちらも、レクチャーとエクササイズを交互にやる感じでした。


HBaseを使ったことがなかったのですが、
概要から仕組みまで丁寧に説明してもらい、
エクササイズで実際にHBaseを触ることができたので、
大体どんなものなのかはわかりました。

また、チューニングポイントなども教えていただいたので、
今度クラスタを構築して検証してみたいと思います。

おまけ

お昼はすべて人形町今半のお弁当でした。
美味しかったです!


f:id:brfrn169:20101028120244j:image