RSS2.0

Hive を構築して Hadoop とつなげてみた

引き続き Hadoop でいろいろ試してみるシリーズです。
前回は Hadoop 本体を構築し、HDFS に配置したファイルを使って簡単なデータ分析をしてみました。取り扱ったデータが小さい上に、実際には単体構成な Pseudo-Distributed Mode だったのでアレですが、Hadoop の概要のようなものが少しずつ見えてきました。

Hadoop ではやはり HDFS という独自のファイルシステムを扱うことが特徴的で、実際に HDFS 上にファイルを配置し、処理を行うというのは、自動化を考えるとなかなか大変そうでした。この HDFS を使ったデータ処理をより手軽に行うための周辺技術として、古くから Hive というコンポーネントが使われてきました。Hive を利用することで、HDFS へのファイル配置や参照・集計といった処理を、HiveQL という SQL ライクなクエリ言語として実行することができます。

今回は Hive の環境構築を行い、前回 HDFS に対して直接行ったデータ集計と同じことを、Hive を通して試してみようと思います。

なお、Hive はソフトウェア要件として Java7 以上、Hadoop 2.x を必要としています。
ここでは、前回構築した Hadoop 環境に追加していく形で構築していきます。
続きを読む Hadoop  コメント (0)  2017/04/05 12:19:00

Hadoop を Pseudo-Distributed Mode で試してみた

大量データの分析で威力を発揮するものの、癖が強すぎて適応分野の選定が難しいと一部で話題になっているらしい Hadoop ですが、これまでなかなか触る機会がなかったため、少し触ってみることにしました。実際にうまく使いこなせている人達は企業でさえも 10 〜 20 社あるかないかとか言われてるらしいですが、個人的に何も知見がないため、何を言われていても「へ〜そうなんだ〜」と返すしかありません。エンジニアとしてそんな状況もどうなんだと思ったので、ちょっと遊んでみることにしました。

ちなみに、Hadoop には大きく分けて Standalone Mode、Pseudo-Distributed Mode、Fully-Distributed Mode の 3 つの構築方法があるそうで、公式ドキュメントちょっと遊んでみるなら単一ノード構成がいいよと書かれていたので Pseudo-Distributed Mode で遊んでみることにしました。ざっとドキュメントを読んだ感じ、Standalone Mode は分析用のロジックを動かしてみるだけで、Hadoop の特徴らしい HDFS なんかにまったく触らず終わりそうだったので、やめておきます。分析ロジックが jar なので、自分で書いた jar を試しに動かしてみるには Standalone Mode が良さそうです。

なお、今回はらしいらしいという記述が多くなっていますが、分散処理は奥が深そうで、現時点では断言できることが少ないためです。ブログにはなるべくしっかりとした情報を書きたいのですが、これに関しては仕方ないかなと思います。ご了承ください。
続きを読む WEB 技術Hadoop  コメント (0)  2017/03/29 18:42:18

chocolablog ver 0.8 にアップデートしました

Python 製自作ブログの chocolablog を ver 0.8 にアップデートしました。

前回のバージョンアップは 2014 年 11 月 3 日でした。2 年と 3 ヶ月ぶりくらいですね。
その間特にリリースを迫られるような理由もなかったのですが、最近になって大きめの追加機能を実装することになりました。

……こうやって趣味で書いてるコードを日の当たる場所に出すというのも随分ひさしぶりな感じがしますね。
以前よりも家でコードを書くことが減っているのこともありますが、まああまり後先考えずに書きたいコードを書いていこうかなと思っています。
chocoblog08.png

そして恒例の謎スクショ。
この手の記事は毎回何の画像を貼ろうかすごく悩みます。

続きを読む chocolablog 開発  コメント (0)  2017/02/13 19:59:53

sqlite3 で SELECT 結果の行番号を取得する

SQL を使っていると、SELECT した結果セットの各行について、結果セット中での行番号を知りたい、という場面にたまに遭遇します。こういうやつです。
SELECT * FROM books ORDER BY price;
id          title           price     
----------  --------------  ----------
3           Art with Basis  600    #行番号: 1
4           Book List       990    #行番号: 2
1           Civilizations   1000   #行番号: 3
2           Dream Post      1200   #行番号: 4
5           El sant magina  1500   #行番号: 5
一般的な一覧系の処理では先頭から N 件とりだすことが多いので、OFFSET で取り出した件数を指定すれば行番号を意識せずに続きをとることができます。

ただ、ID からその行の結果セット中での位置を知ろうとすると、やはり行番号が欲しくなってくるのです。結果セットがソートされていたり、ソートされているカラムがユニークでなかったりするとかなり面倒なことになります。特定の ID の行の前後 3 行ずつを取りたい、というような時に困ってしまうわけです。

結果セット中での行番号を取得するために、Oracle では ROWNUM 擬似列や ROW_NUMBER() 関数が用意されているそうです。
また、MySQL ではユーザ定義変数を使うことで、SELECT 時に行番号を計算し、出力することができます。
SET @rownum := 0; SELECT *, (@rownum := @rownum + 1) FROM books;

しかし sqlite3 では ROW_NUMBER() 的な機能もユーザー定義変数的な機能も実装されていないので、これらの方針をとることはできません。ネットを見てみると以下のようなクエリで計算している例がありますが、境界値として WHERE 句で使っているカラム(ここでは id カラム)がユニークでない場合、境界値として機能しないため、厳密な行番号はとれません。
SELECT id, title, price, (SELECT COUNT(*) FROM books b2 WHERE b1.id >= b2.id) AS rownum FROM books b1 ORDER BY rownum;
id          title           price       rownum    
----------  --------------  ----------  ----------
3           Art with Basis  600         1         
4           Book List       990         2         
1           Civilizations   1000        3         
2           Dream Post      1200        4         
5           El sant magina  1500        5         
※ ORDER BY rownum は見やすさ重視のためにつけたもので、必須ではありません。

もう 1 点、この方法では 1 行毎にサブクエリで行番号をカウントするため、参照性能に問題があります。MySQL では悪名高き DEPENDENT SUBQUERY にあたるためです。
続きを読む WEB 技術  コメント (0)  2017/02/01 19:45:13

Ionic 2 を試してみた

あけましておめでとうございます。
年の瀬に Maven Resources Plugin の記事 を書き、お正月だからとだらだらしていたら 3 年経ってしまいました。

それはともかく、少し時間ができたのでスマホアプリの技術でも触ってみようかと思い、Ionic 2で遊んでみました。今回は Ionic 2 のインストールから空のプロジェクトを作ってブラウザから動作確認をし、独自の新ページを追加するところまでです。

スマホアプリというと Android や iPhone の実機をつないで都度ビルドしながらデバッグする、というイメージが強いですが、Ionic 2 などの最近のフレームワークは WEB ベースの技術が組み合わさっているため、実機がなくてもブラウザから動かすことができます。簡単なページは JavaScript や CSS を使って WEB アプリ的に実装し、それで実現できない部分は端末固有の実装として Java や Swift で書いたプラグインに任せよう、という設計思想だそうです。確かに、ゲーム系でないスマホアプリは、突き詰めてしまえばボタンを押しながら画面遷移していくだけの事が多いので、WEB アプリに似せた開発ができるというのは効率的なのだと思います。

Ionic 2 は Cordova というマルチプラットフォーム向けのフレームワークに覆いかぶさる形で作られています。なので Cordova 同様、Ionic 2 で書いたアプリも Android や iOS 用にビルドすることができます。また Ionic 2 の特徴として、AngularJS と切っても切れないほと密接に連携していて、その特徴を色濃く受け継いでいます。データとデータを取り扱うロジック部分をビューから切り離し、そのデータをビューに対して自動的に埋め込ませることができます。このあたりの考え方は、WEB アプリを作ったことのある人には、馴染みの深い MVC モデルの応用のように聞こえますが、MVC モデル自体がデスクトップアプリケーションに端を発しているものなので実際は逆輸入なのかもしれません。

さて、今回の目標としては、似非商品検索アプリを作ってみようと思います。トップ画面から検索画面に遷移し、そこで入力したキーワードから、キーワードを商品名に含む商品の一覧を表示する、という感じの動きです。ただし、今回は実際に DB や WEB サービスから検索するわけではなく、キーワードを商品名っぽく加工して表示するだけとします。
こんな感じの仕上がりを目指していこうと思います。
続きを読む WEB 技術Ionic 2  コメント (0)  2017/01/24 19:19:22

Maven Resources Plugin の Filtering 機能を使ってみる

Maven Resources Plugin は必要なタイミングで、リソースファイルを特定のディレクトリにコピーする機能です。
Maven プロジェクトではコンパイルされたクラスは target/classes に配置され、実行時には target/classes に classpath を通せばよいように設計されています。(jar や war にパッケージされるのも targaet/classes 配下のファイルになります。)つまりコンパイルが走るタイミングで src/main/resources ディレクトリ下のリソースも classpath の通る target/classes に配置してやる必要があり、その役割を担うのが Maven Resources Plugin なのです。

Maven Resources Plugin には Filtering と呼ばれる機能があります。これにより、リソースファイルをコピーする際に、リソースファイル内の文字列を動的に書き換えた上でコピーすることができます。
続きを読む Maven  コメント (0)  2014/12/31 11:37:58

Eclipse プロジェクトの再読み込みなしでリソースを更新する

Eclipse 外で HTML ファイルや prpperties ファイルなどを修正した場合、Eclipse プロジェクトを都度再読み込み(更新)し、修正したリソースファイルを Eclipse に認識させてやる必要があります。WEB アプリ開発などでは頻繁に HTML ファイルやテンプレートファイルを修正するため、その都度 Tomcat を止めて Eclipse プロジェクトを更新する、というのは非常に非効率です。Java クラスについては、メソッドやクラスの定義が変わらない限り Servlet コンテナを止める必要はないのですが、リソースファイルの修正にはまだまだ弱いのが現状です。

リソースファイル変更時に Eclipse プロジェクトの更新が必要になるのは、Eclipse プロジェクトのレイアウトとして、リソースファイルが配置されるディレクトリと実行/デバック時に Eclipse がクラスパスを通すディレクトリが異なるためです。例えば Maven プロジェクトでは、リソースが配置されるのは src/main/resources ですが、Eclipse がクラスパスを通してくれるのは target/classes になります。Eclipse は Eclipse プロジェクトの更新時などにリソースファイルを src/main/resources 下から target/classes 下にコピーし直すのですが、逆にいうと、いくら src/main/resources 下のリソースファイルを書き換えても、target/classes 下にコピーされない限り(クラスパスの通ったリソースファイルは古いままなので)プログラムはリソースとして読み込むことができません。
target/classes 下のリソースファイルを修正すれば一応クラスパス上のリソースを変更することはできますが、次にリソースディレクトリからリソースファイルがコピーされた時に上書きされて巻き戻ってしまいます。

これを解決するため、読み込むリソースファイルの場所を任意のディレクトリに切り替える仕組みを作ってみました。

EclipseClassLoader.png

Eclipse Project Loader

https://github.com/momokan/eclipse-project-loader (github)

Eclipse Project Loader を使うことで、クラスパス内のリソースファイルをクラスパスの通っていない別のディレクトリから読み込むことができるようになります。そのため、プログラムがリソースファイルを読みにいくたびに、最新のリソースファイルにアクセスすることができるようになります。

続きを読む Eclipse Class Loader  コメント (0)  2014/11/29 19:41:00

chocolablog ver 0.7 にアップデートしました

Python 製自作ブログの chocolablog を ver 0.7 にアップデートしました。

前回アップデートが 2013 年 5 月 2 日ということで、今回も 1 年以上の間を置いてのバージョンアップとなります。ver 0.6 ではシステム管理側でいろいろ機能を追加していきましたが、ver 0.7 では新機能の追加はほとんどなく、細かな機能拡張と不具合修正のみになります。

ver0.7.png

ver 0.6 で実装したスパムコメントのフィルタリング機能は、1 年半くらい運用してみてまずまずの成果をあげているようです。フィルタリング機能は 2 段構えなのですが、第 1 障壁を超えてきたコメントスパムが 2 件だけでした。その 2 件も察するに、スパマーさんが試しに普通にコメントしたんじゃないかという感じの内容だったので、第 1 障壁の役目としては問題ない範囲になります。

スパムコメント対策に限らず、システムとしてはだいぶ成熟してきた感が強くなってきているので、今後もこんなペースでの開発が進んでいくことになるんじゃないかと思っています。当面は大きめの機能追加の予定はありません。(単にネタ切れとも言う)

続きを読む chocolablog 開発  コメント (0)  2014/11/03 15:24:13

Python nose でユニットテストを書いてみた

chocolablog は Python で書かれていますが、これまであまりユニットテストの整備に時間を割いてこれませんでした。しかし初期バージョンの開発から 2 年以上が経ち、その間に何度か sqlite3 をとりまく DB アクセス部分を中心に、処理を書き換えています。他のロジックはともかく、コアとなるコードはしっかり動作を担保しておくべきだなと感じ、ユニットテストの整備に着手することにしました。

nose_report.png
Python では 2.1 移行、ユニットテストフレームワークとして unittest が組み込まれています。これは個人的に大好きな JUnit をベースに作られているそうです。ただネット上で目にした Python 系のオープンソースプロジェクトでは、この uniittest モジュールではなく nose というモジュールを使ってテストコードが書かれていました。nose を使うとテスト失敗時にデバッグツールの pdb を自動で起動してステップ実行ができたり、ソースコードのカバレッジレポートを出力できたりと、テストの書き方以外の面でもいくつかメリットがあります。
今回は unittest よりさらに簡単にユニットテストを書けるらしい nose を使い、ユニットテストを書いてみました。

続きを読む python  コメント (0)  2014/05/29 08:02:50
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2018, 12>>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345