在Apache Mesos上运行Apache Spark

这几乎是一个工作日志,并且是为了自己使用(之后可能会编辑成更正式的文章)。
另外,这是在 Qiita 上的首次投稿。

环境

这次使用两台 ConoHa 来构建 Mesos 集群,并在其上运行 Spark。
规格和操作系统如下所示。

    • Master: ConoHa RAM 1GB プラン, CentOS 7.2

 

    Slave: ConoHa RAM 2GB プラン, CentOS 7.2

使用了以下版本的Mesos和Spark。
两者都应该是 2016/12/7 当时的最新版本。

    • Apache Mesos: v1.1.0

 

    Apache Spark: v2.0.2

安装Mesos

请参考公式文档进行工作推进。
请在Master和Slave两个环节上都进行工作。

$ sudo yum install -y tar wget git
$ sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
$ sudo yum install -y epel-release
$ sudo bash -c 'cat > /etc/yum.repos.d/wandisco-svn.repo <<EOF
[WANdiscoSVN]
name=WANdisco SVN Repo 1.9
enabled=1
baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
EOF'
$ sudo yum update systemd
$ sudo yum groupinstall -y "Development Tools"
$ sudo yum install -y apache-maven python-devel java-1.8.0-openjdk-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel subversion-devel apr-util-devel

尽管文件中没有提到,但在编译时会出现错误,所以请先安装pip和pytz。

$ sudo yum install python-pip
$ sudo pip install --upgrade pytz

下载 Mesos。

$ wget http://archive.apache.org/dist/mesos/1.1.0/mesos-1.1.0.tar.gz
$ tar zxvf mesos-1.1.0.tar.gz
$ cd mesos-1.1.0

进行Mesos的编译和构建。

$ mkdir build
$ cd build
$ ../configure
$ make
$ sudo make install

Spark的安装

请在主从两个角色中都进行工作。

将Spark下载到/usr/local,并放置在那里。
为了在以后版本更改时也能适应,先在/usr/local/spark创建一个符号链接。

$ wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.2-bin-hadoop2.7.tgz
$ tar zxvf spark-2.0.2-bin-hadoop2.7.tgz
$ sudo mv spark-2.0.2-bin-hadoop2.7 /usr/local
$ sudo ln -s /usr/local/spark-2.0.2-bin-hadoop2.7 /usr/local/spark

预先进行与Mesos的集成设置。

$ cp conf/spark-env.sh.template conf/spark-env.sh
$ vi conf/spark-env.sh

在末尾添加以下内容。

MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so
SPARK_DRIVER_MEMORY=512M
SPARK_DAEMON_MEMORY=256M

只有在像这样的内存不足的情况下,才需要使用下面的两个设置。

構建主节点

在Master节点上启动mesos-master进程,以便重新启动和自动启动变得更加轻松。这次我们将进程启动交给systemd来处理。(这方面没太多了解,所以只是大概的说明一下…)

$ sudo vi /etc/lib/systemd/system/mesos-master.service
[Unit]
Description=Apache Mesos master
After=network.target

[Service]
ExecStart=/usr/local/sbin/mesos-master --work_dir=/var/lib/mesos-master
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target
sudo systemctl start mesos-master
sudo systemctl enable mesos-master // Optional

在确认mesos-master进程已经启动后,如果您能够在任意机器上访问以下URL并显示Web UI,则表示mesos-master已经成功启动。

http://[Master ノードの IP アドレス]:5050

这次我们不是以客户端模式而是以集群模式启动 Spark,所以要在 Mesos 集群中启动 MesosClusterDispatcher。

$ cd /usr/local/spark
$ sudo sbin/start-mesos-dispatcher.sh --master localhost:5050

如果在之前的Web UI的框架标签中加入Spark Cluster,则启动完成。

奴隶节点建设

在Slave节点上启动mesos-agent进程。同样,将服务管理交给systemd处理。

$ sudo vi /etc/lib/systemd/system/mesos-agent.service
[Unit]
Description=Apache Mesos agent
After=network.target

[Service]
ExecStart=/usr/local/sbin/mesos-agent --master=[Master ノードの IP アドレス]:5050 --work_dir=/var/lib/mesos-slave --resources=mem:1536
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

如果您的环境具有足够的RAM,请删除ExecStart的最后一个参数 –resources=mem:5136

$ sudo systemctl start mesos-agent
$ sudo systemctl enable mesos-agent // Optional

只需要一种选择:“mesos-agent”进程启动后,如果在先前的Web UI的”Agents”标签中显示了主机为从节点的项目,则表示完成。

尝试运行 Spark 的示例

如果能够实现到这一步,就应该能够构建一个在Mesos上使用的Spark集群环境,所以尝试运行一个样例作业。
然而,需要将包含运行程序的jar文件放在可以通过HTTP访问的位置上。
可以将其上传到任意的Web服务器上或者使用像Google Drive这样的云存储服务也是可行的选择。

cd /usr/local/spark
bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master mesos://[Master ノードの IP アドレス]:7077 \
--executor-memory 512M
--deploy-mode cluster \
--supervise \
http://path/to/package.jar \
1000

如果完成的任务中出现了“FINISHED”标签,那么该作业将被视为完成。如果打开最右边的Sandbox链接,stdout中显示以下内容,则说明处理在Spark集群中成功进行了。

Pi is roughly 3.1415941514159416

最终,
最后。

由于这次的建设是在资源相对贫乏的环境下进行的,因此对于使用的内存限制等问题变得相当麻烦。
如果剩余内存过少,甚至会导致 Mesos 的编译失败的可能性(根据经验),所以需要注意。
在构建 Spark 集群时,建议准备一些内存充足的服务器。?

bannerAds