Kindle 2 23:19

2010/02/07 23:19

Kindle 2 を買ったのです。

2日に注文して4日に届いて、なのでまだ手探り状態。もとから入っていたものと、Kindle Store からダウンロードした "Effective C++" や "Founders at Work" のサンプルと、あと論文の A4 PDF を1つ入れている。

Kindle Store のサンプル機能は、「立ち読み」から、好きなところをパラパラ拾い読みするというランダムアクセス性が失われた代わりに、電車と自宅とカフェ (いかないけど) で何日もかけて買う前の本を読む、という場所と時間の自由があたえられていて、なかなか新鮮。

A4 の PDF は、縦横を回転させればなんとか読めるんじゃないかなあ、という甘い期待があったんだけど、やっぱり Kindle 2 ではきつかった。「無理!」ってのを人にみせるために入れてままにしてある。

まわりでは Kindle DX を持っているひとが3人、Kindle 2 が2人いて、どっちも買う前に見せてもらった。DX の人の中には裁断機とスキャナで本を PDF にするところまでやっている人がいるので、それも見に行ったんだけど、ちょっと自分には無理だなあと思いました。

CACM の MapReduce ばなし (後編) 00:05

2010/02/05 00:05

前回 は Michael Stonebraker らの "MapReduce and Parallel DBMSs: Friends or Foes?" を紹介した。

ひとつは MR と並列 DBMS を比較し、実際に Hadoop と商用の DBMS でベンチマークもとったけど DBMS のほうが速かったよ、という Michael Stonebraker らによる "MapReduce and Parallel DBMSs: Friends or Foes?"。これは、同著者ら (ただし 1st author はちがう) による "A comparison of approaches to large-scale analysis" の続きというかまとめ的な感じ。

CACM に載っていたもうひとつが、Andrew Pavlo らの "A comparison of approaches to large-scale analysis" での MapReduce vs. 並列 DBMS に意義を申し立てる "MapReduce: A Flexible Data Processing Tool" だ。著者の Jeffery Dean, Sanjay Ghemawat は2004年のそもそもの MR 論文 ("MapReduce: Simplified data processing on large clusters") を書いた Google のひとです。

MapReduce: A Flexible Data Processing Tool

著者らはまず、先の論文や Stonebaker, David Dewitt のブログ記事には MR に対する誤解があることを指摘し、さらに MR の利点を紹介。彼らの結論は特定の実装にもとづくもので、欠点も MR 一般に通じるものではない、という。

MapReduce のつかいかた

最初は「MR はそれ単体ですべてをやるものではないよ」というはなし。

多くのシステムは顧客情報を RDBMS に、ログをファイルシステムにと、様々なストレージを組み合わせて構成されている。MR はこのような混成 (hetorogeneous) なシステムに、情報を分析するためのシンプルなモデルを提供するものだ。MR を新しい種類のストレージで動かすには、ユーザーが簡単な reader, writer を書いて拡張するだけでよく、実際に分散ファイルシステムやデータベース、Bigtable まで、様々なストレージが使えるようになっている。これに比べると、並列 DBMS は分析前にまずデータを INSERT しなくてはいけない。これは不便だし、おそらくは許容できないくらい遅いだろう。

また、MR にはインデックスの利点をうけられないというが、インデックスがあるデータがあるなら、それを最初に使うことはできる。DBMS が元データならそこでインデックスのきく SELECT 文を書けばいいし、ログファイルならふつう日付をファイル名にいれてローテートさせるので、全ファイルを MR に渡して日付でしぼりこまなくても、あらかじめ特定のファイルだけを渡せばいい。

次に、著者らは MR で実際に行っている (つまり Google でやっている) SQL で書けない複雑な処理を紹介していく:

  • HTML の文章群からリンクをあつめて、それをリンク先でまとめる
  • 衛星写真をつなげつつも重複部分を省き、Google Earth むけの画像をつくる
  • 検索でつかう圧縮された転置インデックスをつくる
  • 世界中のすべての道路のつながりを処理して、Google Maps むけのタイル画像をつくる
  • Sawzall や Pig Latin (Hadoop で使える) のような高級言語で書かれたプログラムを、耐障害性のあるかたちで並列実行する

さらに、理論的には UDF で出来るといっても、実際の Pavlo らのベンチマークでは DBMS-X で UDF を使ったときにはバグをふみ、Vertica にはそもそも UDF 自体が無かった、というところにも触れている。

実装上の工夫

ここからは実装上の工夫のはなしが続く。

まず、著者らは Pavlo らの主張するスキーマの有用性を認め、だから Google では MR でも大抵 Protocol Buffers を使っているよ、と続ける。それはそうですよね。

次に、push vs. pull モデルのはなし。pull モデルがたくさん小さいファイルを生成したり、mapper と reducer の間で多くのディスクのシークがあるのは事実だ。しかし、Google の MR 実装ではバッチやソート、中間データのグルーピングや読み込みのスケジューリングなどの "implementation tricks" でそのコストを軽減させている。また、MR が push モデルなのは、決して耐障害性だけのためにあるものではない。実際に障害が起きることはそんなに多いわけではない。しかし、例えば Google のクラスタのスケジューラは、より優先度の高い MR タスクのために他のタスクを殺して場所をあけたりしてくれる。こういう際にも MR が自動的かつ部分的に再実行できることは重要になるという。

Google が扱うデータ量は、あるいは Google 外でも、大量のデータを相手にしなくてはいけない局面は、日々拡大していてる。データ量が増えれば、MR のような耐障害性のあるシステムを必要とする人々も増えるだろう、と著者らはいう。

最後に、Pavlo らの実行速度についての比較について:

  • エンジニアが気をつけるべきところ: 起動のコストや読み込みの速度は実装の成熟度を表すもので、プログラミングモデルとは関係ない。起動コストは MR のワーカープロセスを立ち上げたままにして呼び出しごとに殺さないことで、読み込みの速度は Protocol Buffers のような効率的なフォーマットを使うことで改善できる。
  • 必要のないデータも読むのは MR では避けられない: そんなことはない (ここは前述のぶぶんの繰り返し)
  • 結果のマージ: マージは必須ではない。MR タスクの結果をさらに他の MR タスクに渡すときは、マージする必要は無い。
  • データの読み込み: やっぱり並列 DBMS は遅い。INSERT し終わったものをいろいろなクエリで分析する場合には問題ないかもしれないけど、実際そういうことは少ないだろう。

おわり

というわけで Communication of the ACM の2010年1月号から MapReduce に関する2つの論文を紹介しました。ややすれちがい気味のところもあるけど面白くて、あと並列 DBMS というのは正直初めて知ったので勉強になりました。MySQL 上に似たようなの作れないかなあ。

Vertica は今回だと旧勢力側だけど「Orace より安いぜ」とか「列ベースはださいぜ」とか普段は挑戦者っぽい立ち位置なんですかね。使っている会社のなかには Mochi Media なんかもあり、Bob Ippolito 曰く:

Vertica works well for Mochi, both for ad-hoc and for on-line production queries. It's expensive but so is building your own.

らしい。Erlang のはなし のなかにもごくわずかに出てきます。

MapReduce は、Hadoop がやや残念だったのと、Google での細かな改良と実例が印象的。ただ Hadoop の実装がすごく良くなったとしても MapReduce モデルを使う損益分岐点はまだよくわからず。衛星写真とか日頃取り扱わないし、アクセスログみたいな文字列処理にはオーバースペックな気もします。

CACM の MapReduce ばなし (前編) 13:07

2010/01/30 13:07

Communication of the ACM の1月号には MapReduce のはなしが載っていて、というのを steps to phantasien で知って、実際に読んでみた。私は去年の末から ACM 会員になったので、CACM は家に紙のやつが届くのです。

MapReduce and Parallel DBMSs: Friends or Foes?

ひとつは MR と並列 DBMS を比較し、実際に Hadoop と商用の DBMS でベンチマークもとったけど DBMS のほうが速かったよ、という Michael Stonebraker らによる "MapReduce and Parallel DBMSs: Friends or Foes?"。これは、同著者ら (ただし 1st author はちがう) による "A comparison of approaches to large-scale analysis" の続きというかまとめ的な感じ。

著者らはまず、MR は RDBMS というよりは ETL (extract-transform-load, 抽出-加工-書き出し) システムに似たものであって RDBMS とは補完しあう技術であるよ、と置きつつも

it is natural to ask whether MR systems should replace parallel database systems.

と、並列 DBMS との比較につなげる。並列 DBMS というのは、安価な (comodity な) 計算機をつないだクラスタ上で、ひとつのテーブルを複数のノードに分散させ、SQL を各々のノードで並列・分割に実行できるものらしい。水平な分散 (sharding) が SQL 上ではなく、その抽象化の下にあるってことですね。

次に、著者らは MR のプログラミングモデルはそれ特有のものでなく、並列 DBMS 上でも実現できるよ、と主張する。抽出や加工はふつうに SQL で書けるし、複雑な Map, Reduce にはユーザー定義関数 (UDF) を使えばよろしい。Map-Reduce 間の shuffle は GROUP BY でできる。また、並列 DBMS の線形なスケーラビリティにはここ20年の実績があり

There is no reason why scalability cannot be increased dramatically to the levels reported by Jeffery Dean and Sanjay Ghemawat, assuming there is customer demand.

という。すごい自信だ。

著者らはさらに、MR が使われがちな局面について、並列 DBMS での実現方法を考察していく。

  • ETL: MR むきだけど並列 DBMS でもできる。でも ETL は DBMS にデータをいれる前段階に使われることが多い。
  • 複雑な分析: マイニングやクラスタリングのような、SQL で書きづらく、かつ処理が複数段になっているものは MR に向いている。
  • Semi-structured: 行ベースの DBMS には向かないけど Vertica のような列ベースのものなら向いている。
  • 汚くてもいいのですぐ分析したい: 並列 DBMS はインストールと設定が難しい。その点、MR は簡単にスキーマもないしすぐ使いはじめられる。ただ並列 DBMS はちゃんと設定・設計すれば速いので、その分析が一時的なものでなければ、初期投資も見合う。
  • 予算がない: 並列 DBMS は高いし、コミュニティベースのものは信頼性があんまり。MR は良いね。

わりと向き不向きがあるんですね、って平和なのはここまでなんですが。

ベンチマーク

ここで著者らは Hadoop と DBMS-X (名前は明かされないが、行ベースの並列 DBMS), Vertica (列ベースのDBMS) について100ノードのクラスタでベンチマークをとる。すべての結果と考察は "A comparison of approaches to large-scale analysis" にあり、今回の論文ではそのうちの3つについてふれている。

  • MR の最初の論文にあった Grep: DBMS のソートやインデックスが使えないし、ファイルシステム上にレイヤをあまり重ねない MR のほうが有利だと思うけど、DBMS-X が Hadoop より1.5倍、Vertica が2.6倍速い
  • Web のログファイルをあつかう: フルスキャンでインデックスも使えないのに DBMS-X が Hadoop より1.5倍、Vertica が4.3倍速い
  • Join: DBMS-X が Hadoop より36.3倍、Vertica が21倍速い

結果の考察としては

  • パース: Hadoop のデフォルト設定では、入力データと同じようなテキスト形式のフォーマットで HDFS にデータが置かれるため、パースが何度も必要になっている。SequenceFile という効率的なフォーマットも提供されているが、これも value に複数の属性をいれるとパースが必要になる。
  • 圧縮: 並列 DBMS はデータを圧縮して IO のコストを減らしているので速い。Hadoop にも圧縮はあるけど、減らせる IO コストと増える CPU コストとのバランスが微妙で、使うと遅くなることもある。
  • パイプライン: 並列 DBMS はデータを処理から処理へ push して流していく。MR は Map で出来た中間ファイルを Reduce 側で pull したり、耐障害性の反面、効率は悪い。
  • スケジューリング: 並列 DBMS は実行前に全体でのスケジューリングと最適化を行うけど、MR は実行時にノード単位でやるだけなので遅い。
  • 列ベース: ログファイルを扱う際にで Vertica が速かったのは、他ふたつが行ベースだったから。

という点をあげ、Hadoop の実装特有の (Google の実装では解決されているかもしれない) 問題も多いけど、パイプラインとスケジューリングのあたりは MR モデルの耐障害性に関連しているので、MR 一般の問題だろうと指摘する。また DBMS のトランザクション単位の耐障害性にも、途中の処理結果をディスクにおいて、より細かい耐障害性を実現するものもあるんだよ、という。

つづく

長くなったので一旦おわり。後編では Google のそもそもの MapReduce 論文の著者である Jeffery Dean, Sanjay Ghemawat の反論を紹介します。

Passionate 22:10

2010/01/28 22:10

むかし読んだ『UNIX プログラミング環境』はいつのまにか絶版になっていた。UNIX を勉強するには何がいいんですかね? と聞くと

% cd /usr/bin
% man *

とか、いや man は環境に依存した記述があるから SUSv3 がとか、あの、えーと、研修でつくったサービスのセキュリティホールをつけるようにとか、NoSQL ブームに参加できるようにとか、そういうはなしをしてるんじゃなくてですね。

ただ、はじめから獅子を目指さないやつは猫にすらなれねーんだよ、といわれるとそうなのかなあという気もする。

お勉強好き

実際のところ、われわれは「お勉強」が好きだ。

最近、(プログラマじゃなくても) 良いプログラマを見分けるには というはなしを読んだ。そんなに目新しいことは書いてなくて

  • 情熱 - IT が「良いキャリア」だから、ではなく、プログラミングに情熱をもっていること
  • 自分で勉強し、学ぶことが好きなこと
  • 知性 - 社交性と同一視はできないけど、人当たり最悪なのもだめだよ
  • 履歴書に書かないような経験 - 子供のころとか
  • 幅のあるテクノロジ - Java ひとそろえ、とかではなく、新しい技術を学んでいることがわかるように
  • 認定試験とかはあんま気にするな

と、わりと「いつものやつ」だった。ブログでこういう話題をあつかうのは明らかに母集団にかたよりがあり、Web 上のアンケートでインターネット利用率を調べるような感じがある。高橋征義さん のようなことを書いてくれるひとは少ない。

自分で本を買って読むのはよいことだ。就業時間以外にコードを書くのもよいことだ。しかし、それは個人のたのしみのために行われるべきものであって、職業上の義務としてなされるべきものではない。それでは単なる時間外労働である。

業務のために、就業時間外にたくさん本を読め、と説く人々は、時間外労働を対価なしに(むしろ本代を払って)行え、と説いていることに他ならないはずだ。これを問題だと思わないのだろうか。私は非常に重大な問題だと思う。そのような行動をとらなければキャリアに支障を来たすというなら、それは業界そのものが深く病んでいるとしか思えない。

「え、病んでるんですよ」という認識はあるかもしれなけど、目指すところではないですよね。

技術的負債

一方で、決められた時間に仕様をみたした仕事をしてるんだから、お勉強なんて十分ですよ、といわれると、それもそれで不安になる。CS はそんなに関係ない (もっとほら論文とかだよたぶん) けど、コンピュータサイエンスはこう学べ (2) には面白いはなしがあった。

それは簡単で、Code Complete (ASIN:489100455X) とか、そういう方向だよね。チームで仕事をする時に、同僚の邪魔をしない為のコード、ってのはあるんですよ。最低の品質を保証するためのコード。OSとかコンパイラの本ってのは、読んで無くても割と大丈夫で、そういう本を読んでないとローレベルなレイヤーのものは作れないけど、それはそれで大丈夫で、仕事だとそういう仕事は作れる人に回っていくので。それがただ回して貰えないだけで。誰もが普段書くコードの品質ってのは重要で、そいつにインパクトのある本と、そうじゃない奴ってのは別なんだよ。コンピュータサイエンス寄りなやつってのは、自分の満足度とかハイテク路線。チームとか仕事としてコードを書く時に、他人に迷惑を掛けない為の本というのは、主にデザインとかプロセスの話。

これは確かにそうだ。

世の中には技術的な負債というのがあって、それを加味しない仕事を私は支持しない。負債が仕様に含まれないのは、それを測るのが難しいからであって、それが重要じゃないからではない。負債というものが全くわからない人がいるとしたら、すごく恵まれているか、勉強が足りないか、どちらかだと思う。

そういいながら『Code Complete』は読んでないんだけどね。

まとめ

どうやってもまとまらないですね。身に余ります。

私は、お金でいったら計算機と関係ない本も買うし、時間でいったらライブハウスに行ったりもするけど、やっぱり計算機まわりに費やしている個人的な資源はおおきい。これは、もっと仕事ができるようになりたいというのもあるし、どうしようもない事情で (自分が引っ越したいとか、会社が京都に引っ越すとか) 辞めざるをえないときに、路頭に迷いたくないというのもある。そもそも楽しいというのも、もちろんある。

でも、そういうのは、個人的な時間のつかいかたを他人に強制することは、ブラックとまではいかなくても、ダークグレー企業だなあとは思う。あんまりやりたくないし、やる立場にも無いのです。

なんでこれから Scala? 08:06

2010/01/22 08:06

去年から Scala を勉強していて、お正月には Martin Odersky の『Scala スケーラブルプログラミング』(コップ本、と呼ぶらしい) も読んだ。Scala はかなり良い。私が言語を選べる立場にあるときに、いままで好き好んで使っていた言語は Ruby だった。でも、これからは Scala も積極的に検討していこうと思っている。

プログラミングの間違いが静的にみつかる

Scala を推す一番の理由はここだ。型がちがうとか、引数の個数がちがうとか、存在しないメソッドを呼び出しているとか、そういう間違いは静的にみつかるべきだと最近は思っている。型をいちいち書くのはだるいけど、Scala には型推論があるので比較的だるさは軽減される。また、実行時例外として名高い NullPointerException についても、Option 型を適切につかうことで未然に防ぐことができる、と思う。

自動テストで動的にみつける方法もあるけど、これは

  • 書かない人と同じコードベースで作業することがある
  • 書かないどころか、人の書いた物を失敗させても気にしない人もいる
  • 自分でも、ここは書きにくいな、と書かないことがある

と、試してみたらいろいろ大変だった。原則としてテストは書くけど、テストのない場所におけるセーフティネットとして静的な検査もあるよ、というのはかなりありがたい。

Java の資産がつかえる

たとえば Tokyo Cabinet や memcached を使いたいといったときに、Java むけに用意されたライブラリを簡単に使える。Java のライブラリは、インターフェースが個人的に好みじゃないものもあるけど (最近は Apache HttpComponents がよくわからなかった) ライブラリ全体を書くのと、薄いラッパーですむのとだったら、断然後者のほうが楽だ。

Google AppEngine で動く

Scala は Google AppEngine for Java で動く。AppEngine はすごく便利で、エラーログすら見れないサーバーに FTP でアップロードしたファイルを CGI で、みたいな「はじめての Web プログラミング」をおじいちゃんの昔話にしうると思う。

便利な言語仕様

静的な検査は Java の文化を、次の2つは Java の VM をうけついでいる。Java と設計意図からして差異を感じるのは Scala の「便利」な言語仕様だ。if が値をかえしたり、return を省略できたり、匿名関数を _ で短く書けたり、val と書くだけで再代入できない変数をつくれたりする。ここらへんの「最初は混乱するかもしれないけどまあ慣れれば便利じゃん」というのは、個人的にはあまり Java っぽくないと思う。

ちなみに再代入できる変数は var で一文字しかちがわない。Scala の短さを追い求める姿勢はやや過激で、例えば、いわゆる "fold left" が "/:", "fold right" が ":\" という名前のメソッドとして定義されていたりする。最初にふれた本には「スラッシュの向きが木構造の左右の傾き方をグラフィカルに描いたものに似ている」と由来があった。

Perl?

そもそも Scala をやる理由を書こうと思ったのは それでも私が Perl5 を使いつづける理由または、Why I still use Perl5? 的な。それでも私が Perl を使いつづける理由 を読んだからだ。Perl は最近よく書いている。ただ、これからも使うかとか、人に勧めるかとかは、かなりつらい。

理由は文法まわりが大きい。やっぱり「$@%* 」は気になる。行末の ; も、関数の頭で @_ から自分で引数をおろすのも面倒だ。コンテキストは失敗だった。ただ、使える環境は多いので書けるほうが生活上便利だとは思う。最近 ruby -e … とワンライナーで大作を書いたら Ruby がはいっていなくて悲しかった。Linux Standard Base に関していうと 3.2 では Perl と Python が、4.0 で Java がはいったらしい。

CPAN については微妙な立場だ。たくさんモジュールはあるけど、実際に私が使うものはそんなに多くなく、個々のライブラリを単体でみれば他言語にも代わりになるものがあると思う。試しに Perl で有名なものについて Ruby での代替を表にしてみた。

ここで Scala が出てこないのは勉強中だからです。

Perl Ruby
AnyEvent EventMachine
Catalyst Merb or Rails
DBIx::Class DataMapper or Rails (ActiveRecord)
DateTime, Time::Piece Time (言語の一部)
List::Util Enumerable, Enumerator (言語の一部)
Coro Fiber (言語の一部)
WWW::Mechanize Mechanize
Plack Rack

テストをつけておくと様々な OS x 様々なバージョンの Perl で実行してくれるとか、ミラーサイトが多いとか、そういう全体としての CPAN はまだすごい。"7904 authors 17293 modules" みたいな量については、前述の理由と、あと Catalyst::Plugin::* ブームとかもあったのであんまり。

blog.8-p.info加藤和良 の個人的なブログで、プログラミングのはなしが多めです。