Blog
Zeppelinを使って実行環境付きドキュメントを作った話
こんにちは、RightSegmentの府川(@fuppi)です。
最近開発環境にApache Zeppelinを導入したのですが
「実行環境付きScalaドキュメント」や「複数システムのデータ確認」として役立っているので、ご紹介したいと思います。
Apache Zeppelinとは
- Webブラウザ上で、インタラクティブに処理ができる
- 複数言語、複数システムに対応
- オープンソース
という特徴があり、Zeppelin上で、データの抽出、加工、可視化まで、1画面上で行うことができます。
似たものにJupyterやSpark Notebookなどもあります。
導入の仕方
GitHubにソースがあるのでcloneして、mavenでインストールを行えばすぐ使えるようになります。
オプションで、「-Pspark-1.6」と指定するだけでZeppelinと一緒にSpark1.6がインストールされます。
Zeppelinのインストールをして、Sparkのインストールをして… と複数手順を踏まず、ここでまとめて入れることができるのはありがたいです。
1 2 3 |
git clone https://github.com/apache/incubator-zeppelin.git cd ~/incubator-zeppelin mvn clean package -Pspark-1.6 -DskipTests |
今回は、Sparkのみ入れましたが、他にもhadoopや、pyspark、maprなどを入れることも可能です。
詳しい手順はGitHubを参考にしてください。
デーモン起動
1 |
./bin/zeppelin-daemon.sh start |
これで、http://localhost:8080 へアクセスすると使えます。
csvファイルからSparkSQLのテーブルを作成する
環境ができたので、試しにローカルのcsvファイルを読み込んでSparkSQLのテーブルを作ってみます。
その前にspark-csvというcsv読み込み用の外部ライブラリを使いたいのでInterpreterから設定を行います。
Interpreter -> spark -> Dependenciesに、「groupid:artifactid:version」となるように設定をします。
1 |
com.databricks:spark-csv_2.10:1.4.0 |
外部ライブラリを使いたい時はここに設定すれば使えます。
また、InterpreterではZeppelinの特徴である、複数言語・複数システムを扱うための設定が行えます。
デフォルトで、17個ものプラグインが存在していて、更に必要に応じて自分で作れるようドキュメントも用意されています。
ライブラリも入ったところで処理へ移ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
%spark import org.apache.spark.sql.types.{ StructType, StructField, StringType, FloatType } import org.apache.spark.sql.Row // スキーマ情報 val customSchema = StructType(Seq( StructField("sepalLength", FloatType, true), StructField("sepalWidth", FloatType, true), StructField("petalLength", FloatType, true), StructField("petalWidth", FloatType, true), StructField("species", StringType, true) )) // データフレームで取得 val df = sqlContext.read .format("com.databricks.spark.csv") .option("header", "true") .schema(customSchema) .load("/tmp/iris.csv") // SparkSQL用にテーブルを作成 df.registerTempTable("iris") // データを抽出してみる val dfIris = sqlContext.sql("SELECT * FROM iris") dfIris.show() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
customSchema: org.apache.spark.sql.types.StructType = StructType(StructField(sepalLength,FloatType,true), StructField(sepalWidth,FloatType,true), StructField(petalLength,FloatType,true), StructField(petalWidth,FloatType,true), StructField(species,StringType,true)) df: org.apache.spark.sql.DataFrame = [sepalLength: float, sepalWidth: float, petalLength: float, petalWidth: float, species: string] dfIris: org.apache.spark.sql.DataFrame = [sepalLength: float, sepalWidth: float, petalLength: float, petalWidth: float, species: string] +-----------+----------+-----------+----------+-------+ |sepalLength|sepalWidth|petalLength|petalWidth|species| +-----------+----------+-----------+----------+-------+ | 5.1| 3.5| 1.4| 0.2| setosa| | 4.9| 3.0| 1.4| 0.2| setosa| | 4.7| 3.2| 1.3| 0.2| setosa| | 4.6| 3.1| 1.5| 0.2| setosa| | 5.0| 3.6| 1.4| 0.2| setosa| ・ ・ ・ |
これでテーブル作成は完了です。
データの可視化をする
Scalaでデータ取得処理を書くこともできますが、以下の用にしてもテーブルにアクセスできます。
1 2 |
%spark.sql SELECT * FROM iris |
クエリを実行するだけで、可視化まで自動で行ってくれるので、分布を見てみたい時などはこちらの方が使い勝手が良いです。
また表や円グラフ、散布図などへボタン一つで切り替えができ
settingsから縦軸・横軸に使う変数を切り替えたり、グルーピングする変数を設定したり、細かい調整も可能です。
SparkSQL内に”${変数名}”と入れれば、入力した値に応じてグラフが変更されるようになります。
1 2 |
%spark.sql SELECT * FROM iris WHERE ("${sepalLengthMin}" <= sepalLength) AND (sepalLength < "${sepalLengthMax}") |
“${変数名=初期値,メニュー1|メニュー2|メニュー3}”のようにするとプルダウンメニューを作ることもできます。
1 2 |
%spark.sql SELECT * FROM iris WHERE species = "${species=setosa,setosa|versicolor|virginica}" |
ノートブックの処理を定期的に再実行をするように設定もできるので、これらを組み合わせれば、簡易管理ツールを作ることができます。
実行環境付きドキュメントとしての活用
Zeppelinを共有のサーバに入れ、最初に環境設定さえ済ませてしまえば、皆が同じコードを実行することができます。
どこかのサイトを見ながら処理を書いても、環境依存によるエラーが出て、出鼻をくじかれるなんてことはよくあると思いますが、
ノートブックをドキュメントとして残しておけば、とりえあず動かしてみるという第一歩は、誰でも踏み出すことができます。
これって学習のモチベーション維持には重要ですよね。
Scala初心者向けの簡単なものからストリーミング処理や機械学習のようなものまで、ドキュメントとして残しておくことで
別の人が同じようなことをやる時は、最初からアルゴリズムの方に注力できるので作業効率は上がるでしょう。
まとめ
ブラウザ上で
- 複数システムにつなげ、データ抽出ができる
- mllibなどのSparkのライブラリを使える
- 手軽にデータの可視化ができる
などの点から、アナリストが分析のために使用しているのをよく目にしますが
文字だけのドキュメントではなく、実行環境付きドキュメントというのは、エンジニアにとってもメリットは大きいものです。
ぜひ、使ってみてください。
Author
shota