HBase論争に釣られてみる

HBaseコミッター達による、NoSQLの記事への反論が面白かったので翻訳してみました。

著者の許諾取得済み。Thanks Stack and the other authors!

本文

原題: Taking the Bait


Information Weekは先日、「HBase はNoSQL を支配するのか?」という記事を掲載した。MapR の Michael Hausenblas は HBase の事例に「賛成」の論陣を張っており、Apache Cassandra の Jonathan Ellis とベンダーである DataStax は「反対」の側だった。

この「ディベート」をベンダーのセールストークとして却下し、Apache HBase に立ち戻り、HBase を使用し、改善していくのは、簡単な話である。しかし、この記事は特別に問題のある例だった。記事では、「賛成」と「反対」の双方とも、HBase コミュニティの仕事にはほんの少ししか言及していない。ここでは誤りを訂正する目的で、いくつかの点に言及したい。

まず、Michael は、Hadoop が急速に成長しており、そして、HBase は Hadoop から出てきたのであり、緊密に結びついているのであるから、HBase は上向きの上向きだ、と論じていた。HBase コミュニティの積極的な参加者でなければ、このような仮定を立てるのは容易である (HBase によって Hadoop の採用を推進されているところでは、その逆に出くわすことにもなる)。
Michael は次に、古い一貫性対 eventual-consistency の戦いに話を焼き直し、飽き飽きする HBase 対 Cassandra の機能比較に切り替えた。そして、最後には、Cassandra の源泉である Facebook がデータ保存のために、大きなサイズのいくつかのアプリの代わりに HBase を使用することにしたというだけの理由で、HBase の方が良い、と結論づけた。我々はその種の論争などしない。Apache HBase か Apache Cassandra を活用すべきであるかどうかは、多くの要因によるのであり、多くの規模の問題と同様に攻撃的な言い争いに巻き込まれすぎているといえる。


その次に Michael は、「我々は企業向けの HBase の「次のバージョン」を作り上げた・・・。我々は2013年5月に M7 のラベルの下でその新しいバージョンをGAにもたらした」と語り、おとり商法を行った。この引用での「我々」というのは、Apache HBase コミュニティのことを述べているのではなく、Michael の雇用主であるMapR Technologies のことを指している。また、Michael が言及する「企業向けの HBase」というのは Apache HBase のことではない。M7 というのは、我々が知る限り、構造上 Apache HBase とは根本的に異なっている、プロプライエタリの製品である。その製品はソースが明らかにされていないのであり、我々はこれ以上は言及できない。この話は、Apache HBase コミュニティが長年にわたり、ハードワークと、Apache HBase 以外の商業的なクローズドソースの製品への寄与を通じて築き上げてきた信用と善意をいただいてしまおうとする試みと見えた。


次は、Jonathan の「反対」の論に言及してみたい。Jonathan の主張のいくつかは今はもう真実ではないか、大いに主観的である。真実でないというのは、「RegionServer のフェイルオーバーは10分ないし15分かかる」という箇所である (HDFS-3703 および HDFS-3912 を見てほしい)。主観的であるというのは、「HBase をもとに開発を行うのは苦痛だ」という箇所である (我々の意見では、我々のクライアントAPIは、一般的に使用されているCassandra クライアントライブラリよりも簡単で使いやすい)。これら以外のものについては、どれもメーリングリストから Quora に至るフォーラムで何年にもわたり論議・再論議してきたものばかりだった。Jonathan の論は大部分は、我々が Apache Hadoop の HDFS ファイルシステムと緊密に結びついていることと、 Google BigTable アーキテクチャの輪郭をなぞっていることから来るものを、列挙しているだけである。HBase は HDFS の多くの機能を利用し、BigTable からは着想を得ている。その結果として、Cassandra にとっては問題となるユースケースのいくつかを、我々は得意としている。逆もまた真である。我々のユーザーが使用するハードウェアは進化するのであり、あるいは、新たなユーザーが新しいユースケースをもとにした経験をもたらすのであり、我々も HDFS もじっとその場に立ち止まったままではいない。


彼は、アプローチの違いを強調している。


我々は協調させるために、Apache HDFS の採用、Apache Hadoop MapReduce の統合、および、Apache ZooKeeper の使用を選んだことを、健全な関心の分離と見なしている。HBase は歴戦のコンポーネントで構築されている。これは特徴であり、バグではない。


Jonathan が組み込まれたクエリ言語やセカンダリインデックス機能をコア Cassandra に必要な複雑化と見なすのに対し、我々は、Salesforce の Phoenix のようなプロジェクトを、Apache HBase を中心とするより大きなエコシステムの一部である見なし、支援する。Phoenix の人たちは問題のその部分にドメインの専門知識をもたらすことができるが、我々 (HBase) は、安定したパフォーマンスの高いストレージエンジンコアを提供することに焦点を当てることができる。Apache Hadoop をここまで成功させてきたものの一部は、プロジェクトを支援し豊かにするそのエコシステム、HBase を含むエコシステム、である。そのようなエコシステムが、HBase の周囲で発展してきた。


Jonathan が、HBase コミュニティのことを「リーダーシップ」が分散されているために「断片化」されていると評する方向へとそれていくのに対し、我々は、そこで言及されているのはたぶん、Apache HBase プロジェクトは「所有」されたプロジェクト、つまりたった1人のベンダーに導かれたプロジェクト、ではないという事実であるのだろうと考えている。むしろそれは、多くの組織、ほんの数例をあげれば、Cloudera、Hortonworks、SalesforceFacebook、Yahoo、IntelTwitter、および Taobao ということになるが、それらの多くの組織からの多くのチームがみな協力してそのプロジェクトを推進していこうとしている、そのようなプロジェクトなのである。Apache HBase コミュニティのほとんどは、2つのブランチでの共同作業に参加している。ブランチの1つは新規の0.96のリリースに関するものであり、もう1つは現在の安定したリリースである0.94に関するものである。Facebook もまた、共有されているソース管理リポジトリにおいて、Facebook 独自の Apache HBase のブランチをもっている。このブランチはインスピレーションの源泉になっており、ときに他のブランチへの直接的な寄与となっている。我々のコミュニティのニーズと要望に応じた便利で効率的な協力モデルを発見したことについて、我々は謝罪するつもりなどない。たった1人のベンダーに導かれた他のプロジェクトにとっては、このことは完全に最適化されていないか、場合によっては混沌 (「断片化」) とすら見えることだろう。


我々はこれはそのまま残しておく。

いつもと同じように、我々は、我々のコミュニティと Apache HBase プロジェクトへのあなたの参加と寄与を歓迎する。我々には、偉大な製品と、特定の商業体への恩義がなく、エゴのない、摩擦の少ない意思決定プロセスとがある。もしあなたがかかなければならない痒みがあって、Apache HBase が解決策ではないかと思うのなら、あるいは、あなたが Apache HBase を使用していて、もっといい改善案があるはずだと感じるのなら、我々のところにやってきて、大いに話をしましょう。

Hadoopのディスクあふれ対策(補足)


最近流行りのディスク容量があふれたときの挙動、Hadoop編を書こうと思ったらwyukawaさんが既に書いてくださったのでやめました。
……と思ったのですが、せっかくなので id:wyukawa さんが書いてない箇所を補足してみようと思います。

( この記事は @ にレビューしてもらっています。ありがとうございます )

wyukawaさんの記事へのコメント

まずHBaseを使っている場合はcompactionがある関係上Disk使用率は50%以内に抑えておくのが無難だと思います。この辺はCassandraと同じですね。


全データを同時にコンパクションするケースはまずないので無理に50%以下に抑えなくていいとは思いますが、意識はしておいた方がいいですね。
私は60%での警告を推奨しますが、この辺はケースバイケースです。
MapReduce の出力結果など、いきなり容量増える場合もありますし、サーバが飛べば総容量は減りますから、HBase を使っていない場合でも容量ぎりぎりに使うことは推奨しません。

次にNameNodeの場合はdfs.name.dirで指定したディレクトリにメタデータを書くわけですが、このパーティションがDisk Fullになった場合はNameNodeがdownします。大変危険ですので注意しましょう。


dfs.name.dir は CDH3 / Hadoop 1.x 系のプロパティです。CDH4 / Hadoop 2.x 系だと dfs.namenode.name.dir になります。
dfs.namenode.name.dir を複数指定している場合、いずれか一つに書き込みが成功すれば警告のみでダウンしません。
WebUIからは、メタデータを書き込めないディレクトリは failed と表示されます。
edits の書き込みは、QJMベースにしていれば複数台中過半数に書き込めていれば大丈夫です。
例えば3台のジャーナルノード(JN)があれば、1台のディスクがあふれてもサービス継続します。

hadoop fs -rmで削除してもTrashが有効になっている(fs.trash.intervalが設定されている)場合は.Trashにmvするだけなのでそこも消しましょう。


hdfs dfs -expunge で Trash を空に出来ます。

Hadoop のデータ使用量


大体以下のような感じで容量を食います。

  • NN
  • 2NN 及びスタンバイNN
    • NNと同じだけのデータ及びバックアップのメタデータ(デフォルト2世代、dfs.namenode.num.checkpoints.retainedで調整可能)
    • つまり(アクティブ)NNより容量が多いので注意!
  • ジャーナルノード(JN)
    • edits
    • ログ
  • DN
    • 実データ
    • ログ
NN


そもそもメタデータ(fsimage)はメモリ上にロードしなければいけないのでせいぜい数十GBが限界。
editsは処理内容によりますが、きちんとチェックポイントが稼動していれば数GBも見ておけば十分かと。大抵の場合100GBもいくことはないと思います。
問題はログで、数百ノード〜1000ノードクラスになると数分あたり1GBなんていう恐ろしいスピードで生成されていきます。
あっという間にパンクするので注意しましょう。
ログの管理については後述。


NNについて重要なのは、100GBぐらいの容量は割と普通に使うということです。
DNに比べてディスク容量少なくていいからといって、133GB の HDD とかで RAID1 組んだりしてるとディスクあふれて落ちる場合がありますのでご注意ください。

DN


ディスク内バランシングについては wyukawa さんが書いた通り。
一時データのつもりでレプリカファクター1とかで書き込んだりしているとあっさり偏りますので、ディスク監視とこまめなバランサー稼働をこころがけましょう。

5ブロック分の書き込み容量を確保できないDNは、NNから書き込み不能DNとみなされますので、HDFSの書き込みであふれることはないです。


Hadoop はDN 1台死んだって問題ないからそんなに心配しなくてもいいんじゃね?」
と思う人がいるかもしれませんが、もしうまいことばらけて書き込んでる場合は他のDNもディスクがいっぱいになってるはずなのでわりと状況は深刻です。
HDFSの総容量は常にチェックしておきましょう。

ログ


Hadoop 1.x 及び CDH3 系はデフォルトが DRFA です。
つまり、1日ごとにローテーションしていく形式です。
これにより、ある日のログだけ異様に膨らむということが起こりえます。
CDH4 / Hadoop 2.x 系はデフォルトが RFA でサイズ固定になっています。(デフォルト 256MB * 20ファイル = 5GB)
ログあふれが起こりにくくなっている反面、ログが流れやすいので注意が必要です。


CDH4 で MapReduce1 を使っている人は、MR1だけがデフォルト CDH3 準拠、つまり DRFA になっていることに注意してください。

捕捉

よく考えたらオリジナルは「容量が少ないというアラートが飛んできたときにどうするか」なので、上記の内容だとただの予防ですね。
とりあえず思いつくのを二つ。

ログ消しましょう

RFA だと昔よりログあふれしにくくなったとはいえ、緊急事態のときには真っ先に削除する対象なのは変わらないでしょう。
クラスタ内に入って Hive を起動している場合、ローカルファイルシステムの /tmp/${ユーザ名}/ 以下に hive.log などのログ一式が収まっていますので、パーティション分けていない場合はこれも消しましょう(微々たるものですが)

HDFS

ゴミ箱ディレクトリ ~/.Trash の削除は前述の通り。
/tmp も消せるものは消しましょう。MapReduceなどのジョブの実行情報などが格納されているのでジョブの再実行ができないかもしれませんが、緊急事態なのでクラスタがダウンするよりマシです。一時しのぎしつつ根本的な対応を急ぎましょう。

MacOSXにnumpy, scipy, matplotlibをインストール

西尾さんの記事を試したかったので、必要なパッケージをインストールしました。

手順

gfortran を入れる→ pip install で必要なものを突っ込む、の順。
コンパイルする必要があるので XCode 必須。

まずは gfortran をインストール。

$ brew install gfortran

次に pip install でパッケージをインストール。

$ pip install numpy
$ pip install scipy
$ pip install matplotlib

  • warning がたくさん出るけど気にしない
  • easy_install だとうまく入らなかった。原因不明だし本当に easy_install に問題があるのかも未検証

勝ち続ける意志力

勝ち続ける意志力 (小学館101新書)

勝ち続ける意志力 (小学館101新書)


プロゲーマー、梅原大吾の本。
ゲームに限らず、一つの道に真摯に向き合うための心構えについて教えてくれる、素晴らしい本でした。
特に心に残った箇所をまとめてみました。

勝つことに執着している人間は、勝ち続けることができない
(p.14)

100回や200回かつくらいでは、全然足りない
(p.14)

ほとんどの人は、実力がつけばつくほどに自分なりのスタイルというものを確立してしまう。
…さらに危険なのが、自己分析して自分のスタイルを決めるのではなく、他人の評価を鵜呑みにしてしまうことだ。
(p.55-56)

センスや運、一夜漬けで勝利を手にしてきた人間は勝負弱い。
(p.59)

自分の好きなジャンルで安易な道を選ぶことは考えられない。
(p.62)

便利な技を使えばコンスタントに80点は出せるかもしれないが、100点には届かない。
(p.64)

弱点を突いて勝つ戦法は、勝負の質を落とすような気さえする。
その対戦相手は自分を成長させてくれる存在なのに、その相手との対戦をムダにすると感じるのだ。
だから、弱点を突かず、むしろ相手の長所となる部分に挑みたい。
(p.68)

必勝法はないと確信しているからこそ、次から次へと手を替え品を替える。
……とにかく、できることを片っ端から試していくのだ。
隅から隅まで徹底的につぶしていくので、どれが良くてどれがダメなのか、自分の経験として身体が覚えていてくれる。
(p.73-74)

生み出した特許よりも、新しい特許を生み出す力の方が遥かに重要なのだ。
(p.77)

考えることをやめなければ出口は見つかる。
(p.95)

自分を痛めつけていると、努力しているような気になる。しかし、そんな努力からは痛みと傷以外の何も生まれてこない。
(p.185)

自分にとっての適量を考えるなら、
「その努力は10年続けられるものなのか?」
自問自答してみるのがいい。
(p.194)

勝った翌日ほど対戦する
(p.240)

Fabric の run() メソッドと sudo() メソッド


この記事では、Fabricの主要メソッドである run() と sudo() について解説します。

サンプルコードは https://github.com/shiumachi/fabric-sample にあります。

run() と sudo() の基本


読みやすくするため、以後は必要がない限り run() メソッドのみを取り上げます。run() で出来ることはほぼ全て sudo() でも出来ます。断りが無い限り、run() は sudo() と読み替えることができます。

  • from fabric.api import run でインポート可能
  • run([コマンド文字列]) で、任意のコマンド文字列を実行可能
  • sudo([コマンド文字列]) とすれば、任意のコマンド文字列を sudo できる

エラーハンドリング


run() で実行したコマンドが失敗した場合、fab コマンド自体がその場で中断(abort)されます。

もしそのまま処理を続行したい場合は warn_only=True という引数を追加します。

def run_error_warn_only():
    run("hoge", warn_only=True)


warn_only=True だけだと、処理は続行できますがエラー出力はそのまま行われます。
エラー出力も抑制したい場合は quiet=True を追加します。

def run_error_warn_only_with_quiet():
    run("hoge", warn_only=True, quiet=True)

出力内容やリターンコードを使う


run() コマンドの返り値には、出力内容とリターンコードなどの情報が含まれています。

この返り値、公式ドキュメントでさえ使い方がきちんと整理されて書かれていないので、ここにまとめておきます。

res = run() としたとき、

  • print res
    • 実行したコマンドの出力内容を出力する
  • res.return_code
    • リターンコードを返す
  • res.succeeded
    • コマンドが成功していたら True、失敗していたら False を返す
  • res.failed
    • コマンドが失敗していたら True、成功していたら False を返す。succeeded の逆。


となります。

def succeeded_sample():
    res = run("hostname", warn_only=True)
    if res.succeeded is True:
        puts("succeeded!")
        return

sudo() で、リモートサーバ上で別のユーザとしてコマンドを実行


リモートサーバで、現在実行しているユーザとは別のユーザでコマンドを実行したいときがあります。

例えば、Hadoop HDFS の管理コマンドは hdfs ユーザしか扱えません。

そういうときは、user='ユーザ名' を使います。

def sudo_user_sample():
    print sudo("id", user='sho')


ユーザ名は、既に存在する別のユーザがあればそのユーザと置き換えてください。

zsh による Fabric コマンドのタブ補完


Fabricは便利ですが、コマンドが多くなると管理が大変になり、いちいちコピペするのが面倒になります。

zsh を使えば、Fabric のタブ補完をすることが可能です。
ここでは、oh-my-zsh を使ったタブ補完の設定方法を紹介します。

oh-my-zsh のインストール


id:mollifier さんがインストール方法についてまとめてくれていますので、こちらを参考にしてインストールしてみてください。

http://mollifier.hatenablog.com/entry/20101009/p1

Fabric 用タブ補完プラグインの導入


残念ながら、Fabric 用タブ補完プラグインは oh-my-zsh のアップストリームにマージされていません。

santiycr 氏が補完プラグインを書いていますのでそれを使ってください。


~/.oh-my-zsh/plugins/fabric というディレクトリを作成し、以下のファイルを置いてください。


https://github.com/santiycr/oh-my-zsh/blob/master/plugins/fabric/fabric.plugin.zsh


やり方が分かる人は、santiycr 氏のリポジトリを fetch して必要なパッチのみを cherry-pick するといいでしょう。

一応こんな感じにすればうまくいくはずです。
細かい説明は省略します。

使い方


fabfile.py のあるディレクトリで fab と入力した後、タブを押すだけです。

コマンドを補完するか、補完対象のコマンド一覧を表示してくれます。

今日からすぐに使えるデプロイ・システム管理ツール Fabric 入門

Fabric は、Python 製のデプロイ・システム管理ツールです。

最近、構築や運用を自動化するための様々なツールが出てきています。
構成管理ツールの Puppet や Chef が有名ですが、使うまでに覚えることが多いのが欠点です。
しかし、Fabric は非常にシンプルなツールで、今からすぐに使うことができます。
Fabric はデプロイ・システム管理ツールで、類似のツールとして Ruby 製の Capistrano があります。


Fabric の最大の特長は、シェルスクリプトを書き慣れた人がいきなり利用できるところです。
シェルスクリプトとしてまとめていたコマンドをそのまま run() メソッドや sudo() メソッドで囲むだけで、使うことができます。

シェルスクリプトを使っていていると、いくつもの問題に遭遇します。

  • 名前空間の管理
  • 変数の扱い
  • 複雑なデータ構造がない(せいぜい配列ぐらい)
  • 例外処理


これらの問題に頭を悩ませたことがある人は多いでしょう。
Fabric は Python で記述しますので、上記の問題は全て解決します。

「Fabric = シェルスクリプト + Python + 便利メソッド」

というイメージです。


SIerに勤めていてSE等をされている方は、運用チームのための運用手順書を書いたことがある人も多いでしょう。
その運用手順書の多くは、何らかのコマンドラインを実行する、という記述が書かれているはずです。
Fabric を使えば、その運用手順書を「ほぼそのまま」Fabric のスクリプトに移行できます。

Fabric のインストール

$ easy_install fabric


たったこれだけです。「easy_install って何?」という人は ymotongpoo先生の素晴らしい記事 を参考にしてください。約5分で読み終わり、さらに約5分で easy_install を使えるようになるでしょう。

試してみる(1): yum コマンドを Fabric から実行


例えば、yum コマンドで git をインストールする、という作業があったとします。

シェルを使えば以下のように書けるでしょう。

$ sudo yum -y install git


おそらく、普通の運用手順書では、「サーバAにログインし、以下のコマンドを実行する」という形で書いてあるはずです。
Fabric を使えば、そのような手順書は不要になります。


まず、リモートマシンを1台用意してください。
VM でも構いませんが、Amazon EC2 を使う方が便利です。EC2 を使ったことがないという方は、この記事の末尾で使い方などが記載されている資料のリンクを紹介します。


ここでは、以下のようなサーバ設定を例にとります。
ec2-user は Amazon Linux のデフォルト管理者ユーザで、sudo 権限を持っています。
EC2 上で RHEL を使う場合は ec2-user ではなく root を使ってください。

  • サーバ名: ec2-XXX.ap-northeast-1.compute.amazonaws.com
  • ユーザ名: ec2-user
  • SSH秘密鍵のパス: ~/.ssh/id_rsa


Fabric を使う場合、まず適当なディレクトリを作成し、fabfile.py というファイルを作成してください。
次に、以下の内容を書き込みます。

from fabric.api import sudo

def install_git():
  sudo("yum -y install git")


「え?」と思ったでしょうが、本当にこれでおしまいです。
あとは、fabfile.py の置いてあるディレクトリで、以下のコマンドを実行します。

$ fab -u [ユーザ名] -i [sshの秘密鍵] -H [ホスト名] install_git


先程のサーバ例の場合は、以下のようになります。

$ fab -u ec2-user -i ~/.ssh/id_rsa -H ec2-XXX.ap-northeast-1.compute.amazonaws.com install_git


たったこれだけで、リモートサーバで yum install git を実行することができます。
非常に簡単です!


今回紹介したサンプルスクリプトは、github に公開しています。
こちらも参考にしてみてください。

https://github.com/shiumachi/fabric-sample

試してみる(2): Fabric の価値を体感する


「ただ置き換えるだけならシェルスクリプトのままでいいじゃん」

と思う人のために、Fabric の強力な機能のうちのいくつかをを紹介します。

複数ホストに対して同時に実行


'-H' でホスト名を指定する際にカンマ区切りで複数のサーバを指定することができます。

例えば先程の例で、serverA と serverB に対し同時に install_git を実行したい場合は、以下のように書きます。

$ fab -u ec2-user -i ~/.ssh/id_rsa -H serverA,serverB install_git

複数コマンドを順番に実行


例えば、ユーザ 'hoge' を作成するコマンドを作りたいとします。
シェルスクリプトで書く場合は以下のようになります。

# adduser hoge

これを Fabric で書くと、以下のようになります。

def adduser_hoge():
  sudo("adduser hoge")

シェルスクリプトの場合、先程の git のインストールコマンドと一緒に管理するには、別々のファイルとして保存するか、一緒のファイルにしてしまってバッチ実行するしかありませんでした。

Fabric の場合は、作成したメソッド全てを独立したコマンドとして扱えます。
fabric.py のあるディレクトリで、以下のコマンドを入力してみてください。

$ fab --list

そうすると、現在実行可能なコマンドの一覧が表示されます。

Available commands:

adduser_hoge
install_git

Fabric の面白いところは、一回のコマンドでこれらを任意の順番で実行できるところです。
以下の例のように、スペースを空けて一つづつコマンドを記述していくことで、Fabric はそのコマンドを左から順番に実行していきます。

$ fab -u ec2-user -i ~/.ssh/id_rsa -H ec2-XXX.ap-northeast-1.compute.amazonaws.com install_git adduser_hoge

たったこれだけのコマンドで、「git をインストールする」「ユーザ hoge を作成する」の2つの作業を実行できるのです!

次のステップ


もしこの記事を読んで、「よし、ちょっと Fabric を試してみよう」と思った方に、次にステップのための記事を紹介します。

drillbits 氏の紹介スライド


https://speakerdeck.com/drillbits/fabric-python-developers-festa-2013-dot-03-number-pyfes

Fabric の基本的な使い方についてまとめています。Fabric 入門者は必読です。

Python製デプロイツール Fabricを初めて使う際に役立つTips


http://dekokun.github.io/posts/2013-04-07.html

dekokun 氏による Tips 集です。

最初に読んでもいいですが、ある程度使ってから「こういう書き方したいんだけど、どうすればいいんだろう?」と思ったときに開いてみるのもオススメです。

Fabric デプロイツールのPythonicな書き方


http://www.ianlewis.org/jp/fabric-pythonic

やや古い記事ですが、ianlewis 氏による Fabric の書き方入門。

with cd() の書き方は Fabric での典型的なイディオムなのでオススメです。

公式ドキュメント


最後に、公式ドキュメントを紹介します。

http://docs.fabfile.org/en/1.6/

英語ですが、API のリファレンスとしては必須です。以下の3つのモジュールの API リファレンスは何度も読むことになるでしょう。

  • Operations
    • run, sudo, get, put などの基本メソッドのドキュメントがあります。
  • Utils
    • error, warn などのロギング周りのメソッドについて書かれています。
  • Files and Directory Management
    • append(ファイルに追記)、comment(ファイルの特定の項目をコメントアウト)などのファイル操作周りの便利APIがあります。

付録: Amazon EC2 の使い方

EC2 を使ったことのない人のために、いくつかドキュメントを紹介します。

これらを読めば、EC2 上でインスタンスを立ち上げることができると思います。

これらを読んでもどうしても分からない人はAWSの有償サポートを買ってください
多分人件費分は元が取れると思います。

更新履歴

2013/04/14 17:33 指摘に従い、タイトル及び冒頭の説明を修正