ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

HBase勉強会(第三回)のメモ

2011-08-24 23:26:37 | PG(NoSQL)

HBase勉強会(第三回)に参加させていただきましたので、そのメモです。
Togetter: Hbase勉強会(第三回) #hbaseworkshop
今回のテーマはOS・ハードウェア・ネットワーク。自分の苦手分野ばっかりですな(得意分野を聞かれても答えに窮するが)(爆)

最初に軽く@tatsuya6502さんからHBase本が公開レビュー中という話とHBaseブックの日本語訳が2011/5/2にあしたのオープンソース研究所で公開されたというお話。


まずはClouderaの@shiumachiさんからHBase向けハードウェアのポイントについて。

どこがボトルネックになるか?という点について、HadoopがI/Oインテンシブ(ディスク・ネットワークが重要)で、HDFS上で動くHBaseも当然それが重要だが、CPUインテンシブでもあるからCPUも重要とのこと。(全部じゃんw)

メモリーを大量に使うからOSは64bitが当然とか、ネットワークも高性能なものが必要(ラック間でも10Gbit)とか。
HBase Master(HDFSのNameNodeと共有)用にQuadCore(コモディティ=手に入りやすいという意味では、今なら6コアもあり?)で24GBが目安とか。
マスターなのでRAID10またはRAID01にする。
ディスクは4TBもあれば充分。
データノードはRAID不要。8コアとかで1つずつのコアにディスクが割り当てられるようにする。安いからSATAでよい。
メモリーはあるに越したことは無いということで、16~24GB。
RegionServerはメモリーが最低でも24GBは欲しい(!) 32GBとか。
ヒープは最低でも4GB割り当てる。ただし現時点では16GB以上割り当てたら駄目。HBaseのGCが動いて止まるから。これはJavaVMのGCではなく、memchachedと同様にHBase内のアロケータがあるという話らしい。

HBaseを使うには高性能なマシンが必要とはよく聞くけれど、さすがClouderaさんが相手にしている世界はすごいな^^;


次いで@kzk_moverさん。

「HBase+運用」でGoogle検索するとトップに出てくる(笑)分散データベース「HBase」の安定運用を目指しての説明。

これまたかなり色々多岐にわたってOSやHadoop・ZooKeeper・HBaseの設定が書いてあり、素晴らしい。
そりゃOSも色々設定ポイントがあるよなぁ。いつもデフォルト状態で使うようにしてるからあまり気にしたこと無いけど^^;

途中で紹介されていたTsuna's blogは、e1000eというNIC(ネットワークドライバー)を使うようにしたらパケットのドロップ率が激減したという話。

あと、FacebookのHadoopクラスターの設定ファイルの内容が公開されているらしい。
Facebook has the world's largest Hadoop cluster!というページの「Facebook's Hadoop warehouse configurations」をクリックするとconf.tar.gzというアーカイブがダウンロードできる。
これも色々カスタマイズしていて参考になるそうです。


そして@ueshinさんから、Chef(シェフ)という構成管理ツールについて。
ueshinさんの自宅HBaseクラスターの管理をChefで行っていて、そのレシピ(Chef cookbooks)を公開しているという話。“レシピ”というのはChefの用語で、要するに設定内容のことらしい。
(これはRubyが使われているっぽい)

Chef Serverに対象ノード毎にレシピ(設定)を登録しておき、そのノードからChefのクライアントコマンドを実行すると、サーバーから設定を取り込んできて更新されるようだ。
最初に“ロール”としてHadoop用設定とかHBase用設定とかを登録しておき、どのノードがどのロールをインストールするかも設定しておく。この辺りはGUIでドラッグ&ドロップで指定できるのだそうだ。
ueshinさんは手動でクライアントコマンドを実行しているそうだが、デーモンで定期的に更新させることも出来るっぽい。

ちなみにこのHBaseクラスターもけっこうな量になっていて、全件カウントを実行したら3~4時間かかったらしい(笑)


休憩をはさんで、再び@tatsuya6502さん。

2011/7/1に行われたHbase at FaceBookプレゼン資料から、p.39「典型的なセル構成」の話。
確かこれはUstで見たけど、英語が分からないからさっぱりだったんだよな…(爆)
今回tatsuyaさんの説明を聞いてようやく理解できた。ラック1つにつきZooKeeperを1つずつ入れて、それぞれNameNodeとかHBaseMasterとかJobTrackerとか異なる機能を同居させている。
で、ラック内の残りの19台がデータノード。ノード1台につき2Uでディスク12個だとか?
あと、リージョン分割が起きるとその間機能が停止するので、最初から分割しておくとかしているらしい。

それと、Puma(プーマ)について。
p.41「Puma以前」(つまり現在?)では、Hadoop(Hive)を使ってレポートへの反映に15分~24時間かかっていたものが、p.42「Puma」を使うことで10~30秒で処理できるようになった。
でもPumaって何するもの?という辺り、参加者の人達も記憶が断片化しているようで^^;
Ptailがストリーミング的にデータを取得してMapみたいな処理を行い、HBaseのカウンターを更新(Reduce的な処理)することで、擬似的に(リアルタイムな)MapReduceを実現したということらしい。
で、結局Pumaって何よ?ということだが、みんな忘れててよく分からない(爆)→結論:早くソース公開しろよ→7月公開予定という話もあったそうだが(爆)
PumaQL(PQL)という言語を使うが、現在オープンソース用に書き直し中らしい。(HiveHiveQLみたいなネーミング。まぁどちらもFacebookかw)

もうひとつ別の話題として、@hisayoshさんの単一行のread&write連続試行の図を見ながら、HBaseの特性について。
読み込み性能を犠牲にして、書き込み性能を上げている(書き込みのスループットは一定だが読み込みにはムラがある)という話。
読み込み・書き込みを繰り返すと、読み込み性能がだんだん悪くなってきて、メジャーコンパクションが実行されると性能が回復する。

HBaseが書き込み性能を上げる為の2つのポイントがあって、
1.ディスクがランダムアクセスすると遅くなるので、ヘッドが固定できるようシーケンシャルな書き込みを行う。HBaseのPutのタイミングに関わらず、非同期に実施する。
2.HBase本の第8章に書かれている内容。RDBは一般的にB+Treeインデックスを使う。これは書き込み時に更新する。アクセス時間が一定となるようにバランスするので(メモリー上にデータが入り切れば)高速だが、メモリーに乗らなくなるとパフォーマンスが落ちる。
一方、HBaseはLSMツリー(Log Structured Merge)という仕組みを使っている。これは更新を受けた順に書き込んでゆき、後でソートする。MemStore内ではキー順でデータが並んでいるが、複数のStoreが順不同で書き込まれる為、読み込み時にそれらのStoreを全部見る必要があるので遅くなるという理屈。メジャーコンパクションが実行されるとStore内のデータも含めてキー順にマージされるので、読み込み性能が回復する。

LSMツリーって初めて聞いたけど、納得!
ログ(更新データ)をどんどん追加していって後からマージするというニュアンスだろうか。
キー順にデータが並んでると思ってたけどそうでもないと言われてちょっと疑問だったんだけど、こういう理由だったのか。


あと諸々の話題。
Avroってどうなの?→Hadoopエコシステムの一部として進められるはず。単なるシリアライズを超える。
Hortonworksの修正をClouderaは取り込むか?→Hadoop本体に含まれれば当然取り入れるはず。

最後に発表者の人達から宣伝(笑) 9月にもHadoop・HBase関連の集まりが色々。

『Hadoopカンファレンス・秋』が2011/9/26にある。1000人入れるってw
Cloudera vs MapR vs Hortonworksとか、熱いぜ!(笑)

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

第1回分散処理ワークショップの感想

2011-07-10 11:05:21 | PG(NoSQL)

「第1回分散処理ワークショップ in Tokyo」に参加できましたので、その感想など。
(長らく補欠3番目だったので今回は無理かなーと思ってたんだけど、ぎりぎりでキャンセルが出たので入れた)

Togetter: 「第1回分散処理ワークショップ in Tokyo」 #dist_study
資料の場所はokuyamaooさんの「第1回分散処理ワークショップ in Tokyo」を開催しましたに全部出ています。

各DBMS(分散KVS)の紹介を1つ当たり15分。の予定が、Q&Aが入ったりして盛り上がり、けっこう伸び伸びに(笑)

全般的な感想としては、やはりDBMS(分散KVS)を実際に作っている人はすごい(笑)
方式を考えて実装してみて試行錯誤しているだろうから、他のDBMSについても質問内容がけっこう深くなる。
自分はHBaseCassandraVoldemortはちょっと触ったけど他は名前くらいしか知らなくて「ドキュメントベースってなんじゃろ?」くらいのレベルなので、あんな質問は思い付きもしないなぁ(苦笑)

しかしドキュメントベースでも結局keyとvalueでデータ(valueは自由)を格納しているので、ColumnFamilyタイプのDBMSがkeyの種類を拡張しているのと似たようなものなんだろうと思った。
そして、どうやってデータを格納していて、どのように分散させたり整合性を担保したりするかといった実装方法や考え方の違いが色々あるので、DBMSが色々あるんだな、と。(…書いてて思ったけど、なんて当たり前な(爆))
そこから逆に、実装方法に応じてデータの持ち方にも特徴(制限)が出てきて、分類名(ドキュメントベースとかカラム指向とか)が名付けられているんだろうなぁ。つまりDBMSの特徴が詳しく分からないと、なんでそういう分類になっているのかはきっと理解できないんだろうなー。

あと、MapReduce対応(Hadoopやそれ以外)も意外と意識されてるようだ。

あとあと、どれも対応OSはほとんどUNIX系ばっかり。Windowsマシンしか持っていないのでは何も試せなくなってきている(汗)
いいかげん、新しいマシンを買うか。VMwareでLinuxが使えるスペックのやつ(爆)

以下、個別のDBMSの話のメモ・感想。基本的にはスライドを見れば分かるので、その補足的な。


okuyamaooさんのokuyama

okuyamaは、データの持ち方はシンプルな分散KVSかな?

Tagは、データの種類に応じたタグ(ラベル)付けをして、データをグルーピングするものっぽい。そして、検索に使える感じ。

SerializeMapに関して面白い事を言っていたな。Javaのデータをバイナリーのまま保持し、インスタンス化しないんだって。必要に応じてインスタンス化(デシリアライズ)するってことかな?

あと、JavaScriptをDataNodeで実行できるとのこと。(エージェント指向みたいなもの?
Hadoopでもプログラムの方をデータのある場所に転送して実行するという考え方だし。
しかもJavaScriptだとコンパイルしないから、テキストで書いてそのまま転送できるから便利、とかあるんだろうか)

パーティション機能は、RDBMSがDB(ユーザー)毎に使用領域を制限して互いにアクセスできないようにするようなものか。アプリケーション毎にパーティションを分けるイメージだそうだ。
(テスト環境で1つのクラスターを開発者が共有して別々に使う場合にも、こういう機能は欲しいよね)

あとは、Valueに対する検索機能あり、と。(Tagでグループ化しておくとかインデックスを使れるとか)


doryokujinさんのMongoDB

MongoDBの構成はMySQLに似ているのだそうだ。
database-collection-document-field(key-value)
collectionがRDBMSのテーブルに相当する感じか。
valueはJSON形式で、どの項目(型)に対しても検索・更新がかけられる。
paddingであらかじめ予備領域を確保しておくこともでき、後からその領域にデータを追加することで、データ追加しても物理的な再配置をしなくて済むらしい。

CAP定理のC(一貫性)重視。

Replica Set: データの複製を作っておくが、writeは必ずprimaryのみ。→一貫性を保つ為
readはオプションでsecondaryからも可能(読んだデータが古いこともあるかもしれないが、スケールする)

自動フェールオーバー: primaryが死んだら、secondaryの中からどれか1つがprimaryになる。このとき、他のsecondaryに有って新primaryに無いデータは、削除される。→一貫性が保たれる
分断されて過半数になれない方はprimaryが作られない。→一貫性が保たれる

Sharding: GFSをモデルにしている。document内のkey(複数可)をShard keyにすることができ、それを元に分割する。
Shardingを構成するサーバーはmongos・config・dataとあり、configがShardに関する情報を持っていて、mongosは情報を持たずにルーティングするのみ。クライアントはmongosにアクセスする。mongosはconfigサーバーから情報を取得する。それぞれ冗長化が可能なので、SPoFが存在しない。(今までの経験では、configサーバーに負荷がかかったことは無いそう)

(Hadoopでなく独自の)MapReduceを実行可能。
JavaScriptベースで、1コア/Shard、Mapper数の上限はShard数などの制約あり。Shuffle機能は無く、どれか1つのShardでReduceを行う。

Mongo-Hadoopというプラグインがあり、Chunk単位でMapperが立ち上げられる。
Pig対応も進んでいる(が、Hiveの話は出ていないらしい)。
FlumeのsinkにMongoDBを指定することも可能。


tatsuya6502さんのHibari

Hibariは、ジェミナイ・モバイル・テクノロジーズ(GEMINI)のOSS。2006年から開発している。
(なんで日本じゃないのに雲雀(ひばり)なんだろうな(笑)→ジェミナイ東京で開発していて、OSS化した時にこの名前になったようです

ウェブメールに使われているだけあって、強い一貫性・耐久性があり、readに強い。
耐久性:最初にWALに書き、fsyncしてからクライアントに成功を通知する(データがメールだと、ロストは許容できない)
一貫性:古いデータが見えない(メールだと、書いたものが見えないと困る)
ロック:タイムスタンプを用いたCAS(楽観的ロック)
マイクロ・トランザクション:制約はあるものの、複数のキー/バリューにまたがるトランザクション可

データモデルは、RDBMSのテーブルに近いものが「チェイン」(→厳密には違う模様。コメント欄参照)。その中にキー・バリューを持つ。
キーは辞書順でソートされる。
バリューはあまり大きなものは持たせられない。数kB~16MBくらい。
他にタイムスタンプ・有効期限・フラグを持つ。フラグはokuyamaのTagのようなものらしい。検索条件(フィルター)に使える。
バリュー以外はRAM常駐。

データはコンシステント・ハッシングによる分散。キー全体でなく、キーの先頭部分だけでハッシュ値を算出できるのが特徴的。
例えばキーの先頭をユーザーIDにしておけば、同じユーザーは同じチェインに入ることになる。

データの一貫性保証(複製の作成?)はチェイン・レプリケーションで行う。
同じデータを3つのサーバーに複製するとき、Head・Middle・Tailという順番を付ける。
書き込みは必ずHeadから行い、Tailまで伝播したら成功とする。
読み込みは常にTailから行う。その為、読み込みが多い使い方だとTailに負荷が集中する。
そこで、サーバーへの負荷を分散するという観点から、異なるチェインのTailは別サーバーに置く。(1つのデータに対する読み込みが集中しても分散できないが、複数データなら負荷分散できるということだろう)
1つのサーバーがダウンしたら、各チェインではHead・Middle・Tailのいずれかが消失することになる。Headが無くなると書き込めなくなるし、Tailが無くなると読み込みも書き込みも出来なくなる(書き込みはTailまで成功しないとダメだから)。そこで、「生き残ったMiddle」がHeadやTailに変わることで、チェインが稼動するようにする。

チェイン・マイグレーション: チェイン追加時は、各チェインの一部ずつ(最小限のデータ)が新チェインへ割り振られる。

HibariはErlang(アーラン。並行処理に優れている言語)で書かれており、GCがJavaより優秀なんだそうだ。(JavaのGCはたまに止まっているように見えることがあり、死活監視に引っかかって障害になる?)


yukimさんのCassandra

最近のCassandraの動向を追っていなかったので、その話が出たのがありがたい^^
0.7で動的なスキーマ変更とセカンダリーインデックスが使えるようになった。
0.8でカウンター(分散環境での値のインクリメント・デクリメント)が使えるようになり、CQLも入った。
0.9をとばして1.0が10月に出る予定。

CQLはCassandraで使えるSQLっぽいもの。
CREATE TABLEならぬCREATE KEYSPACEとか、SELECT文とか。(さすがにbegin transactionやcommitは無いだろうがw)
CQLの利点は、Cassandraで使われているThrift APIの変更をあまり受けなくなること。もしかするとJDBCからも使えるようになるかもしれない?

CassandraはHadoop MapReduceやAWSもサポートしている。

また、DataStaxのBriskでは、HDFSの代わりにCassandraでデータを保存するなんて事をやっている。Hiveにも対応しているらしい。

Cassandraは(一貫性レベルにロケーションを意識した分散(データの複製の配置)があるので)、バッチ用とオンライン用の複製を作るのが簡単に出来るかもしれない。
HBaseクラスター(オンライン)上でMapReduce(バッチ)を実行すると負荷が高いから別クラスターにすべきかもという話があり、その場合はデータコピーをどうするのかが問題になるけれども、Cassandraなら分散配置までやってくれるので楽かも)


ueshinさんのHBase

ueshinさんの自宅HBaseクラスターの写真は、いつも受けが良い(笑)
Twitterのストリーミングをやっていて、LZOで圧縮していても500リージョン、1台当たり100リージョンまで達したそうだ。

HBaseの特徴は、
高い書き込みスループット(WALはシーケンシャルに書き込み、実データはメモリー上で更新。定期的にフラッシュ)
サーバーを追加すれば自動的にリージョンを再配分(動的なシャーディング)
実データはHDFS上に保存されるので、HDFSの機能で複製、チェックサムで自動修復、MapReduceも出来る。
強い一貫性: ROWに対する操作はアトミック、CAS操作可

リージョンがROWでソートされていてROWの範囲で分かれている事の説明が漏れてしまった為^^;、キー指定でアクセスするときに全件スキャンするのかという質問が。tatsuyaさんから、どのリージョンに存在するのかはテーブルに持っているのですぐ分かるが、その中はスキャンすることになるとの説明。(実際はJavaで言うTreeMapのようなもの(キーでソートされている)なので、二分探索か何かで単なるスキャンよりは速いんじゃないかと思う)

それから、HMasterが死んだらどうなるかという質問。HDFSのNameNodeはSPoFだけど、HMasterは複数立てられるから大丈夫らしい。
yutuki_rさんから「NameNodeが死んでもすぐにはクラスターは停止しない」との補足があったが、これはHMasterの誤りだったらしい。HBaseではデータやWALもHDFSに書き込むので、HDFS内のどの場所に書けばいいかはNameNodeに問い合わせないと分からないから、NameNodeが死ぬと何も出来ないだろうとのこと。

データノード(リージョンサーバー)を追加した場合、5分おきにバランサーが動いているので、新しく追加されたリージョンサーバーにリージョンが移動する(リージョン数で判断)。
なお、リージョンの移動にはデータの移動は伴わない。

(それにしても、HBaseのリージョンとHDFS(物理配置)の関係はいつも混乱の元(苦笑)
自分もいまだに分かってないんだけど(汗)、あるデータzをリージョンZが持っているとき、リージョンサーバーAがZを管理していても、それはAのメモリー内(とローカルディスク?)にzがあり、HDFSではデータノードB・C・D(つまりA以外)がzを保持している可能性もある、という理解でいいのだろうか?
ん? リージョン移動にデータ移動が伴わないということは、Aはz自体も保持していない?
それから、Zを持つリージョンサーバーは1台のみ? それが壊れたら、HMasterが別リージョンサーバーにZを割り当てるのかな? データ自体はHDFSで分散しているから復元できるはずだし。
あと、MapReduceするときはA経由でなくB・C・Dのいずれかで実行されるんだよな?
むー、まだまだ知識不足だ…つーか、単独環境ではこういうのは実験できないしなぁ
この辺り、やはり色々と違っているようです。コメント欄参照


frsyukiさんのMessagePackとFluentとKumofs

■Kumofs
エトラボのバックエンドで使われている。

サーバー構成
Gateway: クライアントはここにアクセスする。
Manager:
Server: データを持つ。実体はTokyo Cabinet?

Managerも2台構成なので、SPoFなし。
Gatewayは1アプリにつき1台という感じ。Gatewayとアプリは一蓮托生という思想らしい(笑)

コンシステントハッシング
高い一貫性を持つ(eventual consistencyではない) CASもサポート
リバランス中でも読み書き可能
split brainしない(ネットワーク分断しても生き残らせない。一貫性重視で、一貫性をゆるくするくらいなら失敗させるという考え)

■MessagePack
JSONよりデータサイズが小さい、速い
Kumofs間でMessagePackを使っていたが、そこからスピンアウト(←言葉は違った気がする^^;)

MessagePack+Hadoop
Columnar Fileでデータサイズが減らせる。
キー+データを複数持つのではなく、キー毎にデータを複数持つという持ち方。データがさらにネストして構造を持っている場合の効率化はまだ。Googleの論文(Dremel?)では出ているらしい。

■ログ収集ツール Fluent(フルーエント)
Facebookのscribeと似ている。

Fluentでログを受け付け(キューイングして)、HDFSに書き込む。その後、マージジョブでColumar Fileに変換するとか。
HDFSが落ちてもFluentがデータを保持しているので再送できる。
ログ→Fluent→HDFS

Fluentで受けたデータをさらに次のFluentで受け付けるモデル(ログ転送・カスケード)も考えている。
ログ→Fluent→Fluent→ストレージ

okachimachiorzさんから、障害時に関するツッコミあり。
壊れたときに別のFluentへ受け渡すような仕組みにすると、ログが重複する可能性があり、そうなるよりはHAで冗長化した方がいいのかも?


いやはや、色んな視点があるもので、勉強になります。
ありがとうございました。

コメント (4)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

HBase勉強会(第二回)の感想

2011-06-17 04:29:27 | PG(NoSQL)

第2回HBase勉強会に参加しましたので、例によって感想など書いてみます。
Togetter - 第2回HBase勉強会 #hbaseworkshop

ちなみに第1回は不参加…実務でHBase使ってるわけじゃないので資格外かなーと思ったのと、18:30からだと微妙に間に合わない。今回は19:00からだった(ことにぎりぎり気付いた)のでラッキー♪
しかし京浜東北線が人身事故で山手線まで止まってて間に合わないかと思った^^; 品川駅なんかすごい混雑で、ホームから人が落ちて新たな事故にならないのが不思議なくらい(汗) 電車内が混んでるのは何度も経験してるけど、駅で人混みに押されるなんて初めて(苦笑)


今回はtatsuya6502さんが体調不良でお休みということで、残念。お大事に。

代わりにueshinさんの発表からスタート。→資料
いきなり自宅サーバーはインパクトあるなぁ(笑) しかしスペックとか構成とか、こういう実例は嬉しい。
特にZooKeeperをDataNode等とは別にした方が良いとか。同居させると負荷が高いとき(MapReduce実行時とか^^;)に反応が遅くなって落ちちゃうらしい。ZooKeeper1台構成もすぐ落ちちゃうし2台は元々非推奨なので、3台で。
3台構成なら、1台が落ちて2台になっても稼動する。
ZooKeeperがROOTテーブルの位置を保持しているので、ZooKeeperが機能しなくなったらZooKeeperへアクセスしようとリトライし続けるのではないかとのこと。

HBaseの仕組みは、物理的にはカラムファミリー毎に保存される。
リージョンはROWキー(の範囲)によって分割される。一定サイズ(デフォルトは128MB)を超えると自動的に分割される。リージョン分割中はそのリージョンへのアクセスは一時停止となる。
ここで、カラムファミリー内にデータをいっぱい入れたり、カラムファミリーそのものがいっぱい作られたらどうなるの?という質問が。たぶんコンパクションが無限に起きてしまうんじゃないかとのこと。要するにカラムファミリーはたくさん作るものじゃない、と。まぁカラムファミリーを追加するにはテーブルを使用不可にしないといけないしねぇ。
(ちなみに以前上限を聞いたと思ったが、行数10億とカラム数100万で、カラムファミリーは載ってなかった^^;)

あと、ACID特性に関連して、ROW内はatomicだが、複数ROWにまたがるatomicは無理。複数をやりたかったら、分散トランザクションを作るか、ZooKeeperでロックするか。いずれにしてもあまりやらない方が良さげ^^;


続いてokachimachiorzさんから、アーキテクチャ要件について。

MapReduce実行時とかコンパクション(リバランス)時とか、HBaseはまだ不安定に感じる、HBaseはある程度の規模を想定しているのだろうとのこと。
(そういえばHBaseとCassandraの討論会でもHBaseは5台以上欲しいという話だった)

そして、HDFSとHBaseのデータロケーションを分けるべきかもしれないという衝撃発言!
HDFSと分けるというのは、別クラスターを作る(MapReduce実行用のクラスターとHBase用クラスターを分ける)という意味だろうか。
HBaseに書き込んで出来たファイルに対して直接MapReduce出来るのが他のKVSとは違う利点だと思うので、別クラスターにデータコピーしてMapReduceするとしたら、あまり意味が無いような^^;
(実験環境はどうしても低スペック(サーバー数も少ない)になるだろうから、そこで「使えない」と誤解されてしまったら寂しいっすねぇ)

それはそれとして、okachimachiさんが考える適用業務について。
(このうちの一分野も分からないとなると、SIerとしては失格だよなぁ>< 自分は全然ダメだ)

●マスター管理
マスターの同期処理が必要。やはりフロントはRDBということで、RDBMS→HBase→HDFS

●受発注
伝票検索:特定キーと日付による検索。一括検索はHDFSでよいが、微妙なサイズ・タイミング(障害が起きた場合に一部だけ実行したい(サブバッチ)とか)はHBase。

●在庫管理
教科書はACIDで書かれているが、普通はACIDではない。フラグを立てて非同期で実行する。
指定された在庫だけ処理したい→HBase(HBaseをフロントに置く前提)
読み込みはしたい→更新時にロックしたい(更新は3時間毎で参照はリアルタイムとか)
→でもフラグを立てるだけならロック不要、すなわちHBaseでなくてもよいのでは?というツッコミが^^;
基幹バッチ処理としては一部を別の場所にコピーしてそれを処理するというのは王道だが、HBaseとHadoopのロケーションを分けてコピーすると負荷がかかるし…という感じらしい。

●原価計算
確定処理とシミュレーション(同期は不要)→結果を保存して参照するのにHBase

●物流管理
リレーショナルデータ(在庫マスターや顧客マスター)との結合あり。
Planing(計画)系とExcecution(実行)系
マテハン(マテリアルハンドリング・組込み系)への受け渡しあり。

●製造管理
計画のプランニングはHadoopで実施できる。分散MRPとしてHBaseでやれたらすごいらしい。

●生産管理
歴史的推移:昔は実行系のみ→実行系と計画系(SCM)→結合していく→ERP(ロックイン、メンテ不能)
・スケールアウトしない
・非同期処理の高速化→HBaseが使えそう。
・素結合による簡素化→レイテンシーは上がる。(人は、3秒かかると死んだと判断する)

●原子力発電管理(ネタ)
シミュレーション、センサーデータ収集分析、リアルタイム、組み込みの直接制御
リアルタイムというのは、例えば薬品を一定量入れたいとき、センサーで監視しつつ、予定の場所まで来たらすぐ止める必要がある。ミリ秒以下。
→メジャーコンパクションが起きたらアウト! したがって、HBaseでは原発管理できないw(原発を想定したNoSQLがあったら面白い…って^^;)

●販売管理
集配信→HBase(分散書込)→HDFS→HBase(分散書出)→RDB
想定件数は、多いときで1億件。HDFSでの非同期処理は15分間隔。
集信でバッファリングが要るかもしれない。
ツッコミ1:書き出しのHBaseは不要で、直接RDBへ入れれば?
ツッコミ2:データ追記型なら、書き込みのHBaseは不要で、ファイル(HDFS)でよいのでは?(ログ収集ならファイルを直接HDFSに入れる。それと同じイメージでいけるのでは?)
書き出しに関しては、同じROW(の別カラムファミリー)にデータを追加する形なら、HBaseが有効かもという考察。
HBaseは分断すると落ちる(第10回Cassandra勉強会参照)ので、Cassandraの方がいいかも。ただしデータの整合性は弱い?

※下手に継続するよりも、落ちるなら落ちた方が良い
※システムが落ちたらまず言う事は、「まず落ち着け」「落ち着いて説明しろ」w


続いてashigeruさんから、(今度は業務ではなく仕組み寄りで)HBaseの用途について。

HBaseの特徴は、
・細かいデータの多数書き込みに強い
・キー順にソート済(「隣のレコード」という概念が存在する)
・バーストリードは一応早い
・テーブルとROWが同じなら、リージョンも同じ
・カラムファミリーの追加は停止しないと出来ない
・暇なときにリバランス(リージョン分割)する⇔忙しいときはリージョン分割しない

したがって
・OLTP+インクリメンタル
・オンライン性能をあまり劣化させずにバックグラウンド処理
・バックグラウンド処理同士の干渉が少ない
・分散memtableは、バッチ処理ではあまり恩恵を得られない

これを元に、やりたい事は「締め処理を速くしたい」
締め処理の特徴
・BigDataまではいかない
・小さなマスターが多い
・大きなマスターもある
・トランザクションとの全件結合なんてことも(汗)

小さなマスターだと、そこにアクセスすると負荷が集中する可能性がある。
(そもそもHadoopではSequenceFileとかにして配布する機能があったと思うけど、大きさ次第なのかな?)

MapReduceのReduceサイドJOINだと、マスターが大きい場合は、一部しか使われないと無駄(同期はされる(ReduceタスクはMapタスクが終わるのを待つ)ので、遅くなる)。
↓逆の発想
マスターをHBaseで分散しておいて、(キーで分散しているから)その場所にトランザクションデータを配置して処理

ただし、出力先も同じリージョンになるとは限らない(キーが異なるから)

ハッシュをROWキーにして、同じ場所を強制する?(←さすがに無理があると思う(苦笑))


最後に、frsyukiさん。

ログ収集ツール(まだ未公開)の紹介。(Facebookのscribeを参考にしたそう)
先ほどの販売管理の集配信に似た仕組みということかな?

ログ→fluent→HDFS
fluent(フルーエント)でバッファリングおよびスプリット(MessagePack File)し、定期的にHDFSに保存。たまにマージジョブを実行する。
バッファリングの際にコンバイナーのような演算も出来る。
キューのような使い方も出来るが、入力は1件ずつだけど出力はチャンク単位という制限がある。

もうひとつ、MessagePack+Hadoop。
MessagePackのIDLで構造を定義し、MapReduceやHiveで指定できる。
MessagePackInputFormat・MessagePackWritableにはちょっと燃えた(笑) いいなぁ、これ!

それと、Columnar File。カラム指向ファイルということかな。
[id:1, a:11, b:202][id:2, a:13, b:204]というデータがあったら、id:[1,2],a[11,13],b[202,204]という形で保存することによって、キー名を毎回書かなくても済む分、データ量が減らせる。
また、特定キーのデータをスキップすることも簡単になる。
さすがMessagePackを作っているだけあって、そういう部分は詳しそう。

最後に非構造化データに関する質問があって、クレンジングについて話題が。クレンジングには2種類あって、
・データフォーマットが壊れている→実際には少ない。バリデーションで弾く
・セマンティクス(意味)がおかしい→必要がデータが入っていないとか値が変とか
現実には前者は少なく、後者の方が多いとのこと。


ふう、今回も盛りだくさんでした。

HBaseでどうテーブル(カラム)を持たせればいいかというのは思考実験で考えていたつもりだけど、実際の特性は知らないので、やっぱりそういう所も気にしないと駄目ですね。

ありがとうございました。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

第1回HBaseとCassandraの討論会のメモ

2010-11-06 15:15:50 | PG(NoSQL)

HBaseとCassandraの討論会 第1回(Togetter:第1回HBaseとCassandra討論会)に参加したので、そのメモです。
…例によって、聞き逃し・理解不足・誤解誤認はあるとは思いますが(汗)


最初にkimteaさんの2010-02-15の分散データベースのページを見ながら話を聞く。
第1世代…Google BigTable
第2世代…Amazon Dynamo
第3世代…Microsoft SQL Azure(→リレーショナルモデルに変更された。中で使われているAzure TableはKVS)
第4世代…Cassandra

KVSはオブジェクト指向で、業務システムを作るのが難しい。(◆●オブジェクト指向という理由で難しいの?)
GAE/JSlim3はその難しい部分を隠蔽してくれる。(JDOは失敗した(広まらなかった)が、GoogleはJDOを推している。JPAは遅い)

Cassandraの特徴
・O(1) DHT…分散ハッシュテーブル
・Eventual Consistency…BASEに基づく結果整合性
・Consistencyが調整可能
・分散DBでは削除の仕組みが難しい→0.7β2からVersioned Clockが実装される(Vector Clockはつまずいた)(◆●そういえばそんなツイートを見た覚えが)


で、ここから四方山話討論へ。
実際にCassandra・HBaseを使っている人達の苦労話や解決策の会話は非常に興味深い。

・Cassandraのロードバランスは、コマンドを実行すると重くなり、リングから外れてしまう→コマンドは休日に実行すべしw
・大量にデータを入れるとリング内で連鎖してCPUが100%になってしまう→Memスレショルド(◆●RowWarningThresholdInMBのこと?)を1MBにすると軽減される(◆●ちょっと裏技っぽい?)
・Cassandra0.6.6から起動が軽くなった
・Cassandraはローリングアップデートが可能

・HBaseでデータが破損すると復旧は大変(HDFSが落ちてコミットログがおかしくなるようなケース)
・Lunixのfd(ファイルディスクリプター)を増やしておく
・5台以上ほしい→スモールスタートがやりにくい

・Cassandraはキー毎にデータが分散しているから、範囲検索はスケーリングしない
・HBaseは逆の発想で、キーはかたまっているからショートレンジスキャンが得意
HBaseCassandraはキーが偏ると一部のノードだけに負荷がかかる
・HBaseはROW単位でデータを管理しているが、実際はHDFSのリージョンサーバーがデータを持つ。(1~2日くらい経つと)メジャーコンパクションにより配置が最適化されて速度が上がる
・データの移動中は数秒くらいアクセスできなくなる。こういうところが「可用性を犠牲にして一貫性を保つ」部分

・MongoDBはよく固まる。ファイルサイズが倍々になるので、コピーに時間がかかる為
・HBaseもディスクを大量に使う

・Cassandraでデータ(ファイル?)を別マシンに持っていくとキーが見えなくなる(データを読めない)→「このトークンはこのリング」「Ring上で、このTokenはこのノード」という情報をホスト名で管理している為→hostsファイルでホスト名を持てばIPアドレスを変更しても大丈夫
・データの位置情報は、Cassandraはハッシュ関数、HBaseは.META.テーブルで管理している

・CassandraでCQLというSQLっぽいものが開発されているらしい
Clustrix(クラストリックス)…バックグラウンドがKVSで、SQLが使えるらしい(有償)
・VoltDBもSQLが使えると言っているが、色々制限がある

・Cassandraは構築は楽だが、故障時故障後の復旧作業が面倒(復旧方法が色々あるし、リバランスに時間がかかる)
・HBaseはデータは他のリージョンにあるので故障時のデータコピーはマスターによってすぐ行われるHDFS上にリージョン等の実ファイルを保存しており、故障時は“各スレーブノードが担当するリージョンの再割り当て”がマスターノードによってすぐ行われる(HBaseは構築は手間だが、故障時は楽)
(Oracleなら故障したらOracleの人が謝ってくれるが、CassandraやHBaseは自分達が謝るしかない^^;)
(◆●話を聞いていると、思っていたより故障が多い印象。ノード数が少ない為か?Google並にノード数が多ければ故障してもただ放っておけばいいのかもしれないが^^;)
・Cassandraでノードを追加すると、今までは「リングの最後尾に追加されていた」が、「データ量が多いところを分割する」ように変更される(ロードバランスをしなくても済むようになる)
・Cassandraのデータコピーは遅い:ストリーミングが帯域を喰う/HintedHandOffがヒープを喰う→GCが発生してOutOfMemoryになり、ノードが応答しなくて切り離され、別のマシンへデータコピーしようとする→という連鎖が発生して全体が固まる(ノード数が3台とか5台で発生する。ノードが多いと大丈夫かも?)
・Amazon EC2 スモールインスタンスだとメモリーが1.7GBしか無い。専用サーバーの推奨スペックなら、Cassandraは4GB以上、HBaseは8GB(Hadoopを使うなら+4GB)
・Cassandra+Hadoopは遅い。HBase+Hadoopはデータの局所性を認識してくれる(HBaseは物理的にデータファイルのある場所でMapReduceの処理が行われる。Cassandra0.6はデータファイルのある場所とは無関係なので、通信に時間がかかる)

・HBaseの構築には色々な設定が必要(Linuxのファイルディスクリプターを増やす、ZooKeeperを設定する、HDFSを構築する)
・Puppetもユーザーキーは扱いづらい。設定を書く(設定内の定義を共有する)のが大変。拡張ドキュメントも足りない
・Puppetと同様なツールで「シェフ」というのがあるらしい
(◆●Puppetは象本NTTデータの報告書でも紹介されていて良さそうな印象だったが、やはり実際は面倒な面もあるんだなぁ)

・RDBMSと比べると、KVSはキーをスケールするように設計するのが重要→(キーによってはデータが一部のノードに偏るので)1ノードにデータが集中してしまうとRDBの方がスループットが良いかもしれない
・CassandraはMySQLよりメモリーを喰う(MySQLは500MBくらいでいい)
・RDBとNoSQLの連携に関しては、RDBからデータをコピーして処理し、RDBに戻すのがいいかも(クリティカルなデータをNoSQLだけで保持するのはまだ怖い)
(元となるデータは別(RDBやファイル)にあり、NoSQLにロードできる状況が向いていそう。あるいは更新が頻繁に行われるデータはNoSQLに向いていない)
・RDBでも、データのバックアップはとるよね?(Amazon EC2も定期的にスナップショットは取れる)
・HBaseのデータのレプリケーション(複製):規模が大きければクリティカルなデータもいけるかも
・Adobeでは、HBaseからMySQLへリストアする仕組みを作った→Adobe の HBase 事例

・Cassandraでトランザクションってどうするの?→キューに入れて、1つのスレッドが書き続ける
・Cassandraではカウント処理が出来ないので、ZooKeeperでやってる(HBaseにはカウント機能はある(ただし遅い))


実際に使っている人の“感想”を聞けたのは貴重でした。
宣伝文句や想像している理想通りには動作しないってことですね、やはり^^;

討論会の次回のネタは未定とのことですが、聞きたいことを事前に募っておいて、答えられそう・面白そうなところから議論していくのもいいかも?

コメント (2)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

第10回Cassandra勉強会のUstの感想

2010-08-20 22:08:18 | PG(NoSQL)

2010/8/19の第10回Cassandra勉強会
には参加できなかったので(苦笑)、一人遅れて(さびしく)Ust(cassandra-study-10th)を見てみたので、その感想など。
しかしこうやって後からでも勉強会の内容が見られるのはUstのおかげ。ありがたい(笑)


まずは『CassandraとHBaseの比較して入門するNoSQL』。
・おー、@yutuki_rさんの声、かっこいいなw
・KVSはキーと値のみであり、CassandraやHBaseはKVSとは言わない。そうだよねー、自分も改めなきゃ(苦笑)
・列指向DBでは、行キーからカラム・タイムスタンプまでを全部合わせて“キー”。
・@yutuki_rさんが「CAP原理」派だったかw

・HBaseのRS(RegionServer)は分断して少数派になったと判断したら自分で停止する。複数分断したら全員が少数派と判断して全滅する^^;

・CassandraのHintedHandOffは、本来データを保持すべきノードが応答しない時にデータを預かる。HintedHandOffがあるので、クラスターが分断されまくって1ノードになったとしても稼動する。
・回復時のマージで不整合が発生する可能性がある→Cassandra0.7のVectorClockで回避できるかも

HBaseとCassandraの比較図は@yutuki_rさんの得意技だ(笑) この図は良い図だよね。今回自分が認識したのは、
・HBaseは自動分散、Cassandraは手動分散
・CAS操作:Cassandraは0.7から可能

・Cassandraは結果整合性であり、古いデータを返す事がある(クラスターの台数が少なくてもけっこう発生する。これに対しては、「古いデータが返ってきたこと無いよ」という質問も)。
・Cassandraもネットワークによっては応答が遅い。以前の勉強会では10秒くらいかかったこともあると報告されていた。
・HBaseは5ノード以上でないと安定しない(アプリにとって過剰なハードウェアになる可能性がある)。
・HBaseは構成要素が多い(HMaster・RegionServer・ZooKeeper・HDFS)のでクラスターを作るのが大変。

・最も苦手とする機能を作ってみる→地雷原を見つけられる→勉強会の発表のネタが増える
…自分も障害対応は格好のホームページのネタだと思う(爆)

スライドもGoogleグループのCassandra勉強会で公開されているらしいが、このグループには入ってないんだよな~。うーむ^^;
#てーか、Googleのアカウントってどうしてたかな(爆)


次はLucandra(ルサンドラ)とSolandra。
Lucene(ルシーン)のJavaベースの検索エンジンのインデックスをCassandraで管理する。専用のPartitionerを使う。

いろんな種類の検索インデックスを作るので、単純なKVSでなく、Cassandraのような列指向DBの方が向いているということかな?

Solandra
Solr(ソーラー)…Luceneベース
Solandra…Lucandraベース


おっと、togetherもあったのか。→第10回Cassandra勉強会 #cassandrajp #casstudy10th
後で見なければ!

コメント (2)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする