DynamoDBをちらっと触ってます
なんだかBlogをさぼり続けて早数年w
2012はもう少し書き連ねていきたいものだ。純粋に諸事情もあり、今までの10分の1以下しかないのでしょうがないのかも。ああ20代って時間あってよかったんですねw
DynamoDBを触っている。パフォーマンスもそこそこ測定しているけど、データを見る限り予測できるパフォーマンスだという触れ込みは正しくて、その点は今までのNoSQLよりはやりやすい気がしている。そのうちにどこかで公開したいとは思う。もう少しデータを増やしていきたい。
ProvisionThroughputのところは、それなりに癖をおぼえないといけない気はしてる。というのも、テーブルを一度作ると、そこからのIOPSの向上は最高で100%まで、つまり現状の2倍までしか設定できない。
最初の設計段階で想定のIOPSがどの程度かをきちんと想定して測定したうえで、IOPS値を決めておく必要はありそう。そうでない場合は、ExecutionContextのCustomBackoffStrategyなどを設定して、リトライのところでフックしたりとかして、ごにょごにょして徐々にupdateTableするのが良い気がする(あ、Javaの場合)。ExecutionContextは腹にRequestHandlerをかかえているからそことうまく連携すればクライアントだけでもだいぶDynamoの状況をみたり、その他のAWSサービスとの連携・通知が出来そうですが、まだそういうことをしている人が全然いなそうで、その事実はちょい残念。あと、CustomBackoffStrategyをごにょる際はポリシーみたいなものを導入するんでしょうね。ここらへんは設計モデルがだいぶ変わりそうで色々出来そうです。楽しみ。
モデルをそのままモデルで1対1で落とし込めるという事は、S3かなんかに実際のクラスファイルだけおいておいてダイナミックにロードするとかそんなバカみたいな事をするのもありかもw
さて、現在触る時は
で触っているが、その中でもDynamoDBMapperがそれなりに使いやすい気はしてます。アノテーションベースでさらっとモデルを書いて、それを使って基本的なやりとりは出来る。RDBMS+近代的なORMほどいかないけど、結構これで事足りるケースもありそうな気はする。@DynamoDBVersionAttributeでバージョン番号による楽観的ロックも出来る。Atomic counterが内部であるので出来るってことですかねー。あと、Eclipseツールキットも大分使いやすくなっていて、開発者の人は楽そうです。
まあしょぼコードだけども、以下のとおり。あ、事前にデータはいれておいてくださいねっと。
正直モデルはアクセサなしでもいいんじゃと思うけど、Java流儀に従った格好ですかね。
import java.util.Set; import com.amazonaws.services.dynamodb.datamodeling.DynamoDBAttribute; import com.amazonaws.services.dynamodb.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodb.datamodeling.DynamoDBRangeKey; import com.amazonaws.services.dynamodb.datamodeling.DynamoDBTable; import com.amazonaws.services.dynamodb.datamodeling.DynamoDBVersionAttribute; @DynamoDBTable(tableName = "Thread") public class ForumThread { String forumName; String subject; String message; String lastPostedBy; String lastPostedDateTime; Long views; Long replies; Long answered; Long version; Set<String> tags; @DynamoDBHashKey(attributeName = "ForumName") public String getForumName() { return forumName; } public void setForumName(String forumName) { this.forumName = forumName; } @DynamoDBRangeKey(attributeName = "Subject") public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } @DynamoDBAttribute(attributeName = "Message") public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @DynamoDBAttribute(attributeName = "LastPostedBy") public String getLastPostedBy() { return lastPostedBy; } public void setLastPostedBy(String lastPostedBy) { this.lastPostedBy = lastPostedBy; } @DynamoDBAttribute(attributeName = "LastPostedDateTime") public String getLastPostedDateTime() { return lastPostedDateTime; } public void setLastPostedDateTime(String lastPostedDateTime) { this.lastPostedDateTime = lastPostedDateTime; } @DynamoDBAttribute(attributeName = "Views") public Long getViews() { return views; } public void setViews(Long views) { this.views = views; } @DynamoDBAttribute(attributeName = "Replies") public Long getReplies() { return replies; } public void setReplies(Long replies) { this.replies = replies; } @DynamoDBAttribute(attributeName = "Answered") public Long getAnswered() { return answered; } public void setAnswered(Long answered) { this.answered = answered; } @DynamoDBAttribute(attributeName = "Tags") public Set<String> getTags() { return tags; } public void setTags(Set<String> tags) { this.tags = tags; } @DynamoDBVersionAttribute(attributeName = "Version") public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version; } }
import java.util.Arrays; import java.util.List; import com.amazonaws.services.dynamodb.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodb.datamodeling.DynamoDBQueryExpression; import com.amazonaws.services.dynamodb.model.AttributeValue; import com.amazonaws.services.dynamodb.model.ComparisonOperator; import com.amazonaws.services.dynamodb.model.Condition; public class MapperMainForHashAndRange { public static void main(String[] args) { DynamoDBMapper mapper = new DynamoDBMapper(Util.createClient()); ForumThread ret = mapper.load(ForumThread.class, "Amazon DynamoDB", "DynamoDB Thread 1"); System.out.println("1st:" + ret + "(" + ret.getVersion() + ")"); ret.setMessage("DynamoDB thread 1 message:" + System.currentTimeMillis()); mapper.save(ret); ret = mapper.load(ForumThread.class, "Amazon DynamoDB", "DynamoDB Thread 1"); System.out.println("2nd:" + ret + "(" + ret.getVersion() + ")"); DynamoDBQueryExpression exp = new DynamoDBQueryExpression( new AttributeValue().withS("Amazon DynamoDB")); { Condition rangeKeyCondition = new Condition(); rangeKeyCondition.setAttributeValueList(Arrays .asList(new AttributeValue("DynamoDB Thread 1"))); rangeKeyCondition.setComparisonOperator(ComparisonOperator.NE); exp.setRangeKeyCondition(rangeKeyCondition); } try { List<ForumThread> result = mapper.query(ForumThread.class, exp); if (result != null) { for (ForumThread c : result) { System.out.println("return from query:" + c); } } } catch (Exception e) { //logging and throw error... } } }
現状やっている範囲がプリミティブなことしかしていないので、それであれば低レベルAPIも高レベルAPIもあまりパフォーマンスに影響がでていない。大がかりにやれば変わってくるだろうけども、ささっと始める分には非常によいんじゃないかと思うです。
入門Amazon SimpleDBプログラミング
Amazon SimpleDBプログラミングを買ってみました。
結論から言えば、SimpleDBの基本を知るには良い本だと思いました。SimpleDBにありがちな誤解(パフォーマンスが自動的に解決されるとか、RDBMSを置き換えるものだとか)をきちんと解いていて、SimpleDBとは何か、SimpleDBとは何ではないのかを書いてある点はとても好感がもてました。全般的にも必要と思われる点を広くカバーしている点は良いです。
良かったと思うところ
あまり良くなかった点
- 使っているツール類がやや古い印象。JavaならTypicaではなく、AWS SDKのほうが(多分)使われてそう。出版時期の問題なのでしょうがないとは思うのだけど。
- 制限回避のための手法は書かれてはいるけど、もう少し具体的な部分が欲しかった。
- パフォーマンスをどうあげるか、エラー回避の部分ももうちょい欲しい。次作でAdvanced SimpleDB書いてほしい。
- 翻訳が一部おかしいかも。端点->エンドポイントのままでよかったのでは^^; 理解はできるので大丈夫です。
とはいえ総じてSimpleDBをこれから始めるなら入門として良いと思いました。
大体気にしなくてはいけないトピックは入っているので、あとはコードを書いて検証して、
より良いやり方・自分にあったやり方を見つけて行くというのが良さそうです。
というわけでアフィリエイトはってますので、よろしければ。
s3fsを使う
ブログ書くのひさしぶりですが、自分の備忘録です。
s3fsを使うのと、ApacheのDocumentRootにするのをCloudPackの後藤さんが出来たといってたので
それに便乗して僕もやってみる。ていうかやってみたい。
OSはUbuntuで。
インストール
まずは前準備。
sudo aptitude update
sudo aptitude install build-essential libcurl4-openssl-dev libxml2-dev libfuse-dev comerr-dev libfuse2 libidn11-dev libkadm55 libkrb5-dev libldap2-dev libselinux1-dev libsepol1-dev pkg-config fuse-utils
本体のインストール
なんだか最新のでは動かなかった(おそらくFUSEのバージョン問題)ので、
少し古いバージョンでインストール。
wget http://s3fs.googlecode.com/files/s3fs-1.19.tar.gz
tar xvzf s3fs-1.19.tar.gz
cd s3fs-1.19/
sudo ./configure
sudo make
sudo make install
確認。
設定
# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#
#mount_max = 1000# Allow non-root users to specify the 'allow_other' or 'allow_root'
# mount options.
#
user_allow_other
ここはお好みで。
次にpasswd-s3fsを作成する。これは/etcかユーザのホームディレクトリに.passwd-s3fsとして作成しても可能のよう。
今回は/etc/passwd-s3fsを作成。中身はアクセスキー:シークレットキーというフォーマット。
passwd-s3fsは適切な権限でみえるようにしておくこと。
マウントポイントの作成とマウント
試しにApacheのDocumentRootでアクセスさせようとしてるのでユーザをwww-dataにしておく。
sudo mkdir /mnt/s3
sudo chown www-data:www-data /mnt/s3
s3fsでマウント。
use_cacheとかdefault_aclなんかのオプションなどは適宜つける感じで。
sudo -u www-data /usr/local/bin/s3fs YOUR_BUCKET /mnt/s3 -o allow_other
とりあえずこれで機能する。
あとはApache側の設定でDocumentRootを/mnt/s3にした後に、ためしにindex.htmlをコピーしてみてみる。
sudo -u www-data cp -p /var/www/index.html /mnt/s3/index.html
でhttpアクセスする、と。ここまででとりあえずうまくいった。
あとはfstabなりinitスクリプトで自動マウントするようにすればよい。
しかし、自分でインストールして思ったがどうもやや安定していないところがあったので
そこはまた今度追求にしときます。
P.S.そうそう思い出した。Macからsshして、s3fsでmountすると何故かリモートログインから出されてしまうっていうのがありました。なんだろう。。。
Amazon Data Services Japanに入社しました。
おはようございます。
2月1日からAmazon Data Services Japanにて働くことになりました。
小島さん、玉川さん、荒木さんをはじめAWSの皆さんと働けるのを楽しみにしています。
職種はソリューションズアーキテクトになります。
本当に今日からなのでおっかなびっくりですが、前向きに頑張っていこうと思います!
皆様引き続きまして宜しくお願いします。
ISIDを1月31日付けで退職しました。
Javaルールブックの宣伝をしたかったので、私事は控えめにしたいところなのですが、
本日付けでISIDを退職しました。お世話になった皆さん本当にどうもありがとうございました。
関わった皆さんに直接ご挨拶できずこのような形になってしまい申し訳ありません。
ISIDには本当に感謝してもしきれないくらい色々な経験をさせてもらいました。
2006年に前職から移ってきて、金融の特定ドメインだけだった私が色々な業態に関われましたし、
また技術の幅も急速に広げる事ができるチャンスを貰えたのも本当に幸運だったと思います。
自分の中の大きな軸がISIDで出来たんじゃないかと個人的には思っています。
本当に出来る人に囲まれた場所は僕は今まで知らなかったですし、その中で勉強させてもらう部分も多数ありました。
ISIDの皆さんと一緒に働けてとても幸せでした。特にひがさんには感謝しています。
ひがさんにはISIDに入る前以上に色々な刺激をもらい、自分の意見や方向性を固める事が出来たように思います。
本当にありがとうございました。他にも御礼を言いたい人は沢山いますが、ここに書くのは控え、
また個別に御礼を言おうと思います。
ISID以外での新しいチャレンジの事は去年前半から実はずっと考えていたのですが、
ずっとあってなかったタイミングが嘘のように昨年後半にあって今回決断することにしました。
ここまで成長させてくれたISIDから離れるのはどうかと悩んだ面もありますが、
現段階なら自分が抜けても組織として大丈夫という安心感があって、自分のチャレンジに踏み切った、
そのような側面は確かに自分の中にあるかなと思います(私が責任者ってわけじゃないんですけど気持ちの問題です)。
組織としてもここ数年で成熟してきて優秀な若手が揃いつつあり、
技術力・カバー範囲の広さが年々広がっているのを見るととても嬉しく思います。
自分の意識としては、現状の能力や年齢(もう33・・・)を考えると更に一回りも二回りも大きくならないと
今後、特に40以降はやっていけないなというのがずっとあって、今回厳しいチャレンジを実行することにしました。
既に持っている技術だけでなく貪欲にスキルを学んで、自分を変えていけるよう・新しい自分を創っていけるよう精進します。
あまり長くなるのも心苦しいのでこれくらいにしておきますが、
今後も同様の業界にいますので、ぜひ今後ともお付き合いいただければと思います。
新しい職場は明日からになります。技術的にもそれ以外でも色々なチャレンジが待っていてとても楽しみです。
(また明日改めてご報告しようと思います。)
それでは。
Javaルールブックの改訂を書きました。
ブログ書くのもあまりに久しぶりでこれというのも恐縮ですが、
エクスメディア社から出ていたJavaルールブックというのをご存知でしょうか?
去年のはじめくらいから仕事としてこの本の改訂に取り組んできて2月にようやく発売されることになりました。
基本的には前回のルールブックを踏襲しつつ、Java5で導入された新機能に対して基本的なルールを記述した内容になっています。
前回の内容は基本的にISID単独で書いていたらしいのですが、
今回は執筆者をオープンソースで関わりのある馴染みあるメンバ(id:yone098, id:c9katayama, id:skirnir)で執筆させていただきました。
執筆者の皆さん・そしてレビューくださった皆さん本当にお疲れ様でした。
内容も書籍としてのボリューム間と内容のバランスを考え、なるべく薄く・ソースコードを多めに載せるように工夫してみました。
また、初心者から中級者の方を対象にしているので、あまりアドバンスドな内容は載せていません。
もしよければお手にとって見てみてください。
JavaはDisられる事も多いですがやっぱり良い言語ですし、まだまだこれからも現役で使われ続けると思います。
そんな中で新しい人がJavaをイヤイヤやるのではなくって、どうせならJavaを好きになって欲しいという思いで書いてみました。
Java開発のプロジェクトを既にやっておられる方、またはこれから始める方に何かしらのお役に立てれば幸いです。
というわけで、奇しくもこれがISID最後のお仕事となったのでした。
(そのご報告のエントリはまたあらためて)
Web+DB PRESS Vol.58でCassandra特集
あついですね。最近夜がめっきりよわくなったshot6です。年ですかね・・・
さて、Web+DB PRESS Vol.58でCassandra特集が掲載されていまして
ちょっとだけレビューさせていただきました。献本どうもありがとうございます!
内容としては、Cassandraが出てきた背景、どういう原理で動いているか、運用をどうしていくか、
実際にRailsと開発するときにはどうなるか、まで網羅されている非常にわかりやすく、
かつおさえるべきところはきちんとおさえたすばらしい内容だと思います。
ぜひ読んで、Cassandraに触ってみてください。
Cassandraコミュニティだけでなく、NoSQLコミュニティにとってもこういう記事や
連載が出てくるとよいですね。HBase、MongoDB、kumofsの最新版などもぜひ読んでみたいです。