HadoopTimes

ストリーミングアーキテクチャ Apache Kafka とMapR Streams による新しい設計手法
技術情報

Hadoopの知識が無くてもHadoopを使う方法

執筆に至るまでの経緯

Hadoopの課題の一つはHadoopの力を使いこなすのに必要な新しいスキルセットを学ぶ必要なくその価値を取得することです。Hadoopを含むMapRディストリビューションを使用する時、実際はというと・・・Hadoopを使うのに Hadoopを知る必要はないのです! 私は最近この事実を再確認し、この機に情報を公開することで他の人達のHadoopとの初仕事が簡単になることを願っています。
まず最初に、MapRが役に立った事例から始めましょう。 私達の元には今すぐには使い道のないあるレガシーギアから採取した大量のセンサーデータがありました。どちらにしても、もしギアが現役で正常に作動しているならむやみに交換しないことです。費用が非常に高いので!
問題はこの頑丈なセンサーが採取された情報の構築と保管方法を知っている技術者の任期よりも長持ちしてしまうことでした。そのためこの情報をもっと最新の、新人でも無理なく扱えるシステムに移動する必要がありました。
結論としてHadoopを試してみることなり、その代わり既存のコードとプロセスを極力使い続けることを条件にしました。目標はデータを他のツールでも検索したり応用したりできる形式にすることでした。ここで興味深かったのは分析チームで使うほとんどスキルがSQL中心であったことです。

課題:プロプライエタリ・データを本来のフォームからSQL上で実行できるように既存のコードベースとスキルを使って変換できるソリューションの構築。課題はこれらの作業をHadoopのソリューションの書き方、実行、管理方法を一切学ぶことなく実践することにありました。

結果:約1時間後、既存プロセスに対する知識のある人と一緒に、立ち上げ、実行まで作業をHadoopライブラリの知識を一切学ぶことなく完了させました。私達は既存コードを切り取り、それらが今までオペレーターのコンピューターでやっていた作業をHadoopストリーミングプロセスを除いてはHadoopコマンドを一つも使わずMapHadoopクラスターに適用しました。それがPOSIX環境でのtrue読み込み/書き込み機能を持ったリアルファイルシステムの利点です。

この記事の後半には上記と同じ手法が再現できる一般的な例が含まれています。それでは私達がMapR、JARファイル、BASHスクリプトそしてApache Drillから構築したETLソリューションに目を通してみましょう。生データはNFSを介してMapRクラスタに詰め込まれました。これはデイリーステージング領域である/data/newに落とされ保管されます。そして1時間おきに JSONファイルへ分類され、/data/jsonへ移されます。一度データがJSONファイルへ分類されると元データは/data/archiveへ移されます。
usinghadoop-nfsdrill-blog

Java JSONフォーマットオペレーション

結論から言えば、データをJSONオブジェクトに変換できるJavaプログラムは既に存在していました。スタッフはセクションの上にセクションを重ね、月毎に一度ずつデータに目を通しました。仕組みを理解するまでしばらく観察した後、私はそれをそのまま使うことにし、単純なBASHスクリプトとHadoopストリーミングを付け加えて大量のデータを Apache Drill検索用としてJSONファイルに変換できるようにしました。既存のアプリケーションには必要となる3つの引数がありました。一つは圧縮された顧客データ用のインプットファイルです。二つ目は変換フォーマットでした。 JSONだけ知っていれば十分でした。三つ目はアウトプットディレクトリ。私達はデータをtargetOutputLocation/sensorid/day/dataのようなフォルダに分解する検索可能なファイル形式を確立するために幾つかの変更を加えました。それから私達は3つの引数を受取る実行可能なJARファイルを作成しました。
usinghadoop-jarfile-blog
JSON書式化されたメトリックファイルの保管場所。ファイルはclustered/date.jsonとして保存されます。
JARファイルを実行するには以下のコマンドが使用されました:
java -jar /my/jar/location/myJar.jar /my/input/compressed/file JSON /my/output/directory
マックブック上での簡単な試験が成功した後、JARファイルはMapRクラスターに移され、もう一度正常作動が確認されました。さて、それでは一味違うHadoopとして、ちょっと扱いが難しいNFSがあるのですが、MapRには標準的な Linuxコマンドを可能にするtrue POSIX読み取り/書き取りファイルシステムがあります。このため、Linuxで使えるほとんどのコードはそのままクラスター中のデータに使えます。これがJARファイルの実行をクラスターのノード部分で試したとき使った手法です。

この方法で全てのデータを処理することもできましたが、それでは一つのノードに全ての作業負担をかけることになります。それよりもっと良い方法があるはずです。Hadoopストリーミングを使って何千ものファイルをノードごとに分散することでクラスターにある全てのノードを作業処理に使えるようになります。もし他の生産作業量に配慮したい場合は実行をクラスターの一部のノードに制約することもできますが、それはこの記事では取り扱いません。ここでは一つのコマンドの基礎を除いてHadoopについて何も知らない状態でのHadoopストリーミングを使ったMapReduceジョブの実行に焦点を置くことにします。

Hadoopストリーミングジョブの実行

変更が必要な時に、JARファイルの再構築を必要としないで実行を制御するためには、BASHスクリプトがHadoopストリーミングジョブによってETLオペレーションの制御をする際のマッパーとして使われます。同じ作業をするのに他にもやり方は沢山ありますが、この方法だと既存のツールをすぐに再利用でき、Hadoop完成品から素早く結果を得られます。 次にファイルの配置と作業の実行について見てみましょう。

実行用のファイル配置

このETLプロセスを実行するには二つのメインスクリプトがあります。一つは実行可能なJava JARファイルである myApp.JARに入力する既存コードです。このプロジェクトは圧縮データをプロプライエタリ形式のまま読み取り、特定のアウトプットロケーションへJSON書式に抽出、変換、挿入します。 二つ目はBASHスクリプトで、Hadoopストリーミングジョブで実行用にファイルをマップするために使われ、 mapper.shと呼ばれます。特記するべきその他二つのロケーションはインプットファイルとアウトプットディレクトリです。
usinghadoop-fileloc-blog

ジョブの実行

このETLオペレーションはMapR4.0.1クラスター上に構築されたもので、YARNをHadoop ストリーミング作業のリソースマネージャーを使っています。MapRの面白い特徴の一つとしてはReduce v1とYARNがクラスター内で同時に使用可能で、更に同じノード内でも可能だという点です。この場合、 YARNがHadoopストリーミング作業を実行すると、インプットファイルのリストを引き出しタスクごとに振り分けます。 JavaコードにはHadoopの知識がないので、Javaコードが取り扱うべきファイルがどこにあるのかを確実に把握できるように幾つか変更を加える必要があります。BASHスクリプトはマッパーとして使用され、特定のインプットファイルを受け取るとファイルロケーションを Java JARに渡すことで ETLオペレーションは完了します。これはHadoopの外でJARを抽出、変換、挿入できるようにしたものですが、それでもこれをクラスター間のMapReduceジョブでHadoopと一緒に使う方法があります。以下が上記にリストされたファイルロケーションを基盤としたHadoopストリーミングジョブの実行例です。

Hadoop2 jar
/opt/mapr/Hadoop/Hadoop-2.4.1/share/Hadoop/tools/lib/Hadoop-streaming-2.4.1-mapr-1408.jar
-input /data/my_raw_data/*/*/*
-mapper /mapr/cluster-name/user/user1/mapperr.sh
-output /data/projectlog/01NOV14

下記が Hadoopストリーミングコマンドで使われた引数の説明です:
usinghadoop-commands-blog
私達がマッパーとして使っているBASHスクリプトのロケーションを特定

Hadoop ストリーミングを使った複数のファイルへのアクセス

処理を必要とするファイルが沢山ある場合があるため、 MapReduceジョブをディレクトリごとに実行しても良いし、複数の「-インプット」指示子を含めても良く、または全てのファイルを一つのリストにまとめることも可能です。私達は均一なファイルのレイアウトを持っているので、ワイルドカード*を使って複数のディレクトリのファイルを引き込むことができるのです。これが可能だったのはディレクトリ構造中のすべてのファイルが同レベルに配置されているからです。もしあなたが求める全てのファイルをlsコマンドでリストアップすることができれば、MapRを使っている場合はそのリストをHadoopストリーミングジョブに使えます。ls /mapr/cluster-name/data/my_raw_data/*/*/*は最終的に-input /data/my_raw_data/*/*/*になります。

ジョブアウトプットロケーションについて

マッパーは実際にはETLスクリプトを実行しているので、唯一アウトプットディレクトリに残るのはジョブ中に生成された標準アウトメッセージだけです。この情報は削除しても良いし、処理ログとして保存しても良いです

マッパースクリプトの説明

Hadoopストリーミングがインプットファイルリストを処理する中で、リストをすべてのノードに振り分け各ファイルに対するタスクを起動します。マッパーはスピンアウトされ引数無しに起動します。mapr.shスクリプトはマップした既存ファイルをHadoopストリーミングジョブタスクがマッパースクリプトを起動したときに定められる環境変数mapreduce_map_input_fileから処理するために引き出します。インプットファイルはmaprfs:/data/my_raw_data/AC500E1A36B/130322/compressed_file書式で特定されます。この書式はJavaコードにHadoop の知識が無いためJARファイルでは使えません。mapperr.shスクリプトはmaprfs:をNFSマウントポイント情報/mapr/cluster-nameと入れ替え、/mapr/cluster-name:/data/my_raw_data/AC500E1A36B/130322/compressed_fileのETLを行うJARファイルを起動します。 JARファイルに渡されたアウトプットロケーションはNFSのアクセスポイントでもあります。
mapperr.shの例は下記にリストされています。
usinghadoop-mapperr-blog
必要なのはこれで全部です。これでHadoopについて何も知らなかったコードとコーダーが実用可能なHadoop MapReduceジョブを手にすることになりました。
お役に立てれば幸いです。

Apache Hadoop for the MapR Converged Enterprise Edition

Apache Hadoop for the MapR Converged Enterprise Edition
MapRコンバージド・データ・プラットフォーム向けHadoopは、オープンソースのHadoopソフトウェアとエンタープライズグレードのMapRプラットフォームを結合させることで、Hadoopをより強力で安全かつ安定したものにしています。

詳細についてデータシートをご確認ください。

無料ダウンロードはこちら

こちらの記事もおすすめです