http://www.apache.org/dist/cassandra/debian/ にレポジトリがあったのでapt-getしてみます。
動作環境はubuntu-server 10.04 64bit (on eucalyptus)です。
/etc/apt/sources.listに次の2行を追加します。
deb http://www.apache.org/dist/cassandra/debian unstable main deb-src http://www.apache.org/dist/cassandra/debian unstable main
反映。
$ sudo apt-get update [途中略] W: GPG error: http://www.apache.org unstable Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F758CE318D77295D
とGPGエラーが出ました。ぐぐったところ、以下を実行するとおkのようです(この辺詳しくないのでおかしかったら突っ込んでください)。
$ gpg --keyserver wwwkeys.eu.pgp.net --recv-keys F758CE318D77295D $ sudo apt-key add ~/.gnupg/pubring.gpg $ sudo apt-get update
これでapt-getできます。
$ apt-cache search cassandra cassandra - distributed storage system for structured data $ sudo apt-get install cassandra
起動は
$ sudo /etc/init.d/cassandra start
で。2010/06/24時点で0.6.2がインストールされます。cassandra-cliも使えます。
apt-getで取得できるファイル一覧の見方を忘れたので、とりあえずlocateの結果だけ貼っておきます。
$ locate cassandra /etc/cassandra /etc/cassandra/log4j.properties /etc/cassandra/storage-conf.xml /etc/default/cassandra /etc/init.d/cassandra /etc/rc0.d/K20cassandra /etc/rc1.d/K20cassandra /etc/rc2.d/S20cassandra /etc/rc3.d/S20cassandra /etc/rc4.d/S20cassandra /etc/rc5.d/S20cassandra /etc/rc6.d/K20cassandra /home/ubuntu/.cassandra.history /usr/bin/cassandra-cli /usr/sbin/cassandra /usr/share/cassandra /usr/share/cassandra/antlr-3.1.3.jar /usr/share/cassandra/apache-cassandra-.jar /usr/share/cassandra/apache-cassandra.jar /usr/share/cassandra/avro-1.2.0-dev.jar /usr/share/cassandra/cassandra.in.sh /usr/share/cassandra/clhm-production.jar /usr/share/cassandra/commons-cli-1.1.jar /usr/share/cassandra/commons-codec-1.2.jar /usr/share/cassandra/commons-collections-3.2.1.jar /usr/share/cassandra/commons-lang-2.4.jar /usr/share/cassandra/google-collections-1.0.jar /usr/share/cassandra/hadoop-core-0.20.1.jar /usr/share/cassandra/high-scale-lib.jar /usr/share/cassandra/jackson-core-asl-1.4.0.jar /usr/share/cassandra/jackson-mapper-asl-1.4.0.jar /usr/share/cassandra/jline-0.9.94.jar /usr/share/cassandra/json-simple-1.1.jar /usr/share/cassandra/libthrift-r917130.jar /usr/share/cassandra/log4j-1.2.14.jar /usr/share/cassandra/slf4j-api-1.5.8.jar /usr/share/cassandra/slf4j-log4j12-1.5.8.jar /usr/share/doc/cassandra /usr/share/doc/cassandra/CHANGES.txt.gz /usr/share/doc/cassandra/DISCLAIMER.txt /usr/share/doc/cassandra/NEWS.txt.gz /usr/share/doc/cassandra/README.Debian /usr/share/doc/cassandra/README.txt /usr/share/doc/cassandra/TODO /usr/share/doc/cassandra/changelog.gz /usr/share/doc/cassandra/copyright /usr/share/doc/cassandra/licenses /usr/share/doc/cassandra/licenses/antlr-3.1.3.txt /usr/share/doc/cassandra/licenses/avro-1.2.0-dev.txt.gz /usr/share/doc/cassandra/licenses/clhm-production.txt.gz /usr/share/doc/cassandra/licenses/commons-cli-1.1.txt.gz /usr/share/doc/cassandra/licenses/commons-codec-1.2.txt.gz /usr/share/doc/cassandra/licenses/commons-collections-3.2.1.txt.gz /usr/share/doc/cassandra/licenses/commons-lang-2.4.txt.gz /usr/share/doc/cassandra/licenses/google-collections-1.0.txt.gz /usr/share/doc/cassandra/licenses/hadoop-core-0.20.1.txt.gz /usr/share/doc/cassandra/licenses/high-scale-lib.txt /usr/share/doc/cassandra/licenses/jackson-core-asl-1.4.0.txt.gz /usr/share/doc/cassandra/licenses/jackson-mapper-asl-1.4.0.txt.gz /usr/share/doc/cassandra/licenses/jline-0.9.94.txt /usr/share/doc/cassandra/licenses/json-simple-1.1.txt.gz /usr/share/doc/cassandra/licenses/libthrift-r917130.txt.gz /usr/share/doc/cassandra/licenses/log4j-1.2.14.txt.gz /usr/share/doc/cassandra/licenses/slf4j-api-1.5.8.txt /usr/share/doc/cassandra/licenses/slf4j-log4j12-1.5.8.txt /var/cache/apt/archives/cassandra_0.6.2_all.deb /var/lib/cassandra /var/lib/apt/lists/www.apache.org_dist_cassandra_debian_dists_unstable_Release /var/lib/apt/lists/www.apache.org_dist_cassandra_debian_dists_unstable_Release.gpg /var/lib/apt/lists/www.apache.org_dist_cassandra_debian_dists_unstable_main_binary-amd64_Packages /var/lib/apt/lists/www.apache.org_dist_cassandra_debian_dists_unstable_main_source_Sources /var/lib/cassandra/commitlog /var/lib/cassandra/data /var/lib/dpkg/info/cassandra.conffiles /var/lib/dpkg/info/cassandra.list /var/lib/dpkg/info/cassandra.md5sums /var/lib/dpkg/info/cassandra.postinst /var/lib/dpkg/info/cassandra.postrm /var/lib/dpkg/info/cassandra.prerm /var/lib/update-rc.d/cassandra /var/log/cassandra /var/log/cassandra/output.log /var/log/cassandra/system.log
ちなみに起動スクリプトはこんな感じ。JXMのポートが8080で決め打ちですね。。。
#! /bin/sh ### BEGIN INIT INFO # Provides: cassandra # Required-Start: $remote_fs # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: distributed storage system for structured data # Description: Cassandra is a distributed (peer-to-peer) system for # the management and storage of structured data. ### END INIT INFO # Author: Eric EvansDESC="Cassandra" NAME=cassandra PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME CONFDIR=/etc/cassandra JAVA_HOME="/usr/lib/jvm/java-6-openjdk/jre" JSVC=/usr/bin/jsvc JVM_MAX_MEM="1G" JVM_START_MEM="128M" [ -e /usr/share/cassandra/apache-cassandra.jar ] || exit 0 [ -e /etc/cassandra/storage-conf.xml ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that returns the applications classpath # classpath() { cp= for j in /usr/share/$NAME/*.jar; do [ "x$cp" = "x" ] && cp=$j || cp=$cp:$j done # Include the conf directory for purposes of log4j.properties, and # commons-daemon in support of the daemonization class. printf "$cp:$CONFDIR:/usr/share/java/commons-daemon.jar" } # # Function that returns 0 if process is running, 1 if not # is_running() { if [ -f $PIDFILE ]; then if ps -p `cat $PIDFILE` &> /dev/null; then return 0 fi fi return 1 } # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started is_running && return 1 $JSVC \ -home $JAVA_HOME \ -pidfile $PIDFILE \ -errfile "&1" \ -outfile /var/log/$NAME/output.log \ -cp `classpath` \ -Xmx$JVM_MAX_MEM \ -Xms$JVM_START_MEM \ -Dcassandra \ -Dstorage-config=$CONFDIR \ -Dcom.sun.management.jmxremote.port=8080 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ $JVM_EXTRA_OPTS \ org.apache.cassandra.thrift.CassandraDaemon if ! is_running; then return 2; fi } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred is_running || return 1 $JSVC -stop -home $JAVA_HOME -pidfile $PIDFILE \ org.apache.cassandra.thrift.CassandraDaemon is_running && return 2 || return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; restart|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 exit 3 ;; esac : # vi:ai sw=4 ts=4 tw=0 et
/usr/share/cassandra/cassandra.in.shの「-Dcom.sun.management.jmxremote.port=XXXX」の設定を変更すれば良い?
これでCassandraのインストールがらくちんになりました!eucalyptus上でがんがん上げてクラスタ作ってみようと思います。
Created at : 2010-06-24 03:03:32
Updated at : 2010-06-24 11:01:16
Category : Middleware::NoSQL::Cassandra
しばらくClojureのコードを書いてみてしっくりきている書き方をオレオレ規約化してメモしていく(随時更新予定)。規約策定者募集!ネタがあれば@makingまで。
(ClassName.)形式。(new書くのメンドイし.ついてりゃ明白)(.method obj)形式。(.とメソッド名が離れていると可読性が悪い。..とか見たくない)%(...)形式、2以上の場合は(fn [x y] ...)形式。(2以上の場合は変数名に意味を持たせましょう)
*warn-on-reflection*をtrueにしてテスト。メソッドを呼ぶオブジェクトを引数に取るときは型ヒントをつけること。defnの中でdef、defnしない。let、letfnで。doしなくても良いlein newでできるもの。{namespace}/core.cljがメイン。{namespace}.cljがメイン。(この辺はまだしっくりきてないけど、、core.cljのほうがいいかな)project.cljの:dependanciesに入れない。開発時にのみ必要なものは:dev-dependanciesに入れない
Created at : 2010-04-05 02:17:09
Updated at : 2010-04-05 02:44:44
Category : Programming::Lisp::Clojure
Clojureの関数の形式は実は
(defn function-name doc-string? attr-map? [parameter-list] conditions-map? (expressions))
です。 doc-string?はドキュメント、attr-map?はメタ情報です。引数の後にあるcondition-map?はなんぞやというと、関数の入出力の条件を設定できるmapです。(Clojure 1.1.0からかな?)
condition-map?の形式は
{:pre 入力値をチェックする条件S式のシーケンス, :post 出力値をチェックする条件S式のシーケンス}
です。例えば、引数が全て正でかつ、関数の結果が10より大きいという条件を付けたい場合、
(defn hoge [x y]
{:pre [(> x 0) (> y 0)]
:post [(> % 10)]}
(+ x y))
という風になります。%には返り値が入ります。
条件を満たさない場合は、java.lang.AssertionErrorが発生します。
(ちなみにleiningen1.0.1のreplのバージョンであるClojure 1.1.0-master-SNAPSHOTではjava.lang.Exceptionでした。。。これはExceptionかErrorかという大きな違いであり、明文化が待たれます)
実行してみると、
user=> (hoge 5 6) 11 user=> (hoge 0 11) java.lang.AssertionError: Assert failed: (> x 0) (NO_SOURCE_FILE:0) user=> (hoge 11 0) java.lang.AssertionError: Assert failed: (> y 0) (NO_SOURCE_FILE:0) user=> (hoge 5 5) java.lang.AssertionError: Assert failed: (> % 10) (NO_SOURCE_FILE:0)
となります。
このままだと常にチェックが走りますが、単純に関数を使う場合を分けたいことがあると思います。次のように書くと、関数の機能とチェック機能を分離させることができ、モジュラリティを高めることができます。
user=> (defn hoge [x y] (+ x y))
#'user/hoge
user=> (hoge 5 5)
10
user=> (defn with-condition [f x y] {:pre [(> x 0) (> y 0)], :post [(> % 10)]} (f x y))
#'user/with-condition
user=> (with-condition hoge 5 5)
java.lang.AssertionError: Assert failed: (> % 10) (NO_SOURCE_FILE:0)
partialで部分適用しておけば、元の関数を同じものを定義できますね。
user=> (def always-condition (partial with-condition hoge)) #'user/always-condition user=> (always-condition 5 5) java.lang.AssertionError: Assert failed: (> % 10) (NO_SOURCE_FILE:0)
エンタープライズを乗っとるには堅牢性が必要になると思います。condition-map?を上手に使うことは乗っ取りの第一歩ですね!
ちなみにここ数回のClojureネタはClojure in Action(MEAP版)を読んで、おおっと思ったことのまとめです。プログラミングClojureとぼくの書いた記事を読んでおけばClojure in Actionはいまのところ不要かもですw
Created at : 2010-03-25 02:08:44
Updated at : 2010-03-25 03:15:05
Category : Programming::Lisp::Clojure