ひしだまの変更履歴

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

Retzを試してみた

2016-09-18 07:51:15 | PG(分散処理)

Asakusa FrameworkでM3BPを使うAsakusa on M3BPが使えるようになってから、バッチがすごく速くなった(笑)
(どれくらい速くなったのかは、Scala関西Summit 2016で言及するつもり…Scalaじゃないけど(爆))

で、今使っているM3BPマシンはCPUが数十コア・メモリーが数百GBあるんだけど、ほとんどのバッチは100GBもメモリーを使わないので、1台のM3BPマシン上で複数のバッチを同時に(並列で)実行したい。
一部のバッチはM3BPマシンの半分くらいのメモリーを使用するが、2並列なら問題ない。
しかし一律2並列にすると、ほとんどのバッチは最低でも4並列くらいいけるのに勿体ない。
また、今はM3BPマシンが1台だけだけど、複数台になったら、空いているマシンを探してそこでバッチを実行するような仕組みがあると嬉しい。

というわけで、そういった制御をしてくれるのがRetz。ジョブをキューイングして実行するツール。
クラスター(複数サーバー)のリソースを管理し、ジョブ実行に必要なリソースが空いているマシン上でジョブを実行してくれる。(リソース管理にはApache Mesosを使っている)
(リソースに関するジョブスケジューリングと呼べるかもしれないが、普通ジョブスケジューラーと言ったらジョブを時刻起動させるツールというイメージなので、それとは違う) 

今はまだRetzのバージョンは0.0.x、つまり0.1にもなっていないのでまだまだ変わっていくと思うけど、現時点でのインストール方法使い方をまとめてみた。
Retz自身はAsakusaバッチ専用というわけではないので汎用的に使えるはずだけど、自分としてはAsakusaバッチで使う想定。 

コメント
この記事をはてなブックマークに追加

Spark or SerializationUtils or HashMapのバグ

2016-07-31 15:19:48 | PG(Java)

すべて伝聞なんだけど、面白い(興味深い)バグの話を聞いたので、メモしておく。
バグに関する話なので、本来はバージョンをちゃんと書くべきなんだけど、伝聞なので具体的なバージョンは書けないので悪しからず。

事の発端は、Sparkのジョブがたまに止まる(返ってこない)という事象が起きたことらしい。
この状態のStackTraceを見るとjava.util.HashMapのputメソッドで起きていたらしい。実行環境はJava7。これが起きるとCPU使用率が異様に高くなる。
つまり、@ITの『ThreadとHashMapに潜む無限回廊は実に面白い?』と同様の無限ループが起きていた模様。

で、Sparkはcommons-lang(lang3)のSerializationUtils.clone()を呼び出しており、そこでHashMapがスレッドセーフでない使われ方をしていたのが原因らしい。
(SerializationUtilsのソースはたぶんこれ。cloneメソッドの中でClassLoaderAwareObjectInputStreamインスタンスを作ってるんだけど、そのコンストラクター内でstaticフィールドのHashMap(primitiveTypesという変数名)にputしている。SerializationUtilsクラスには#ThreadSafe#というコメントがあるんだけど、スレッドセーフじゃないやんけ!(苦笑)
(ちなみに既に修正のプルリクエストは送られている)
(SerializationUtils.clone()は、最初の頃は別の実装(serializeしてdeserializeする)だったので、スレッドセーフだった模様)


で、個人的興味の1番目としては、「これは何のバグ(と言われるのか)?」ということ。

Spark使用中に起きたことなので、Spark利用者から見るとSparkのバグである。
しかし実際には、Sparkから利用しているユーティリティーのバグである。
StackTraceを見るとHashMapのバグに見えるかもしれない。

実はjava.util.HashMapのソースは、Java7とJava8では大幅に異なっている。
putメソッドを見た感じでは、今回のような無限ループがJava8で起きる可能性はかなり低いと思う。(スレッドセーフでないことに変わりはないので、変な結果にはなり得る。特にputし終わった後のsizeメソッドの結果は実際にかなりの頻度で変になる。無限ループにはなりにくい(ならない?)だろう、というだけ)
なので、もし実行環境をJava8に変えて試したとしたら同様の事象はほぼ起きなかったと思われるわけで、Java7のバグと見做されたかもしれない。

(なお、HashMapは明確にスレッド非セーフと謳われているので、スレッドセーフでない使い方をする方が問題である。HashMapで変な挙動をしていると思ったら、マルチスレッドで呼ばれてないかを確認するのが常道)


もうひとつの興味は、バージョンアップの問題。

SeralizationUtilsの変更履歴を見ると、最初はスレッドセーフだったのが、途中でスレッドセーフでなくなった(バグが入り込んだ)ようだ。
SparkがいつからSerializationUtilsを使い始めたのかは知らないが、最初は問題なかったのに、ライブラリーのバージョンを上げたら問題になった、ということなのかもしれない。
マルチスレッドの問題だけに、Spark側で少々テストを行ったくらいでは発覚しない可能性も高い。

やはりバージョンアップは難しいことだ、と改めて認識させられた。


あと、commons-lang内でのレビュー方法はどうだったのか、という問題もありそうではある。

マルチスレッドの問題が起きてからこのソースを見ると一目で問題あると分かるけれど、そうでないときにこの修正を見て問題があると分かるのは相当熟練者のような気も。
てゆーか、commons-langくらいのものなら、相当の熟練者にレビューして欲しい^^;


(追記1)こういう調査が出来るので、オープンソースは素晴らしいw
(追記2)@ITの記事を昔見ていたおかげで、HashMapで無限ループという事象がすんなり納得できた。障害の事例を公開してくれるのはほんとありがたいです。 

コメント
この記事をはてなブックマークに追加

AsakusaFW 0.8.1 チュートリアル

2016-07-31 13:28:55 | PG(分散処理)

2016/7/26にAsakusa Framework0.8.1がリリースされた。→リリース情報
あわせて、Asakusa on Spark 0.3.1とAsakusa on M3BP 0.1.2もリリースされている。
従来のAsakusaFW(Asakusa on MapReduce相当)とon Spark・on M3BPは別バージョンで管理されているので、ちょっと違和感があるけど、要するにどれも新しくなったということ^^;

とりあえず目新しいのは、ドキュメントとして、Asakusa Frameworkチュートリアルが作られたこと。
Asakusaアプリケーションを作る手順に沿って、サンプルを実際に作るという態で書かれている。
自分のWordCountのサンプルもそれに近いんだけど、さすが公式の方が綺麗・丁寧(笑)

AsakusaFW 0.8.1としては、Direct I/Oで出力レコード数やバイト数がログに出るようになったのが嬉しい。
今まではMapReduceやM3BPのログを見る必要があった。

あと、Direct I/O line(0.7.5で導入されたがsandboxの機能だった)が正式機能になった。
使い方は特に変わっていないけれど、build.gradleにsandboxのdependenciesを記述する必要が無くなった。

Asakusa on Spark・Asakusa on M3BPについては、バグ修正。
特にon M3BPについてはcom.asakusafw.m3bp.output.buffer.sizeが反映されないというバグがあって地味に困っていたが、直ったw 

コメント
この記事をはてなブックマークに追加

【DQ10】180スキルサポでブルメル撃破

2016-05-28 14:55:35 | ゲーム

ドラゴンクエスト10のver3.3前期で装備の180スキルと90レベル武器が追加になり、そのおかげで青の巨人ブルメル(通称青きのこ)をサポート仲間で倒せた!

氷の領界のボスはなかなか強くて、最初のボスもver3.2前期時点の最大レベル90では倒せず、ver3.2後期のレベル上限解放でレベル93になってから倒せた。
次に青きのこで止まってたんだけど、今回180スキルと新装備で倒せた。
コンピューターRPGは、ボスが強ければレベル上げ(経験値稼ぎ)や強い装備を買ったり(金稼ぎ)して挑戦すれば(つまり時間をかければ)クリアできるところがいいと思ってるんだけど、今回はまさにそのパターン。(とはいえ、DQ10はバージョンアップ期間が長いけど^^;) 

構成は、自分が僧侶(レベル92、スキルはスティックと盾に180ポイント振ってある)で、サポが魔法戦士(片手剣)・レンジャー(ブーメラン)・賢者。なお、これはピラミッド攻略用に雇ったサポ(笑)
ピラミッド1~6層はフレンドのサポート仲間(レベル90前後)で勝てるんだけど、7層は眠りガード100%の93レベルサポを雇って行っている。その後で経験値稼ぎにも出かける為、継戦能力(MP回復)重視で魔法戦士やレンジャーを入れているわけ。(ちなみに8~9層は行かない(8は1回だけ勝ったことがある、9は行ったこともない))
つまり全く青きのこ用の耐性じゃないんだけど、依頼書の討伐でポポリアきのこ山に行ったので、ついでに青きのこにも行ってみたところ、2回の挑戦で勝てた!

雇ったサポを見てみたら、魔法戦士の武器はレベル90のはやぶさの剣改+3(失敗なし品!高いだろうに)、盾もレベル90の盾だった。スキルは不死鳥天舞IIIだったし、レンジャーもレボルスライサーIIIを持っていた。

青きのこは分身するまでにいかにHPを削るかが重要なので、大ダメージの出る新特技が追加になったことで、ダメージの蓄積が速くなったのが効いたと思う。
つまり、通常攻撃1と特技2・特技3を持っている場合、攻撃パターンは
1+1+2+3 +1+1+2+3 +1+1+2+3
みたいになるけど、特技4が追加になれば、
1+1+2+3+4 +1+2+3+4 +1+2+3+4
みたいになって一定時間内のダメージが増えるという理屈。
今回の挑戦では、1回目はHPが黄色くなってから分身して4匹まで増えたけど、全部HPを赤にするところまでは行けたし、2回目はHPが赤くなってから初めて分身という状態で、分身した奴もすぐ倒せた。
やはりこれは新特技(と新しい武器)のおかげと言えるだろう! 

その後そのまま赤きのこと緑きのこにも行ったけど、初見で勝ててしまったw
敵が1匹しか出ないボスでは、聖女の守り(やキラキラポーン)をまいとけば安定するので楽でいいわ~(自分が死んで危ない場面はあったけど)。なお、余裕が出たときに新特技のアイギスの守りIを使ってみたけど、どれくらい意味があったかは不明(爆)

そして経験値がいっぱい入るもんだから、僧侶がレベルカンスト。カンストするとその職業でプレイする機会が減るので、あまり嬉しくない^^;(経験値が入らないとやる気が出ないんだよねー。職人もカンストしたら転職してるし、釣りもカンストしてからやってない) 

コメント
この記事をはてなブックマークに追加

SIは楽しいよ!(状況による)

2016-04-15 02:12:27 | プログラミング

今週バズった話題:富士通を退職した話「SIer が天職です」って人はどこにいるの?に関連してあるツイートを見かけたので、Asakusa Frameworkを使っている身としては反応せねばなるまいっ。
「AsakusaFWを使うSIは楽しいよ!」w(ステマ)


まぁ冗談は置くとして、自分が今勤めている会社はAsakusaFWを扱っている会社であってSIerではありませんが、自分がやっている仕事はお客さんのシステムのバッチをAsakusaFWで作ることなので、SIと言えると思います。

つい先日Asakusa on M3BPが出たので、今はその検証をやっています。バッチの種類によるけれども、実行時間がAsakusa on Sparkより2~10倍(平均3~4倍)くらい速くなったので、とても楽しいですw
AsakusaFWはアプリケーションのソースを変更せずにHadoopSpark・M3BP用の実行バイナリーを作れる点が素晴らしい。(データサイズに応じて実行環境を変えるという運用が簡単に出来る)
(ちなみに、書いたアプリケーションがソート順に依存していたり、想定外データ(マスターなのに同一キーで複数レコードあったりorz)があったりすると実行環境によって違いが出てきます。自分が作った部分からバグを発見するとへこみますねorz 他人のバグを見つけるのは楽しいんですが(爆))

ただ、こういうことが出来るのは、仕事内容(お客さん)次第だろうとは思います。


自分は、今の会社に転職する前は、典型的なSIerに勤めていました。 
SIerにも当然すごい人は居るんですが、あまり表に出てこないと思います。

例えば、自分がJavaを教わったと思っている人が3人いますが(その人達は、Struts1が出るか出ないかの頃にウェブフレームワークを作っていた)、たぶんTwitterとかはやっていないと思います。ある人は、自宅にPCを持っていないと言っていました。会社でさんざん触ってるから、家では触りたくないって^^;
あと、管理職でも尊敬できる人がいました。自分はリーダーとか向いてないので、ああいう人はすごいなぁと思います。でも堅い会社で堅い立場だと、自由に情報を発信したりはしないでしょうね。

そういう訳で、SIerが天職だという人がいても、外からそういう人を知る機会はあまり無さそうな気がします。

ちなみに自分はホームページとか書いていて今の会社の人の目に留まったので、転職したいなら、やはり人に存在を知ってもらえるようなことをした方が良いと思います。(自分のホームページは、転職目的で始めた訳ではないですが^^;)


SIer自体は、システムを作るのが本業ではない会社(プログラムを書けない人)の代わりにシステムを作る(プログラムを書く)仕事なので、その存在自体は至極自然のものだと思います。

が、日本では立場が強い方(お金を払う方)が立場の弱い方に無理難題を言う傾向があり、それがSIerの仕事をつらいものにしている気がします。まぁ、SIerに限った話ではないと思いますが…。

だから、発注者・受注者の関係であっても、お互いに尊重しあって仕事が出来るなら、楽しく(というか不必要に嫌な思いをせずに)仕事が出来ると思います。信頼関係大事。

ちなみに、SIer時代はNTTデータさんとよく仕事をさせていただきました。
NTTデータの人はやはり基本的にプログラムを書かない(あまり書かせてもらえない模様)ですが、顧客との折衝・仕様確定やスケジュール管理・受け入れ試験等はきちんとやっていた印象があります。(その為の資料作りは大変でしたけどね^^;)
一方、○○通は友人が(SI部門ではないけど)就職したので話を聞いたこともありますが(以下略)。社名は誰でも知っている大企業なだけに、新卒の人からすると魅力的に見えるんでしょうねぇ。
(個人的に、富士通は昔からあまり好きではないんですよねー。X68000のライバル、FM-TOWNS!w) 


蛇足ながら、今自分が勤めている会社は、PCは好きなOSでよい、ディスプレイも大きいのが2~3台、ノートPCも貸与、背広じゃなくていい、出勤時刻がほぼ自由、お昼ご飯の時間も自由(たいてい店が混んでる時間帯を避ける)、基本的に1日8時間だけど用事(勉強会とか)があるときに早退しても問題ない(申請とか不要)、疲れたら昼寝してもいい、ももクロのコンサートへ行く為に有休をとるのは当たり前(?)(注・僕のことではありません。なお、ゲームが発売されたときに有休をとるのは当たり前でしょうw)等、環境面でもとても働きやすいです。

という訳で、プログラムを書く仕事は、とても楽しいですよ!
(しかし、やはり一般的なSIerが楽しいとは言いづらい(苦笑)) 

コメント
この記事をはてなブックマークに追加

AsakusaFW0.8.0 M3BP、Spark IterativeBatch

2016-04-13 01:46:54 | PG(分散処理)

2016/4/8にAsakusa Framework0.8.0がリリースされていた。→リリースノート

AsakusaFW0.8.0では、まず、対応プラットフォーム(バージョン)がけっこう変わった。→互換性に関して
JDK1.6が非対応になったり、Hadoop1系が非対応になったり、Gradle1系が非対応になったり、Mavenが非対応になったり。


build.gradleの書き方もけっこう変わった。→0.8系の変更点
wrapperの指定が不要になったり、apply pluginで指定するプラグイン名が変わったり。
EclipseだけでなくIntelliJ IDEAにも対応したようだ。

Hadoop1系が非対応になったので、asakusafwVersionのバージョン体系も、AsakusaFW0.7でhadoop1やhadoop2を付けるようになったのが、再び不要になった^^;
というか、AsakusaFWのバージョンはAsakusa on SparkやAsakusa on M3BPのバージョンから自動的に判別されるようになったようで、asakusafwVersionは明示しなくなった。

そして、Gradleコマンドに、(build.graldeにAsakusaFWのバージョンを書かなくなったので)バージョンを確認するためのタスク(asakusaVersion、略すときはaV)が追加になっている。

あと、Hadoop(MapReduce)版バッチを生成するためのタスク名がcompileBatchappからmapreduceCompileBatchappsに変更になった。
Asakusa on SparkのコンパイルタスクがsparkCompileBatchapps、Asakusa on M3BPがm3bpCompileBatchappsなので、統一されたということだ。
DMDL EditorXも対応済み) 


Asakusa on Sparkも変更があって、今までは開発者プレビュー版だったが、今回(Asakusa on Spark 0.3.0)から正式版となった。
Asakusa on Sparkのリリースノート 

そして、Iterative Extensions(反復機能)が追加になった。(試験的機能扱い)
これは、実行時の引数の値を複数指定して、1バッチとして同時に実行するもの。リソースを効率的に扱えるので、個別に引数を変更して複数回バッチを実行するよりも、全体として実行時間が短くなる(ことが期待される)らしい。

この反復機能の為に、AsakusaFWの歴史上初のAsakusaDSLの拡張(@Iterativeアノテーションの追加)が行われたそうだ。

ただし、このアノテーションを付ける必要があるので、今までのアプリが無修正で反復可能になるわけではない。 


そして今回最大の目玉が、Asakusa on M3BP
M3BPは、フィックスターズ社が開発した、単一ノード・マルチコア用のデータ処理エンジン。

今までは、SparkやHadoopで処理するには小さいデータ(数十GB程度)だと、YARNを起動したりする時間(いわゆるHadoop税)が相対的に大きかった。そういう小さいデータの処理をターゲットにしているのがM3BP。
1台のサーバー上で、完全にオンメモリーで動作する。(データがメモリーに乗り切らなかったら落ちるらしい。そういうサイズのデータならAsakusa on Sparkで処理すればいいという考え) 

要するに、M3BPは単一ノード上でマルチスレッドで動作する処理エンジンだと思う。
だが、Javaのスレッドではなく、ネイティブスレッドで動作するので、Javaより速いらしい。

AsakusaFWでこれを扱えるの、すごく画期的だと思う!
例によって、AsakusaDSLのコンパイルのみでMapReduce版・Spark版・M3BP版が切り替えられるし^^

コメント
この記事をはてなブックマークに追加

ドラクエビルダーズ自作風景

2016-03-12 14:53:41 | ゲーム

ドラクエビルダーズで公開用の建物を作った直後は、「後は特に作りたいものは無いなー」と思ってたんだけど、なんだかんだでついつい色々作ってしまったので、作った物をメモ。どういう風にどういう意図で作ったのかも書いた。
(ツイートした分は、Togetterでもまとめてある) 

特に自分のTwitterアイコン(青い八面体)にちなんだものは、自分が知っているものはコンプリート(笑)
ちなみに自分のTwitterアイコンはよくエヴァンゲリオンのラミエルと間違われるけど、違うからw(もちろん飛行石やブルーウォーターでもない)

コメント
この記事をはてなブックマークに追加

ドラクエビルダーズの感想

2016-02-20 19:40:30 | ゲーム

ドラゴンクエストビルダーズ、発売日からやってひと区切りついた感じなので、感想を書いた

自作の建物も事前に思っていたより結構がっつり作ってしまったので(笑)、ギミックを忘れないようにメモしておいた。
建物名『あさくさフレムワーク』
建物のじゅもん:ぜそらしこねたかそふぼいおはつむの
自作建物の紹介(画像・ネタばれあり) 

コメント
この記事をはてなブックマークに追加

AsakusaFW hasとか性能特性とか

2016-02-11 12:38:43 | PG(分散処理)

Asakusa Frameworkがらみのページをちょこっと更新。

まず、Option系クラスhasメソッドなんて便利なものがあったのを知らなかった(爆)

それから、自作のExcelファイル出力ライブラリー。実際にHadoopクラスター上で動かしてみたら、案の定jarファイルが足りなかった^^;
ついでにsrc/main/resourcesに置いたファイルがデプロイメントアーカイブに含まれないというバグを見つけてしまった^^;

あと、演算子には性能特性が記されているんだけど、Map/Reduceの2種類だと思っていたら、AsakusaFW0.7.5からExtract/CoGroup/Join/Foldという分類に変わっていたらしい。全然気付かんかったorz
Map/ReduceはHadoopのMapReduceに即した分類だったんだけど、Asakusa on Sparkが出てきたので、それに対応するよう変えたらしい。 

コメント
この記事をはてなブックマークに追加

Gitで過去のファイルの内容を見る方法

2016-01-30 21:27:43 | PG(CVS・SVN・Git)

Gitで削除した過去のファイルの内容を見る方法、調べたら色々な人が書いていた。毎度ありがたいことです。
で、自分用にメモをまとめた

ついでに、git rmに拠らずに削除したファイルをgit rmの引数に指定する方法も知った。
「git ls-files」なんて便利なコマンドがあったんですなぁ。Git管理下にあるファイル一覧を表示するもの。ちゃんとgitignoreも考慮してくれるようだ。

コメント
この記事をはてなブックマークに追加