livy安装测试

一、R安装

如果未安装R,可以先安装R,用于支持SparkR,如果yum源中没有R语言的安装包,可以从官网下载相应版本进行手动编译安装。

sudo yum install R

安装rJava
下载地址:
https://cran.r-project.org/web/packages/rJava/index.html
将下载好的软件包上传至/data/soft目录下
执行以下代码:

sudo R CMD INSTALL rJava_0.9-8.tar.gz

二、livy编译安装

1、安装说明

livy是一个提供restful风格,可以通过http方式访问spark,从而启动spark-submit或spark-shell来提交任务的框架。

安装运行livy需要以下软件环境:

可以联网的Centos环境用于maven下载相关jar包
mvn (from maven package or maven3 tarball)
java-1.7.0-openjdk (or Oracle Java7 jdk)
Python 2.6+
R 3.x

运行livy需要python的以下依赖库:

cloudpickle
requests
flake8
flaky
pytest

2、livy下载解压

1)、下载

https://github.com/cloudera/livy/releases

或者使用该命令直接下载:

wget https://github.com/cloudera/livy/archive/v0.2.0.tar.gz

由于hue-3.11.0版本以后,将livy移出hue项目,独立成为一个项目,所以需独立下载。而hue-3.10.0版本之前,livy项目源码在/hue-3.10.0/apps/spark/java该目录下,如果使用hue-3.10.0版本或之前的版本直接到/hue-3.10.0/apps/spark/java该目录下编译就好。

2)、解压

将软件包移动至/home/hadoop/soft目录下,然后进行解压:

cd /home/hadoop/soft    
tar –xvzf livy-0.2.0.tar.gz -C ./home/app

3、编译

export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m -XX:MaxPermSize=512M"
    mvn -Dmaven.test.skip clean package
注: export MAVEN_OPTS=”-Xmx2g -XX:ReservedCodeCacheSize=512m -XX:MaxPermSize=512M”,编译过程中需要大量的内存。如果maven设置的内存不足,将导致导内存溢出异常。
编译时,一定要增加-Dmaven.test.skip这句话,忽略Junit测试类的编译,否则,导致编译失败。主要因为部分Junit测试类存在问题,比如编译TestSparkClient过程中会去绑定localhost/192.157.208.178:0,而192.157.208.178属于美国的一个ip地址,导致绑定失败,无法进行后续编译。

livy pyspark 任务 livy for spark2 server_livy

编译过程中会下载大量的依赖jar包,中途可能因为网络原因,导致jar包下载失败,从而也会导致编译失败。出现该情况可以使用该命令进行重新编译:

mvn -DskipTests clean package

最终看到所有模块都success,就表示成功了。

livy pyspark 任务 livy for spark2 server_livy pyspark 任务_02

4、无法联网环境编译livy

先在可联网的linux环境下编译成功livy,然后将maven仓库中的jar包传输至无法联网的linux环境下,进行覆盖,执行编译命令前,先执行:

find ~/.m2/repository -name _remote.repositories |xargs rm –rf

将mvn本地仓库的_remote.repositories文件删除,这样就可以阻止mvn联网去更新jar包的pom文件。然后执行编译命令:

mvn -Dmaven.test.skip clean package

当然在联网的linux环境下编译的livy包,上传至其他linux环境也是可以使用的。

5、配置livy

1)、更改livy-0.2.0目录名称:
cd /bigdata
mv livy-0.2.0/ livy
2)、环境变量配置
sudo vim /etc/profile

添加如下内容:

export SPARK_HOME=/bigdata/spark
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

由于livy启动需要知道Spark的安装路径以及hadoop配置文件的路径。
livy默认会从SPARK_HOME/conf下读取spark的配置文件,如果要个性化覆盖默认的spark配置文件,可以配置SPARK_CONF_DIR来额外指定相关配置。
当然也可以在LIVY_HOME/conf/livy-env.sh进行相关的配置,而无需更改/etc/profile文件

注:livy-0.2.0将对spark的配置直接使用了SPARK_HOME/conf中的配置,之前版本并不是。

由于HADOOP_CONF_DIR在搭建spark on yarn中已经添加,此处无需重复添加。

3)、spark on yarn-cluster启动模式配置

由于livy强烈推荐使用yarn-cluster模式进行配置spark,如果多用户操作的时候,可以减轻driver端的压力,防止过载,因此需在SPARK_HOME/conf配置spark-submit的默认启动方式为yarn-cluster模式:

vim $SPARK_HOME/conf/spark-defaults.conf

添加内容如下:

spark.master yarn
spark.submit.deployMode cluster

spark所有配置如下:

http://spark.apache.org/docs/latest/configuration.html

4)、livy的spark黑名单配置
$LIVY_HOME/spark-blacklist.conf

该文件列出的项表示自livy启动后,无法更改spark的启动模式和spark的相关配置。比如,如果不配置spark的启动模式,livy默认使用client模式启动spark,那么后续要更改为cluster启动模式,如果不注释掉spark.submit.deployMode该项,则无法启动spark。这边说的可能有点绕,后续会有测试例子证明,就容易明白了。

4)、日志目录配置
vim /bigdata/livy/livy-env.sh

添加内容如下

LIVY_LOG_DIR=/data/logs/livy

6、使用pip安装python相关依赖库

1)、安装pip

可联网的环境可以使用pip安装python库。查看是否安装pip可以使用如下命令查看。

pip -V

则会出现安装的pip版本,如下:
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
如未安装则执行以下命令进行安装:

wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

先从网上下载get-pip.py文件,然后运行python get-pip.py便会自动下载相关python库进行安装。

2)、更改pip源

安装成功以后,如果使用默认的pip源,可能会有点慢,毕竟访问的是国外的网站,而且该源还被墙过,很不稳定。则可以修改为国内的pip源,豆瓣的就不错:

vim /etc/pip.conf

/etc目录下并不存在pip.cof文件,须手动添加,然后加入以下内容

[global]
  mirrors = https://pypi.douban.com/simple/
  trusted-host = pypi.douban.com

保存退出即可。由于访问豆瓣源使用的是https协议,所以需要添加信任,如果不加trusted-host = pypi.douban.com这句话,则无法成功访问。

3)、使用pip安装python软件包
sudo pip install cloudpickle
sudo pip install requests
sudo pip install flake8
sudo pip install flaky
sudo pip install pytest

7、手动安装python依赖库

如果你的集群环境无法联网,很不幸,那么只能手动安装相关python包了。

1)、安装setuptools:
sudo yum install python-setuptools

该工具包用于安装第三方python软件包,如果yum源有,那直接使用yum进行安装,如果没有,那只能下载相关的包进行安装了。

2)、安装requests

下载地址:https://pypi.python.org/pypi/requests#downloads
将下载好的软件包上传至bigdata1:/data/soft目录下,解压:

cd /data/soft   
tar -xvzf requests-2.10.0.tar.gz –C ./python
cd /soft/python/requests-2.10.0
sudo python setup.py build
sudo python setup.py install

验证:

python
import requests

不报错便安装成功了。

3)、安装cloudpickle

下载地址:https://github.com/cloudpipe/cloudpickle/releases
将下载好的软件包上传至bigdata1:/data/soft目录下,解压:

cd /data/soft
tar -xvzf cloudpickle-0.1.1.tar.gz –C ./python
cd /soft/python/cloudpickle-0.1.1
sudo python setup.py build
sudo python setup.py install

验证:

python
import pickle

不报错便安装成功了。

4)、安装pytest

下载地址:https://pypi.python.org/pypi/pytest/#downloads
将下载好的软件包上传至bigdata1:/data/soft目录下,解压:

cd /data/soft
tar -xvzf pytest-3.0.3.tar.gz –C ./python
cd /soft/python/pytest-3.0.3
sudo python setup.py build
sudo python setup.py install

安装过程中出错:

livy pyspark 任务 livy for spark2 server_livy pyspark 任务_03

需要安装py。
下载地址:https://pypi.python.org/simple/py/
将下载好的软件包上传至bigdata1:/data/soft目录下,解压:

cd /data/soft   
tar -xvzf py-1.4.31.tar.gz –C ./python
cd /soft/python/py-1.4.31
sudo python setup.py build
sudo python setup.py install

重新安装pytest。
验证:

python
import pytest

不报错便安装成功了。

5)、安装flaky

下载地址:https://github.com/box/flaky/releases
将下载好的软件包上传至bigdata1:/data/soft目录下,解压:

cd /data/soft   
tar -xvzf flaky-3.1.1.tar.gz  –C ./python
cd /soft/python/flaky-3.1.1
sudo python setup.py build
sudo python setup.py install

验证:

python
import flaky

不报错便安装成功了。

6)、安装flake8

去yum源查询是否具有该软件包。

yum list | grep flake8
sudo yum install python-flake8

验证:

python
import flake8

不报错便安装成功了。

8、livy测试

1)、启动livy
/bigdata/livy/bin/livy-server
2)、测试livy之spark-shell

参考网址:http://gethue.com/how-to-use-the-livy-spark-rest-job-server-for-interactive-spark-2-2/

  • 查看当前存在的会话
curl localhost:8998/sessions

返回:{“from”:0,”total”:0,”sessions”:[]}
表示当前并没有会话存在。

  • 创建pyspark会话
curl -X POST --data '{"kind": "pyspark"}' -H "Content-Type:application/json" localhost:8998/sessions

返回:{“id”:0,”state”:”starting”,”kind”:”pyspark”,”log”:[]}
表明该会话已经启动,并生成会话id为0,之后便可以通过该会话提交我们的任务。

  • 查看当前会话状态
curl localhost:8998/sessions/0 | python -m json.tool

返回:

livy pyspark 任务 livy for spark2 server_r语言_04


state为idle表示该会话存活,已经准备就绪,可以向该会话提交任务了。| python -m json.tool这是管道命令,把返回的结果格式化显示。

  • 提交任务
curl localhost:8998/sessions/0/statements -X POST -H 'Content-Type: application/json' -d '{"code":"1 + 1"}'

返回:{“id”:0,”state”:”running”,”output”:null}
表示该任务正在运行中,并生成了一个statement,id为0,我们便可以查看该statement的运行状态及结果。

  • 查看任务结果
curl localhost:8998/sessions/0/statements/0

如果返回:

livy pyspark 任务 livy for spark2 server_r语言_05


则表示任务成功完成。如果返回:

livy pyspark 任务 livy for spark2 server_livy pyspark 任务_06


则表示任务失败,主要原因是由于json4s版本兼容问题导致的,如果spark在编译前中未做如下修改将会出现以上错误:

修改:$SPARK_HOME目录下的pom.xml文件

cd /bigdata/spark
vim pom.xml

livy pyspark 任务 livy for spark2 server_livy_07


将该jar包的版本更改为3.2.10便不会报该异常。

  • 继续提交任务

执行:

curl localhost:8998/sessions/0/statements -X POST -H 
'Content-Type: application/json' -d '{"code":"a = 10"}'

返回:{“id”:1,”state”:”running”,”output”:null}
为0的session中创建新的statements,id为1

执行:

curl localhost:8998/sessions/0/statements -X POST -H 'Content-Type: application/json' -d '{"code":"a + 1"}'

返回:{“id”:2,”state”:”running”,”output”:null}
创建新的statements,为2,并执行a+1操作

执行:

curl localhost:8998/sessions/0/statements/2

返回:{“id”:2,”state”:”available”,”output”:{“status”:”ok”,”execution_count”:2,”data”:{“text/plain”:”11”}}}
查询session为0,statement为2的结果

  • 删除会话

执行:

curl localhost:8998/sessions/0 -X DELETE

返回:{“msg”:”deleted”}

  • 创建会话,并携带spark配置
    执行:
curl -X POST --data '{"kind": "pyspark", "numExecutors": 3, "executorMemory": "2G"}' -H "Content-Type: application/json" localhost:8998/sessions

返回:{“id”:3,”owner”:null,”proxyUser”:null,”state”:”starting”,”kind”:”pyspark”,”log”:[]}

3)、测试livy-batch之spark submit jar

参考网址:http://gethue.com/how-to-use-the-livy-spark-rest-job-server-api-for-submitting-batch-jar-python-and-streaming-spark-jobs/

  • 查询当前存在的会话
curl localhost:8998/sessions | python -m json.tool

livy pyspark 任务 livy for spark2 server_spark_08

  • 创建livy-batch会话

创建一个会话用于提交jar包,由于集群部署在spark on yarn上,所以需要将jar包提交到hdfs集群中,放置在根目录下,并且通过file指定hdfs中jar包的在hdfs中的路径,此时会返回一个id,这样我们可以根据id进行查询日志和运行结果:
执行:

curl -X POST --data '{"file": "/spark-examples_2.10-2.0.1.jar", "className": "org.apache.spark.examples.SparkPi"}' -H "Content-Type: application/json" localhost:8998/batches

返回:{“id”:0,”state”:”running”,”log”:[]}

  • 查看任务执行日志
    执行:
curl localhost:8998/batches/0/log |  python -m json.tool

如果返回

livy pyspark 任务 livy for spark2 server_spark_09

主要因为在$SPARK_HOME/conf并未配置spark-submit的默认启动方式为yarn-cluster模式,livy-batch默认采用client模式启动spark-submit,而当spark-submit采用yarn-client模式提交,是无法读取hdfs上的内容,所以需要更改spark-submit启动模式为yarn-cluster,才能从hdfs中读取jar包。

解决方案:
方案一:
可执行:

curl -X POST --data '{"file": "/spark-examples_2.10-2.0.1.jar", "className": "org.apache.spark.examples.SparkPi","conf":{"spark.master":"yarn","spark.submit.deployMode":"cluster"}}' -H "Content-Type: application/json" localhost:8998/batches

如果返回:

“Blacklisted configuration values in session config: spark.master, spark.submit.deployMode”
注:这个须配置livy的spark-blacklist.conf文件,该文件中定义的属性表示客户端提交任务至spark不可修改spark的启动模式,按livy默认的启动模式client启动。如果我们提交jar包须使用cluster,则须修改该文件的内容,放开权限。

vim /bigdata/livy/conf/spark-blacklist.conf

修改如下,将这两行使用#注释掉:

spark.master
spark.submit.deployMode

注释掉,保存退出,重启livy。

执行:

curl -X POST --data '{"file": "/spark-examples_2.10-2.0.1.jar", "className": "org.apache.spark.examples.SparkPi","conf":{"spark.master":"yarn","spark.submit.deployMode":"cluster"}}' -H "Content-Type: application/json" localhost:8998/batches

返回:
{“id”:3,”state”:”running”,”log”:[]}

方案二:
修改spark-submit的默认启动模式为yarn-cluster具体的修改上文已经提及,及修改$SPARK_HOME/conf/spark-defaults.conf文件的启动模式为yarn-cluster。

注:
推荐采用方案二修改spark-submit启动模式,当hue与livy、spark整合时就是采用方案二来指定spark-submit的集群模式。

  • 查看任务结果
curl localhost:8998/batches/3 | python -m json.tool

livy pyspark 任务 livy for spark2 server_r语言_10


看到success就表示成功了。

4)、测试livy-batch之 spark submit python

pi.py脚本所在位置

$SPARK_HOME/examples/src/main/python/pi.py

将脚本上传至hdfs中

hadoop fs -put $SPARK_HOME/examples/src/main/python/pi.py /
  • 提交任务
curl -X POST --data '{"file": "/pi.py"}' -H "Content-Type: application/json" localhost:8998/batches

返回:{“id”:5,”state”:”running”,”log”:[]}

  • 查看日志
curl localhost:8998/batches/5/log |  python -m json.tool
  • 查看结果
curl localhost:8998/batches/6 | python -m json.tool

最终返回:

livy pyspark 任务 livy for spark2 server_livy pyspark 任务_11


看到success就表示成功了。

至此livy整合spark就成功了,下一章将整合hue livy spark


欢迎拍砖,相互学习,相互进步