Symfoware

Symfowareについての考察blog

Play Framework 2.5.0をUbuntu 14.04 + OpenJDKで動かす

Play Frameworkを触ってみようと思います。
https://www.playframework.com/

Ubuntu 14.04で動かしてみました。


事前準備



java 8系をインストールしておきます。
UbuntuにOpenJDKをインストールする手順はこちら。

Ubuntu 14.04にOpenJDK 8をインストールする


OpenJDK 1.8.0_72で試しています。


$ java -version
openjdk version "1.8.0_72-internal"
OpenJDK Runtime Environment (build 1.8.0_72-internal-b15)
OpenJDK 64-Bit Server VM (build 25.72-b15, mixed mode)






activatorの取得



ダウンロードページからactivatorをダウンロードしました。
https://www.playframework.com/download

680_01.png

typesafe-activator-1.3.9-minimal.zipを取得。
適当なフォルダに解凍します。
/optや/usr/binといった特殊なアクセス権が必要なフォルダは避けろとのこと。

今回は、$HOME/dev/playに解凍しました。

680_02.png


解答したフォルダのbinにactivatorというファイルがあります。
ここまでのパスを通しておきます。

.bashrcを編集。


$ vi ~/.bashrc




末尾にパスの設定を追加。


export PATH=$PATH:$HOME/dev/play/bin




変更を反映します。


$ source ~/.bashrc







activator ui



こちらのチュートリアル通り、activator uiを実行します。
https://www.playframework.com/documentation/ja/2.4.x/Installing


$ activator ui




必要なjarファイルのダウンロードが始まり、結構(10分以上?)待ちました。
ダウンロードが終了すると、自動的にブラウザが起動します。

680_03.png


とりあえず動いてくれた模様。





最初のアプリケーション



適当なフォルダを作成して移動。
activatorコマンドでアプリケーションの雛形を作成します。
今回は、scalaにしてみました。


$ activator new my-first-app play-scala




my-first-appフォルダが作成されるので移動。
activatorコマンドを実行します。


$ cd my-first-app
$ activator




ここでも結構待ちます。(10分ぐらい)

680_04.png


playコンソールが起動したら、runを実行してアプリケーションを開始。


[my-first-app] $ run



680_05.png


ブラウザで、http://127.0.0.1:9000/にアクセスするとこんな画面が表示されるはずです。

680_06.png




hello world



せっかくなので、ちょっと表示を変更してみます。
my-first-app/app/controllers/HomeController.scalaを開きます。

見様見真似で「hello world!」を表示するよう修正。


  1. package controllers
  2. import javax.inject._
  3. import play.api._
  4. import play.api.mvc._
  5. /**
  6. * This controller creates an `Action` to handle HTTP requests to the
  7. * application's home page.
  8. */
  9. @Singleton
  10. class HomeController @Inject() extends Controller {
  11. /**
  12. * Create an Action to render an HTML page with a welcome message.
  13. * The configuration in the `routes` file means that this method
  14. * will be called when the application receives a `GET` request with
  15. * a path of `/`.
  16. */
  17. def index = Action {
  18.     //Ok(views.html.index("Your new application is ready."))
  19.     Ok("hello world!")
  20. }
  21. }




出来ました。

680_07.png



テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/03/28(月) 22:23:43|
  2. Scala
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Apache Spark 1.4 を Debian 8(Jessie)にインストールする

以前もSparkを動かしてみたのですが、
Apache Spark を Debian 7(wheezy)にインストール
当時はバージョン0.8.1でした。

気がつくと1.4.0まで上がっていたので、再度手順を確認してみます。


Java 8のインストール



Oracle Javaをインストールしました。
Debian 8(jessie)にJava 8(OracleVM)をインストールする


バージョンは1.8.0_45です。


# java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)






Sparkの取得



ダウンロードページから取得します。
https://spark.apache.org/downloads.html

Hadoop 2.6がつかえるものをダウンロードしてみました。

620_01.png


wgetで取得し、/optに展開しました。


# cd /opt
# wget http://d3kbcqa49mib13.cloudfront.net/spark-1.4.0-bin-hadoop2.6.tgz
# tar zxf spark-1.4.0-bin-hadoop2.6.tgz
# cd spark-1.4.0-bin-hadoop2.6




このまま起動すると、もりもりログが出力されるので、
log4jの設定ファイルを設定します。
Apache Spark spark-shell起動時のログの警告に対処する(log4j.properties)



# cp conf/log4j.properties.template conf/log4j.properties
# vi conf/log4j.properties



「INFO」を「ERROR」に変更しました。


# Set everything to be logged to the console
log4j.rootCategory=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark-project.jetty=WARN
log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO




spark-shellを起動し、前回同様「README.md」の内容を検索してみます。


# bin/spark-shell
Welcome to
     ____             __
     / __/__ ___ _____/ /__
    _\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.4.0
     /_/

Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc.
SQL context available as sqlContext.

scala>



scala> val txtFile = sc.textFile("README.md")
txtFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:21

scala> txtFile.count()
res0: Long = 98

scala> txtFile.filter(line => line.contains("Spark")).count()
res1: Long = 19

scala> txtFile.filter(line => line.startsWith("Spark")).foreach(println)
Spark is a fast and general cluster computing system for Big Data. It provides
Spark is built using [Apache Maven](http://maven.apache.org/).
Spark also comes with several sample programs in the `examples` directory.
Spark uses the Hadoop core library to talk to HDFS and other Hadoop-supported




仕様は変わっていないようですね。
exit()でshellを終了します。


scala> exit()




ちなみに、README.mdの内容はこんな感じ。


# Apache Spark

Spark is a fast and general cluster computing system for Big Data. It provides
high-level APIs in Scala, Java, and Python, and an optimized engine that
supports general computation graphs for data analysis. It also supports a
rich set of higher-level tools including Spark SQL for SQL and structured
data processing, MLlib for machine learning, GraphX for graph processing,
and Spark Streaming for stream processing.

<http://spark.apache.org/>


## Online Documentation

You can find the latest Spark documentation, including a programming
guide, on the [project web page](http://spark.apache.org/documentation.html)
and [project wiki](https://cwiki.apache.org/confluence/display/SPARK).
This README file only contains basic setup instructions.

## Building Spark

Spark is built using [Apache Maven](http://maven.apache.org/).
To build Spark and its example programs, run:

    mvn -DskipTests clean package

(You do not need to do this if you downloaded a pre-built package.)
More detailed documentation is available from the project site, at
["Building Spark"](http://spark.apache.org/docs/latest/building-spark.html).

## Interactive Scala Shell

The easiest way to start using Spark is through the Scala shell:

    ./bin/spark-shell

Try the following command, which should return 1000:

    scala> sc.parallelize(1 to 1000).count()

## Interactive Python Shell

Alternatively, if you prefer Python, you can use the Python shell:

    ./bin/pyspark
    
And run the following command, which should also return 1000:

    >>> sc.parallelize(range(1000)).count()

## Example Programs

Spark also comes with several sample programs in the `examples` directory.
To run one of them, use `./bin/run-example <class> [params]`. For example:

    ./bin/run-example SparkPi

will run the Pi example locally.

You can set the MASTER environment variable when running examples to submit
examples to a cluster. This can be a mesos:// or spark:// URL,
"yarn-cluster" or "yarn-client" to run on YARN, and "local" to run
locally with one thread, or "local[N]" to run locally with N threads. You
can also use an abbreviated class name if the class is in the `examples`
package. For instance:

    MASTER=spark://host:7077 ./bin/run-example SparkPi

Many of the example programs print usage help if no params are given.

## Running Tests

Testing first requires [building Spark](#building-spark). Once Spark is built, tests
can be run using:

    ./dev/run-tests

Please see the guidance on how to
[run all automated tests](https://cwiki.apache.org/confluence/display/SPARK/Contributing+to+Spark#ContributingtoSpark-AutomatedTesting).

## A Note About Hadoop Versions

Spark uses the Hadoop core library to talk to HDFS and other Hadoop-supported
storage systems. Because the protocols have changed in different versions of
Hadoop, you must build Spark against the same version that your cluster runs.

Please refer to the build documentation at
["Specifying the Hadoop Version"](http://spark.apache.org/docs/latest/building-spark.html#specifying-the-hadoop-version)
for detailed guidance on building for a particular distribution of Hadoop, including
building for particular Hive and Hive Thriftserver distributions. See also
["Third Party Hadoop Distributions"](http://spark.apache.org/docs/latest/hadoop-third-party-distributions.html)
for guidance on building a Spark application that works with a particular
distribution.

## Configuration

Please refer to the [Configuration guide](http://spark.apache.org/docs/latest/configuration.html)
in the online documentation for an overview on how to configure Spark.


テーマ:サーバ - ジャンル:コンピュータ

  1. 2015/06/23(火) 22:44:26|
  2. Scala
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Apache Sparkのクラスタ構築手順(Spark Standalone Mode使用)

Apache Sparkをいじってみてます。

Apache Spark を Debian 7(wheezy)にインストール
Apache Spark をPythonで操作する(pyspark)
Apache Spark spark-shell起動時のログの警告に対処する(log4j.properties)
Apache Spark の Web UI


本来、分散処理フレームワークなので、クラスタ構成を構築してみます。



Spark Standalone Mode



クラスタの構築は

・EC2
・Mesos(バージョン0.9からは未対応?)
・YARN(今後の主流?)

など複数の選択肢から選べるようですが、今回は一番構築がお手軽そうな
「Spark Standalone Mode」を選択しました。

Spark Standalone Mode
こちらを参考に構築していきます。

※結構はまったので、手順が漏れているかもしれません。





環境



Debian 7のサーバーを2台仮想で用意しました。

masterサーバー(192.168.1.3)
slaveサーバー(192.168.1.5)

ドキュメントを見てみると、各々のサーバーにSparkをインストールする必要はないようです。

masterサーバー(192.168.1.3)に以下の手順でSparkをインストールしました。
Apache Spark を Debian 7(wheezy)にインストール

インストールディレクトリは「/opt/spark-0.8.1-incubating」になります。








masterサーバー(192.168.1.3)の設定



まず、Sparkをインストールしたmasterサーバーでの作業手順から。


Sparkのインストールディレクトリに移動して、「./make-distribution.sh」を実行します。


master# ./make-distribution.sh




これで、/opt/spark-0.8.1-incubatingの「dist」に実行に必要な資産を集めた
ディレクトリが作成されます。

今後、この「/opt/spark-0.8.1-incubating/dist」で作業を行います。



・spark-env.shの作成

/opt/spark-0.8.1-incubating/dist/conf/spark-env.sh.templateをコピーして、
/opt/spark-0.8.1-incubating/dist/conf/spark-env.shを作成します。


master# cd /opt/spark-0.8.1-incubating/dist
master# cp conf/spark-env.sh.template conf/spark-env.sh




内容を編集


master# vi conf/spark-env.sh




最低限必要なのは、SPARK_MASTER_IPの指定です。
masterとなるサーバー、今回は192.168.1.3のIPアドレスを指定します。


#!/usr/bin/env bash

# This file contains environment variables required to run Spark. Copy it as
# spark-env.sh and edit that to configure Spark for your site.
#
# The following variables can be set in this file:
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos
# - SPARK_JAVA_OPTS, to set node-specific JVM options for Spark. Note that
# we recommend setting app-wide options in the application's driver program.
#     Examples of node-specific options : -Dspark.local.dir, GC options
#     Examples of app-wide options : -Dspark.serializer
#
# If using the standalone deploy mode, you can also set variables for it here:
# - SPARK_MASTER_IP, to bind the master to a different IP address or hostname
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much memory to use (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT
# - SPARK_WORKER_INSTANCES, to set the number of worker processes per node

SPARK_MASTER_IP=192.168.1.3






・slavesの作成

/opt/spark-0.8.1-incubating/conf/slavesファイルを、
/opt/spark-0.8.1-incubating/dist/conf/slavesにコピーします。


master# cp /opt/spark-0.8.1-incubating/conf/slaves /opt/spark-0.8.1-incubating/dist/conf/slaves




内容を編集


master# vi /opt/spark-0.8.1-incubating/dist/conf/slaves




ファイルには最初「localhost」とだけ記載されていると思います。
slaveとなる192.168.1.5を追記します。


# A Spark Worker will be started on each of the machines listed below.
localhost
192.168.1.5






・password-less ssh接続の設定

masterサーバーからslaveに起動命令を実行するとき、sshコマンドが使用されます。

※後から知りました。slaveサーバーで個別にコマンドを実行するなら、この作業は不要。

bashからsshコマンドを実行した時パスワード入力で止まらないようにするため、
上記slavesファイルに記載したサーバーにはパスワード無しでsshログインできるようにしておきます。
対象には、localhostも含みます。


password-less ssh接続は別途調べておきました。
ssh接続時パスワードを入力しない、password-less ssh接続の設定方法

ssh-keygenとssh-copy-idを使用して、パスワード無しでslaveの
localhost
192.168.1.5
に接続できるようにしておきます。


これで、一旦masterサーバーでの作業は終了です。







slaveサーバー(192.168.1.5)の設定



これからは、slaveサーバー(192.168.1.5)の設定を行います。

slaveには、まずJavaのインストールを行います。


slave# apt-get -y install openjdk-7-jdk




次に、masterサーバーで「./make-distribution.sh」を実行して作成した
「dist」フォルダをmasterと全く同じディレクトリ構成
「/opt/spark-0.8.1-incubating/dist」にコピーします。

じゃないと、masterからssh経由でのslave起動に失敗します。


最初、自動でmasterに作成したdistフォルダがコピーされるんだろと思っていたのですが、
どうもそういう訳では無いようです。
※ここはなにか勘違いしているかも。


slave側(192.168.1.5)の手順はこれだけです。
master側(192.168.1.3)に戻って起動を試してみます。







masterサーバー(192.168.1.3)でSparkの起動



masterサーバーに戻って来ました。
「/opt/spark-0.8.1-incubating/dist」に移動します。


master# cd /opt/spark-0.8.1-incubating/dist




「bin/start-master.sh」で起動。


master# bin/start-master.sh




これでマスターが起動しました。
ブラウザでhttp://(masterサーバーのIP):8080/を表示すると、こんな画面が表示されます。

262_01.png



続いて「bin/start-slaves.sh」でslaveの起動です。


master# bin/start-slaves.sh


slaveが起動した後、ブラウザをリロードしてみます。
ちゃんと2つのノードが認識されました。

262_02.png







pysparkから接続



pythonのシェルでこのクラスタに接続してみます。

Apache Spark をPythonで操作する(pyspark)
通常の場合は、「./pyspark」を実行するだけでしたが、
クラスタに接続する場合は、
「MASTER=spark://masterサーバーIP:7077 ./pyspark」
となります。


master# cd /opt/spark-0.8.1-incubating/dist
master# MASTER=spark://192.168.1.3:7077 ./pyspark




シェルが起動したら、ブラウザを再度リロードしてみます。
「Running Applications」に「PySparkShell」が追加されていると思います。

262_03.png

262_04.png

クラスタの一部を間借りしてるというか、なんか気持ちいいです。







解析対象のテキストファイルの扱い



共有ストレージでなく、ローカルHDDに保存しているテキストファイルも解析可能です。
ただし、同じパスにファイルが存在している必要があります。

動作確認のため、各々のサーバーに/tmp/test.txtを作成しました。

あえて内容は異なるものにしています。

master側

A master
B master
C master



slave側

A slave
B slave
C slave




PySparkShellで、「A」が登場する行を数えてみました。


  1. Using Python version 2.7.3 (default, Jan 2 2013 13:56:14)
  2. Spark context avaiable as sc.
  3. >>> logData = sc.textFile('/tmp/test.txt')
  4. >>> lines = logData.filter(lambda s: 'A' in s)
  5. >>> num = lines.count()
  6. >>> print(num)
  7. 1




違うファイルだから「2」って表示されるかな?と思っていましたが、やはり1となります。


slaveの/tmp/test.txtをちょっと編集。

C slave
B slave
A slave



AとCの位置を入れ替えてみました。
同じソースを実行すると、


  1. >>> logData = sc.textFile('/tmp/test.txt')
  2. >>> lines = logData.filter(lambda s: 'A' in s)
  3. >>> num = lines.count()
  4. >>> print(num)
  5. 0



今度は0になりました。


まあ、解析対象のファイルはHadoopか共有ストレージに置いとけってことですね。




テーマ:サーバ - ジャンル:コンピュータ

  1. 2013/12/31(火) 17:09:25|
  2. Scala
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Apache Spark の Web UI

ログのプロパティファイルが見つからないエラーが嫌だったので、log4j.propertiesを配置しました。
Apache Spark spark-shell起動時のログの警告に対処する(log4j.properties)


ただそれだけだったのですが、表示されているログの内容を見てみると、


Started Spark Web UI at http://192.168.1.3:4040



Web UIがあることをここで初めて知りました。
spark-shellを起動した時に、Webサーバーも起動していたとは。



Spark Web UI



spark-shellを起動した後、指定されたアドレス(http://[サーバーIP]:4040/)を
ブラウザで表示するとこんな画面が表示されます。

261_01.png

261_02.png

261_03.png

261_04.png



起動しているspark-shellで適当に解析を実行してやります。


scala> val txtFile = sc.textFile("README.md")
scala> txtFile.filter(line => line.contains("Spark")).count()





こんな感じで、処理内容が更新されました。

261_05.png

261_06.png

テーマ:サーバ - ジャンル:コンピュータ

  1. 2013/12/31(火) 13:58:29|
  2. Scala
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Apache Spark spark-shell起動時のログの警告に対処する(log4j.properties)

Apache Sparkのspark-shellを実行した時、こんな警告が表示されます。


log4j:WARN No appenders could be found for logger (org.eclipse.jetty.util.log).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.




設定ファイルはどこだろ?と思い調べてみると、

Spark Configuration
https://spark.incubator.apache.org/docs/0.8.1/configuration.html

conf/log4j.propertiesを作成すればOK。


conf/log4j.properties.templateというファイルが用意されているので、
今回はそれをコピーしてそのまま使って見ることにしました。


# cp conf/log4j.properties.template conf/log4j.properties





コピーした後spark-shellを実行すると、ちゃんとログが画面に表示されます。



# ./spark-shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/spark-0.8.1-incubating/tools/target/scala-2.9.3/spark-tools-assembly-0.8.1-incubating.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/spark-0.8.1-incubating/assembly/target/scala-2.9.3/spark-assembly-0.8.1-incubating-hadoop1.0.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Welcome to
     ____             __
     / __/__ ___ _____/ /__
    _\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 0.8.1
     /_/                

Using Scala version 2.9.3 (OpenJDK 64-Bit Server VM, Java 1.7.0_25)
Initializing interpreter...
13/12/31 13:19:51 WARN Utils: Your hostname, spark2 resolves to a loopback address: 127.0.1.1; using 192.168.1.3 instead (on interface eth0)
13/12/31 13:19:51 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
Creating SparkContext...
13/12/31 13:19:56 INFO Slf4jEventHandler: Slf4jEventHandler started
13/12/31 13:19:56 INFO SparkEnv: Registering BlockManagerMaster
13/12/31 13:19:56 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20131231131956-d155
13/12/31 13:19:56 INFO MemoryStore: MemoryStore started with capacity 323.9 MB.
13/12/31 13:19:56 INFO ConnectionManager: Bound socket to port 50292 with id = ConnectionManagerId(192.168.1.3,50292)
13/12/31 13:19:56 INFO BlockManagerMaster: Trying to register BlockManager
13/12/31 13:19:56 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.1.3:50292 with 323.9 MB RAM
13/12/31 13:19:56 INFO BlockManagerMaster: Registered BlockManager
13/12/31 13:19:56 INFO HttpBroadcast: Broadcast server started at http://192.168.1.3:41427
13/12/31 13:19:56 INFO SparkEnv: Registering MapOutputTracker
13/12/31 13:19:56 INFO HttpFileServer: HTTP File server directory is /tmp/spark-fc8362b2-9e99-42fa-80bf-54931d74a2eb
13/12/31 13:19:56 INFO SparkUI: Started Spark Web UI at http://192.168.1.3:4040
13/12/31 13:19:56 INFO Executor: Using REPL class URI: http://192.168.1.3:32902
Spark context available as sc.
Type in expressions to have them evaluated.
Type :help for more information.

scala>

テーマ:サーバ - ジャンル:コンピュータ

  1. 2013/12/31(火) 13:31:55|
  2. Scala
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ