HadoopTimes

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

MapR、Mesos、Marathon、Docker、Apache Sparkを使用し、最初のジョブおよびコンテナを展開、実行する

MapR

イントロダクション

このブログの投稿では、Mesos、Marathon、Docker、SparkをMapRクラスタ上で展開する手順と、この展開を用いて様々なジョブやDockerコンテナ を実行する手順を説明します。

下記のコンポネントを使用します:

  • Mesos: オープンソースクラスタマネージャー
  • Marathon: クラスタワイドの初期化および管理システム
  • Spark: オープンソースクラスタコンピューティングフレームワーク
  • Docker: ソフトウェアコンテナ内のアプリケーション展開を自動化
  • MapRコンバージドデータプラットフォーム: 新世代ビッグデータアプリケーションを担う、HadoopやSpark、リアルタイムデータベースケイパビリティ、グローバルイベントストリーミング、スケーラブルエンタープライズストレージの統合環境。

前提

このチュートリアルは、MapR 5.1.0クラスタが既に実行されていることを前提とします。検証目的では、シングルーノード構成も可能です。この例では3ノード構成のMapR上でMesosを展開します。以下のような構成になります:

  • Mesos Master: MAPRNODE01
  • Mesos Slave: MAPRNODE02, MAPRNODE03

さて始めましょう!

必要条件

# Make sure Java 8 is installed on all the nodes in the cluster
java -version 

# If Java 8 is not yet installed, install it and validate
yum install -y java-1.8.0-openjdk
java -version

# Set JAVA_HOME to Java 8 on all the nodes
echo $JAVA_HOME

# If JAVA_HOME isn't pointing towards Java 8, fix it and test again
# Please make sure that: /usr/lib/jvm/java-1.8.0-* is matching your java 8 version
vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-2.b17.el7_1.x86_64/jre

# Load and validate the newly set JAVA_HOME
source /etc/profile
echo $JAVA_HOME

以上でJavaの正しいバージョンを設定しました。次にMesos repositoryをインストールしましょう。そこからバイナリーを検索できるようになります。

Mesos repositoryのインストール

お使いのCentOSのバージョンに適したMesos repositoryバージョンであることを確認してください。

# Validate your CentOS version
cat /etc/centos-release

# for CentOS 6.x
rpm -Uvh http://repos.mesosphere.com/el/6/noarch/RPMS/mesosphere-el-repo-6-2.noarch.rpm

# for CentOS 7.x
rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm

以上でMesos repositoriesがインストールされました。次にMesosとMarathonのインストールを始めます。

MesosとMarathonのインストール

# On the node(s) that will be running the Mesos Master (e.g., MAPRNODE01):
yum install mapr-mesos-master mapr-mesos-marathon

# On the nodes that will be running the Mesos Slave (e.g., MAPRNODE02, MAPRNODE03):
yum install mapr-mesos-slave

# Run on all nodes to make the MapR cluster is aware of the new services
/opt/mapr/server/configure.sh -R

# Validate the Mesos Web UI to see the master and slave http://MAPRNODE01:5050

シェルからMesosジョブを実行します。

# Launch a simple Mesos job from the terminal by executing:
MASTER=$(mesos-resolve `cat /etc/mesos/zk`)
mesos-execute --master=$MASTER --name="cluster-test" --command="sleep 5"

コンソールアウトプットはタスクが作成され、そしてステータスがTASK_RUNNINGからTASK_FINISHEDへ変化することを示します。これに加えて、MesosコンソールUIのフレームワークページ(http://MAPRNODE01:5050)上で、新たにターミネートされたフレームワークを確認する必要があります。

Marathonを使ってMesosジョブを実行する

ブラウザでhttp://MAPRNODE01:8080 を開きMarathonを表示します。「Create Application」 をクリックしてください。

# Create a simple app to echo out 'hello' to a file.
ID: cluster-marathon-test
CPU's: 0.1
Memory: 32
Disk space: 0
Instances: 1
Command: echo "hello" >> /tmp/output.txt
# Click "Create Application"

ジョブが展開され、開始することを確認するためにMarathonコンソール(http://localhost:8080) をチェックします。

marathonコンソール

または:

# Check the job output to see "hello" being written constantly
tail -f /tmp/output.txt

ブラウザでhttp://localhost:5050を開き、Mesosのアクティブタスクを確認します。

Mesosアクティブタスク

最後にMarathonコンソール(http://MAPRNODE01:8080) を開いてアプリケーションを削除します。「cluster-marathon-test」 アプリケーションをクリックし、「config」のドロップダウンから「destory」を選択してください。

Marathonコンソール

MesosでDockerコンテナを起動する

以上でMesosが起動しました。これでDockerコンテナをスケールさせて実行することも容易です。Mesos Slaveを実行しているすべてのノードでDockerをインストールし、それらのコンテナを起動します:

全てのMesos SlavemノードにDockerをインストールする

# Download and install Docker on all Mesos Slave nodes
curl -fsSL https://get.docker.com/ | sh

# Start Docker
service docker start
chkconfig docker on

# Configure Mesos Slaves to allow docker containers
# On all mesos slaves, execute:
echo 'docker,mesos' > /etc/mesos-slave/containerizers
echo '5mins' > /etc/mesos-slave/executor_registration_timeout

# Restart the mesos-slave service on all nodes using the MapR MCS

以上でDockerがインストールされました。この例では、Marathonを用いてシンプルにhttpdウェブサーバーのDockerコンテナを実行します。

# Create a JSON file with the Docker image details to be launched on Mesos using Marathon
vi /tmp/docker.json

# Add the following to the json file:
{
  "id": "httpd",
  "cpus": 0.2,
  "mem": 32,
  "disk": 0,
  "instances": 1,
  "constraints": [
    [
      "hostname",
      "UNIQUE",
      ""
    ]
  ],
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "httpd",
      "network": "BRIDGE",
      "portMappings": [
        {
          "containerPort": 80,
          "protocol": "tcp",
          "name": "http"
        }
      ]
    }
  }
}

# Submit the docker container using the created docker.json file to Marathon from the terminal
curl -X POST -H "Content-Type: application/json" http://MAPRNODE01:8080/v2/apps -d@/tmp/docker.json

ブラウザーで(http://localhost:8080) を開き、httpd Dockerコンテナを配置します。

dockerコンテナ

IDフィールドの下にMarathonはDockerコンテナのハイバーリンクを表示します。(ポートは、動的に生成されるので、この例とは異なることに注意してください。) リンクをクリックするとhttpdコンテナへ接続します。

httpd起動成功

Marathonを用いて、Mesos上でDockerコンテナの起動に成功しました。Mesosインフラ上で様々なDockerコンテナを同様の手順で起動できます。さらに、Dockerコンテナがどの物理ノード内で稼働していても、MapRのユニークなNFS機能を用いることで、MapRコンバージドデータプラットフォーム上のあらゆるデータへアクセスすることができます。また、DockerコンテナをセキュアにMapR-FSへ接続したい場合は、MapR POSIX Clientの使用をお勧めします。下記の私のコミュニティポストで、どのようにして行うか説明しています。

MapR POSIX Clientを用いてDockerコンテナをセキュアにMapR-FSに接続する

Mesosクラスタ上でDockerコンテナを起動できるようになりました。次は同じインフラ上でSpark Jobsを起動しましょう。

Mesos上でSparkジョブをインストール、起動する

# Install Spark on the MapR node (or nodes) from which you want to submit jobs
yum install -y mapr-spark-1.6.1*

# Create the Spark Historyserver folder on the cluster
hadoop fs -mkdir /apps/spark
hadoop fs -chmod 777 /apps/spark

# Tell the cluster that new packages have been installed
/opt/mapr/server/configure.sh -R

# Download Spark 1.6.1 - Pre-built for Hadoop 2.6
wget http://d3kbcqa49mib13.cloudfront.net/spark-1.6.1-bin-hadoop2.6.tgz

# Deploy Spark 1.6.1 on the MapR File System so Mesos can reach it from every MapR node
hadoop fs -put spark-1.6.1-bin-hadoop2.6.tgz /

# Set Spark to use Mesos as the execution framework
vi /opt/mapr/spark/spark-1.6.1/conf/spark-env.sh

# Set the following parameters, and make sure the libmesos version matches your installed version of Mesos
export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos-0.28.2.so
export SPARK_EXECUTOR_URI=hdfs:///spark-1.6.1-bin-hadoop2.6.tgz

Mesos上でSparkをテストするために、シンプルなspark-shellコマンドを実行します:

# Launch the Spark shell job using Mesos as the execution framework
/opt/mapr/spark/spark-1.6.1/bin/spark-shell --master mesos://zk://MAPRNODE01:5181/mesos

# You should now see the Spark shell as an active framework in the Mesos UI
# Execute a simple Spark job using Mesos as the execution framework
val data = 1 to 100
sc.parallelize(data).sum()

spark-submitを用いて、SparkジョブをMesosへ送信します。

# Run a Spark Submit example to test Spark on Mesos and MapR
/opt/mapr/spark/spark-1.6.1/bin/spark-submit \
--name SparkPiTestApp \
--master mesos://MAPRNODE01:5050 \
--driver-memory 1G \
--executor-memory 2G \
--total-executor-cores 4 \
--class org.apache.spark.examples.SparkPi \
/opt/mapr/spark/spark-1.6.1/lib/spark-examples-1.6.1-mapr-1605-hadoop2.7.0-mapr-1602.jar 10

トラブルシューティング

Mesos、Marathon、Spark、Dockerのような様々なコンポネントの潜在的な問題を見つけるためにトラブルシューティングすることは、関連したコンポネントの量があることから、容易ではありません。トラブルシューティングのための5つのヒントは以下になります。:

# 1. Marathon ポート番号: 8080
このポート番号は、Spark Masterと競合する可能性があります。

# 2. ログ情報
Mesos Masterと SlaveノードはRespectiveノードの/var/log/mesos/へログ情報が書き出されます。

# 3. いくつかのジェネリックなMesos MasterやSlaveと同様にMarathonも/var/log/messagesへログを書き出しますので、以下のコマンドでログを確認できます。
tail -f /var/log/messages

# 4. 追加のコンソールログイングを有効にするためには、Mesos上でSpark-submitを実行する前に以下のexportを実行してください。
export GLOG_v=1

# 5. 回復エラーログ: IO error
このエラーメッセージはMesosの実行を rootユーザで行ったことがあり、現在rootユーザ以外(例えば maprユーザなど)で実行している場合に発生します。
# /var/log/messages内に以下のエラーメッセージが書き出されます。
# 回復エラーログ: IO error /var/lib/mesos/replicated_log/LOCK: Permission denied
chown -R mapr:mapr /var/lib/mesos/replicated_log/

まとめ

このブログの投稿で、Mesos、Marathon、Docker、SparkをMapRクラスタ上で展開する手順と、この展開を用いて様々なジョブやSparkジョブと同様にDockerコンテナ を実行する手順を学びました。

DockerコンテナをセキュアにMapRコンバージドデータプラットフォームへ接続したい場合は、次の私のコミュニティポストを参照してください。

MapR POSIX Clientを用いてDockerコンテナをセキュアにMapR-FSに接続する

 

 

著者情報

マーティン・キーブーム

マーティン・キーブーム

(MapR ソリューションアーキテクト)

実践 機械学習 – レコメンデーションにおけるイノベーション –

実践 機械学習 – レコメンデーションにおけるイノベーション –
機械学習とレコメンデーションにおける、もっとも洗練され、効率的なアプローチの1つに至る鍵は、「仔馬が欲しい」という状況の観察の中にあります。

どれを選べばいいのかめまいがするほどの数多くのアルゴリズムがあり、それらの中から選択をするためだけでも、選択肢を理解し、合理的な判断を行うのに必要な、高度な数学の背景知識を十分に持っていることが前提になります。

こちらの資料は、機械学習とレコメンデーションについて学習したいけれど、どこから始めればよいか迷っているという方におすすめです。

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