ひしだまの変更履歴

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

Java8 日付時刻APIを試してみた

2014-07-21 23:59:59 | PG(Java)

前回までのあらすじ
ジャバ八村でStreamを手に入れた俺たちは、次の目的であるDate and Time APIを探し始めた。


という訳で、Java8のStream(やラムダ式メソッド参照)と並んでもうひとつの目玉である日付時刻APIを試してみた。
(軽く見るだけのつもりが、3連休をほとんど全部使ってしまったorz) 

細かいことをやりだすともっと調べないといけなさそうだが(Clockの使い方とか、これで合ってるんだろうか?)、基本的な使い方はとりあえず充分かな。
DateTimeFormatterも、評判どおりSimpleDateFormatより便利そうだし、速度も速そう。

まぁともかく、Java8で事前に調べたいと思っていたところはだいたい終わった。


日付時刻APIを手に入れた俺たちは、これで当初の目的を全て達成した。
しかしジャバ八村には、まだ知られざるクラスやメソッドが存在しているはずだ。
俺たちの冒険はまだまだこれからだ!
(完)

ていうか、まだ仕事でJava8を使ってないし(爆)
Listを操作しててStream使いてぇ!ってなってたけど、日付を扱うときにもJava8使いてぇ!ってなりそう^^; 

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Asakusa Framework 勉強会 2014夏に行ってきました

2014-07-14 23:59:59 | PG(分散処理)

2014/7/11『Asakusa Framework 勉強会 2014夏』に行ってきました。→Togetter
アンケートによると参加者はAsakusaFW経験者4割(Hadoop経験者は6割)という感じで、まだまだAsakusaFW初心者の人が参加して下さっているようで、嬉しいことです。

最初は恒例、土佐さんの『Asakusa Framework はじめの一歩(ver 0.6.2)』。現時点のAsakusaFWの最新版である0.6.2に合わせたものですね。
前回はライブコーディングによるAsakusaアプリケーションの作成手順の紹介でしたが、今回はスライドによる紙芝居でした。手順を再現していると結構時間ぎりぎりになってしまい、ライブコーディングだと突発的なトラブルがあったときに困りますからね^^;

土佐さんの資料のp.5からのAsakusaアプリケーション用プロジェクトの作成には、AsakusaFW本家のEclipseプラグインであるShafuの機能を使っています。
p.12以降は拙作のDMDL EditorXのウィザードが使われています。ありがとございますw 

全くAsakusaFWを知らない人向けに少しだけ補足しておくと、AsakusaFWではバッチ(ジョブ)の入出力をImporter/Exporterで表します。これはファイルの場合はパス名・ファイル名、RDBの場合はテーブル名等を指定するものだと思えばいいでしょう。
データモデルはファイルレイアウト(テーブルレイアウト)を表すもので、DMDLという言語で記述することにより、Javaのクラスを生成します。
処理を記述する「演算子」では、DMDLから生成したクラスを入出力に使います。

また、2種類のデータモデルを結合(SQLのJOIN相当)したい場合、AsakusaFWでは「結合モデル」というデータモデルを記述します。p.30辺りですね。

p.24で結合キーを指定していますが、左側で2種類のデータモデルのキー項目を同時に選択してコピーすることでも定義できますし、addボタンを押して空の状態から選択することも出来ます。まぁ、いずれにしても言葉では説明しづらいのですが(汗)

p.30で既存モデルにプロパティー(項目)を追加したデータモデルを定義しています。
copyボタンで既存モデルの全プロパティーをコピーしていますが、referenceボタンでモデル名だけをコピーすることも出来ます。こうすると、「output_sales = joined_sales + { flg:TEXT; };」という形式のモデルを定義することが出来ます。
プロパティーの実体としては土佐さんの方法と同じものになりますが、元となるモデルに変更があった場合も追随してくれるという利点があります。

p.43からはImporterクラスを作っています。2つのImporterを別々に作っていますが、複数同時に作ることも出来ます。
ファイル名のところに「$(modelName).csv」と書いておけば、生成されたクラスのファイル名部分がモデル名に置換されます。

p.56からは拙作のAsakusa Toad Editorを使ってジョブフローを作っています。
p.67でImporterを配置していますが、既存のImporterクラスを配置したい場合は、左側のパッケージエクスプローラー上でImporterクラスをドラッグし、ジョブフローのエディター上にドロップすることも出来ます。

p.102でも同様に、バッチに既存ジョブフローを配置したい場合は、パッケージエクスプローラー上のジョブフローのtoadファイル(もしくはジョブフローのjavaソースファイル)をドラッグしてバッチのエディター上にドロップすることも出来ます。

p.116では、Shafuを使ってテストデータ記述用のExcelファイルを生成しています。
ちなみに最近のDMDL EditorXでは、Excelファイルの生成とp.121のテストクラスの作成までウィザードで行うことが出来ますw

こういったDMDL EditorXの(既にDMDLと関係ないし!と言われている)機能もどこかで紹介したいですね~。


2つ目はノーチラス・テクノロジーズ川口さんの『Asakusa Framework 歴史探訪 & ここ最近の新機能』。

AsakusaFWはDSLとテストを一体化して使うよう考慮されており、かつ外部連携も無いとシステムとしては役に立たないので、そこも考えられているとのことです(WindGateやDirect I/O)。

AsakusaFWはおおよそ2~3ヶ月ごとにリリースされてきましたが、DSLはほぼ変わっていないので、バージョンが上がってもマイグレーションは容易になるよう考慮されています。
(実際、バージョンを上げる際、設定ファイルをいじったりする必要はありますが、DSL(プログラム本体)を修正する必要は(たぶん今までは)無かったと思います) 

最初はDMDLは無くてThunderGateのDDLからモデルを作っていたとか、聞いたことはあったような気はしますが、既に忘却の彼方でした^^;
比較的最近AsakusaFWを使い始めた方々にとっては、多少なりとも経緯が分かって面白かったのではないかと思います。

p.10に書かれているParallelJobSchedulerは、AsakusaFWのコンパイル結果である「stage」(Hadoopジョブに相当)を、可能であれば並列に実行するスケジューラーです。
これは実行環境のASAKUSA_HOME/yaess/conf/yaess.propertiesを書き換えることによって使えるようになります。
デフォルトではBasicJobScheduler(stage(Hadoopジョブ)を直列に実行する)が有効になっています。

p.11のDirect I/Oで「クラスター上のデータを使い回す(キャッシュ)」と書かれていますが、この意味は、「バッチ実行開始時に毎回WindGate等でRDBから取ってきてHDFS上にファイルを置く」のではなく、「(以前に)HDFS上に置かれた(キャッシュされた)ファイルをそのまま読み込む」というような意味だと思います。

p.18(AsakusaFW0.6.1)のエミュレーションモードは、フローのテスト実行時にOperatorクラス内でEclipseのブレークポイントを指定して止められる機能です。変数の中身が見られます。超便利ですw

p.13やp.19に出てくるスモールジョブは、Asakusaアプリケーションを書いているとちょくちょく遭遇する問題です。
なにせHadoopはタスク起動に時間がかかる(いわゆるHadoop税)ので、たとえ入力が少量であっても一定時間かかってしまうのです。Hadoop2になるとUberモードというのがあってけっこう速いらしいので、けっこう期待大です。

それと、近日公開予定のAsakusaFW0.7の紹介がありました。
Direct I/Oによる入出力ファイルに、HiveのORCFileやParquetという形式が使えるようになるそうです。(ほんと最近はHadoop上のSQLが流行ですね^^;)


3つ目は、OSSコンソーシアム Asakusa Framework部会の才所(さいしょ)さん。

2010年末(Hadoopが有名になりつつあった頃?)からビジネスになるものを考えて、AsakusaFWに注目したそうです。

AsakusaFWの利点として以下のような点を挙げていました。

  • 教育サービスがある(いざ始めようとしたときになんとかなる(SIerとして嬉しい))
  • 日本語で(日本の文化で)相談しやすい
  • 日本のビジネス時間で進む(海外製だと、最終的には本国に問い合わせたりして時間がかかる) 

ただ、やはりJavaによるAsakusa DSLの初期のとっつきにくさや分散処理固有の設計をしなければならないといった難点もある。開発者も1~2ヶ月で慣れた(壁を越えた)というものの、最初はやはり難しいようです。

Hadoopを知っている人(特にMapReduceで苦労した人)には高評価だそうですが、そうでないと…^^;

しかしバッチを高速化したいという場面は存在するので、ビジネスになるはずだと考えているそうです。

で、Asakusa Framework部会にはビジネスWG(Working Group?)(だったっけ?)と技術WGがあり、技術WGではCDHの基礎データを取ったりしてきたそうです。今後はMapRのデータを取ることもあるかも?

ここからは個人的な感想ですが、AsakusaFWはバッチアプリケーションを作るフレームワークなので、試すのにもちょっと敷居が高い。例えばウェブフレームワークだったら「個人的にちょっとサイトを作ってみるか」といった試し方も出来るでしょうが、「ちょっと個人的な分散処理バッチを作ってみようか」なんて、そうそう無いですよね^^;
そういう意味では、個人以外に、ビジネスWGのような形で企業として集まって色々検討していただけるのは向いているのではないかなーと思います。


4つ目はアクセンチュアの福垣内(ふくがうち)さん・広島県出身。

ウェブサイトの分散分析基盤をEMR+AsakusaFWで作ったそうです。

もともとRDBで分析していたけれども数千万件ではそろそろ厳しい、高価なBIツールまでは不要、ということでHadoopは集計が得意なのでHadoopを使うことにしたそうです。

他にRedShiftやHANA・Oracleも検討し、リアルタイムで見たい場合は有利だけれども、初期導入費用が高い(RedShiftも1ヶ月で70万円とか!)ので、見送ったようです。

Hadoopシステムの構成としては、MySQL→S3→EMRで集計→S3→MySQLという、ある意味鉄板な構成でしたw
当初はWindGateでMySQLにアクセスしたようですが、遅かったのでDirect I/Oにしたそうです。(その参考にした資料がこれだとしたら、役に立って嬉しいのですがw)
1人が2週間くらいでこの環境を作れたそうです。
ちなみにオンプレミスでHDFS・HBase・Hive・Pigの環境を作るのには1ヶ月ほどかかり、今後のメンテナンス性を考えて現在の環境を選択したそうです。

(Eclipseは色々言われるけれども^^;)普通のプログラマーはやはりEclipseを使うので、その点も良かったようです。

AsakusaFWに関しては、やはりトレーニングを受けていないと用語や演算子・機能のとっかかりが難しいようです。
そういうのは個人のブログで説明したりするのも大変なので、難しいですねorz

今後はSparkとの使い分けなども考えていくそうです。

そういえば質問しそびれたんですが、よくある集計処理だとそれこそHiveでやっちゃったりしそうな気がするんですが、AsakusaFWを選んだ理由(あるいはAsakusaFWを選んでHiveより良かった点)は何だったんでしょうね?


次回は『2014秋』、の前に『真夏』をやるそうです。
そうきたか!w

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Hadoop Conference Japan 2014の感想(総括編)

2014-07-10 23:13:30 | PG(分散処理)

Hadoop Conference Japan 2014(HCJ)で自分が聞いた講演の個々の感想はブログに書きましたが、それとは別に全体として思ったことがあるので書いておきたいと思います。

簡単に言うと、「最近のHadoopの利用事例はどうなっているんだろう?」
もう少しくだけて言うと「皆はHadoopをどう使おうとしているんだろう?」ということです。


今回のHCJの各講演の題目を見る限り、YARN・SQL・Sparkの話題が多かったと思う。
Hadoopの主要な仕組み自体は今後YARNになっていく感じなので、YARNの話が出てくるのは分かる。
しかし、SQL関連がこんなに活発なのが個人的には驚き。

SQLは対話型ツールで使うのにはとても向いていると思う。
一度の操作ではあまり複雑なことをしない(何十ものSQL文を発行することは無い)だろうし、SQL文にエラーがあってもその場で直すことが出来る。
これに対し、バッチアプリケーションでSQLを使うのには昔から疑問を感じている。
バッチアプリケーションで使うなら、SQL文にエラーがあったらアプリケーションのコンパイル時に分かって欲しいと思うのだが、プログラム内にSQL文を文字列で埋め込むという方式では、コンパイル時のチェックなど望むべくも無い(そういうチェックツールもあったかもしれないが)。
静的なSQLならコンパイル時に解析してくれると実行時のオーバーヘッドは減るはずだが、実際には実行時にパースされることになる。
一方、プログラムでSQL文を構築する方法を採ると、実際に実行してOKだったSQL文をそのまま記述するということは出来なくなる。
どちらも一長一短^^;

RDBでデータを管理するシステムでは、基本的にSQLでしかデータにアクセスできないので、バッチアプリケーションであってもSQLを使うのは当然だ(というか他の選択肢が無い)と思う。しかしHadoopはファイルを扱うので、SQLである必要は無いはず。
(バッチアプリケーションがSQLから離れられるチャンス!w) 

ストリーミング処理のようなリアルタイムっぽい使い方をしたい場合は従来のMapReduceでは遅いので別の方式が欲しいというのは分かる。
また、得られた結果を見たいという用途ではSQLも便利だと思う。
(セキュリティー関連でテーブルの行・列ごとのアクセス制限がしたいという話も、ユーザーが直接データにアクセスする場合には確かに必要な機能だと思う)
しかし、これらの使い方は、自分が思うような「バッチ処理(バッチアプリケーション)」ではない。

自分が作ったあるバッチ(Asakusa Frameworkで作ったアプリケーション)は、Hadoopジョブに変換すると100ジョブを超えている。AsakusaFWではいくつかの演算子をまとめて1つのHadoopジョブが作られるので、演算子の個数は2~3倍あるはず。
もしSQLで作るとなると、AsakusaFWの演算子1つが概ねSQL1つになるだろうから、数百のSQL文を書かないといけない。(処理の重複も多いのでもっと減らせるかもしれないが、逆にエラー処理を行うSQL文を追加しないといけないかもしれない)
複数のSQL文にまたがった最適化など行われないだろうからバッチ全体として実行効率が落ちる気がするし(Impalaなら個々のSQLの実行が速いらしいので、トータルでも速いかも?)、そもそもそれらのSQLをそれぞれ単体テストするのは、想像するのも嫌だ^^;(AsakusaFWの演算子は普通のJavaのJUnitでテストを書ける)

つまり、Hadoopを使った複雑なバッチアプリケーションを作ろうと思ったらSQLを使う必要は無いし、Hadoopはもともとバッチ処理向けだったと思う。
にも関わらずSQLが欲しいというのは、バッチとは異なる使い方をしたいという事なのだろうか?
もしくは、少数のSQLで済む程度の処理しかしないという事だろうか? 


もうひとつ注目を集めているのがSpark。

自分がそもそもHadoopに注目したのはバッチを分散処理させる(ことによって高速化する)という点だったので、それと同じ意味で、Sparkもバッチアプリケーションを作るのに使えるかもしれないと思って注目している。

なんと言っても、SparkはScalaでコーディングできるという利点があるし!(利点ですよ、これはw)

しかしながら、Scalaは日本では(SIerには)普及しているとは思えないので、日本でSparkが注目を集めている理由(何に使おうとしているのか)がよく分からない。
Spark SQLなんてものもあるようなので、やはり少数のSQLで出来る程度の使い方を想定しているのかなぁ?


Hadoopが出た当初は、Hadoopの利用事例も盛んに発表されていました。
今となっては(Hadoop界隈では)Hadoopを使うのは当たり前なので、最近では利用事例を(自分は)あまり聞かなくなっていましたが、最近のHadoopの使い方は昔とは異なるのでしょうか。

HCJのアンケートでも、利用しているエコシステムにHBaseやFluentdが上位に来ていましたが、全く予想外でしたし。
自分はSIer出身なので、Hadoopの使い道もSIerっぽいバッチを考えていましたが、(アンケートは無かったと思いますが)HCJの参加者もSIerでない人たちが多いのかも…?  

そういう訳で「他の人たちはどういう使い方をしたいと思っているのかなぁ」という疑問を強く感じたのが、今回のHCJ全体を通しての感想でした。

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Hadoop Conference Japan 2014の感想(個別編)

2014-07-08 23:59:59 | PG(分散処理)

Hadoop Conference Japan 2014(HCJ)に参加してきました。
各講演の内容はたぶん公開される資料を見る方が確実だと思うので、感想だけ書いておきたいと思います。

まず、基調講演から。
Hadoopカンファレンスの参加登録人数は去年より100~200人くらい増えているが、初参加が65%とのこと。まだそんなに初参加の人がいるとは驚き。
Hadoop利用経験年数は順当に伸びている模様。 

Hadoopのバージョンの話も出ていたけれど、0.20→1系、0.23→2系…と思ったら0.23もまだ生きてるみたいだし、確かによく分からない^^;

利用しているHadoopエコシステムのトップがHiveなのは相変わらずだけど、2位がZooKeeperで3位がHBaseって、かなり意外。
ZooKeeperを単独で使ってる人ってそんなにいるとは思えないんだけどなぁ。自分もMapRを使ってるから間接的にはZooKeeper使ってるけど。
って、自分は主にAsakusa Frameworkを使っているので、このエコシステムのアンケートでは選択肢が無かったんだよなぁ。AsakusaFWがHadoopエコシステムかと言われると、ちょっと疑問ではあるけれども。 

あと、Hadoop開発のソースコード行数のトップはHortonworksだそうだけど、HortonworksはHCJには来てないね^^;

それと、Treasure Dataの太田さんが言っていた、「Hadoopを使う理由のひとつとして“安いストレージ”と答える人がいるが、今はGlusterFSやCeph等、ストレージに特化したOSSが存在する」というのは意識してなかったなぁ。


午後1つめはCloudera小林大輔さんのHadoopのセキュリティーの話。→資料
Kerberos認証のデモをやっていた。
Apache Sentryというのは初耳。HiveやImpala用の認可モジュールらしい。 

で、昔、MapRだとOSレベルで認証・認可できるという話を聞いたような気もするけど、KerberosやSentryだとどうなんだろうな?


2つ目はGoogle佐藤一憲さんのBigQueryの話を聞いた。→資料
BigQueryではインデックスを作らず、大規模に並列処理している。1TBを1秒以内にアクセスする為には逆算して5000台必要、ということろから台数が決められたらしい。普通の会社なら、仮想マシンを使っても5000台は用意できないよ。すごいなぁ。
BigQueryは680億行のSELECTが20秒程度だそうで、デモでも120億行の正規表現による絞り込みが10秒くらいだった。
データをインサートしながらクエリーを発行することも出来るが、BigQueryにはトランザクション処理は無い(入力データの重複を排除できない)し、スナップショットも無いので、確実な結果が欲しい場合は別のところへコピーしておく等の方法を使う必要があるらしい。

BigQueryはシャードで分散し、ミキサーで集約するという仕組みらしい。
結合は2種類あって、右結合のマスター側が8MB以内なら、オンメモリーで全ノードにコピーして結合する(Small JOIN)。それ以外はシャッフルを行う(Big JOIN)。
AsakusaFWにもデータが小さい場合はサイドデータジョインで処理する最適化機能があるが、8MBはかなり小さいような気がする。

Hadoopとのデータ連携として「Connectors for Hadoop」というのがあるらしいが、純粋にMapReduceのInputFormatとかのクラスを提供しているようで、いまどき素のMapReduceを使う人がどれくらい居るんだろう?^^;

あと、提供時期未定だけど「BigQuery UDF(JavaScript)」「Cloud Pub/Sub(メッセージング処理)」「Cloud DataFlow(FlumeJavaによるバッチ処理とMillWheelによるストリーミングを1つのコードで行う?)」とか計画されているらしい。

こういった直接仕事と関係ない話は最近聞いていなかったので、ちょっと新鮮だった。


3つ目はLINE田籠さんのNorikraの話。→資料

Norikraの名前は聞いたことがあったけれど、ストリーム処理をSQLで記述するものだったのか。
Esperというライブラリー(昔からあるストリーム処理ライブラリーらしい)も初めて聞いた。
Norikraは、SQLはEsperベースだがスキーマが不要なのだそうだ。


4つ目はNTT小沢健史さん(→資料)、6つ目はTreasure Data小林さんのYARNの話(→資料)。

どちらもYARNを実際に使う際の設定値について詳しく説明されていたので、これは公開される資料をちゃんと見た方が良さそう。

とりあえず覚えておくべきは、Hadoop2.2.0・2.3.0・HDP2.0はCapacity Schedular・Fair Schedularにデッドロックするバグがあるので使用すべきではない、ということ。(現時点での最新の2.4.1、HDP2.1はOK。CDH5.0.2はパッチが当たっているのでOK)

YARNが出た当初は「使い物になるの?(立ち消えになるんじゃないの?)」という感じだったが、最近はもうHadoop2系(YARN)に行くのが当たり前みたいな雰囲気だなー。でも直前のバージョンでもデッドロックするようなバグがあるなら、現時点で使うのはまだ少し微妙な気もする。 


5つ目はNTTデータ土橋さんのSpark on YARN。→資料

Sparkを実際のクラスターで動かしてみたところ、データ量に応じてだいたい線形にスケールするということらしい。

HDFSからデータを読み込む場合、MapReduceが使われるので、ローカリティーは効く。
同じデータを何度も使う場合、HDFSから読み込んだデータがキャッシュ(メモリー)に乗るので、2回目以降は速くなる。
キャッシュに入りきらない場合は、入りきらない部分だけファイルから読み込む(異常終了するわけではない)。
プログラム次第でキャッシュに自由にデータを乗せられるので、何でもかんでも乗せると個々に乗せられる量は減ってしまうので注意が必要らしい。
言われてみれば気になる点ばかり。とても参考になった。 

キャッシュに入れるデータ(構造)はシンプルにし、必要であれば(implicit conversion等で)複雑な型に変換して使うのが良さそうとのこと。 

PoCで作ったアプリケーションについては割愛されてしまったが、ここが一番興味あったんだよなぁ。Sparkの実務的なコーディングってどんな感じ(ステップ数とかクラスの使い方とか)になるのかなぁ。

結論として「まだ見えない苦労はある」「玄人レベル」とのことだったけど、その辺りの具体的な理由も聞いてみたかった。 


7つ目はORACLE大橋雅人さんのSmart SQL Processing。→資料

HadoopとRDBMSは補完関係にあるってことで、HadoopとRDBMSを透過的に扱う(SQL1つでどちらにもアクセスできる)チャレンジをすると。それがSmart SQL Processingだそうです。

で、それが、OracleのDBMS側で発行したSQLでHadoopにもアクセスできるようにすること!
OracleのDBのデータをHDFSにコピーする方法とかHDFS上のファイルをOracleDBに入れる方法は欲しいなぁと思ってたけど、Oracle側のSQLでHadoopにアクセスするとは考えなかった^^; RDBMSを扱っている会社ならではの発想だなぁ。

Smart SQL Processingは以下のようなことをするらしい。 

  • OracleDBからのクエリーでHDFSのデータにアクセスする
    • Oracleの関数が全て使える
    • 既存のアプリを修正する必要が無い
  • OracleDBのメタデータ管理を拡張してHDFS上のオブジェクトを把握する
    • Hiveのメタ情報をOracle側のカタログ(外部表)として定義する
  • Oracle ExadataのSmart Scan同等機能をHadoopのノードに実装する
    • HDFS側でデータの最小値最大値を持っておき、クエリー実行時に範囲外ならスキャンしないようにする

しかし、HDFSのファイルとRDB連携を考えるなら、一番欲しいのは、HDFS上の大容量ファイル(全件)とRDB上のマスターデータとの結合だと思う。それはどうやって解決するんだろう?


最後。講演の合間に流れていたアニメーション。毎回よく作るなぁw
今回は象が上手く3Dになって動いていたけど。気になったのは、サッカーボールをドリブルしていた箇所。前足はハンドじゃないのか? 前「足」だから問題ないのか?^^;

あ、それと、お弁当ごちそうさまでした。

コメント (1)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする