Livy 是一个开源的 REST接口,负责和Apache Spark进行交互。 支持执行片段代码和程序在一个Spark context 里面,可以运行在locally 或者 Apache Hadoop Yarn 模式。
交付式 Scala、Python和R shell
批量提交 Scala、java、Python
多用户可以共享一个server(模拟支持)
可以在任何地方使用REST 提交job
自己的的源码不需要任何修改
1、安装手册
livy.conf 添加如下内容:
livy.repl.enableHiveContext = true
livy.impersonation.enabled = true
livy.server.session.timeout = 1h
livy-env.sh 添加如下内容:
export JAVA_HOME=/usr/java/jdk1.8.0_60
export SPARK_HOME=/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23/lib/spark
export SPARK_CONF_DIR=/etc/spark/conf
export HADOOP_CONF_DIR=/etc/hive/conf
/etc/profile 添加如下内容:
export JAVA_HOME=/usr/java/latest
export LIVY_HOME=/opt/livy
export PATH=$LIVY_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/sbin:$PATH
2、 kerberos 设置
spark livy server 目前执行kerberos 认证,目前只能一个用户启动一个livy server,下面是生存用户的keytab:
addprinc -randkey spark_test
xst -norandkey -k spark_test.keytab spark_test
3、 启动 livy server
拷贝到spark-test 用户,并启动livy server:
[root@cdndc-213044119 bin]# kinit -kt /root/spark_test.keytab spark_test
[root@cdndc-213044119 bin]# pwd
/opt/livy/bin
[root@cdndc-213044119 bin]# ./livy-server
16/12/19 15:43:00 INFO LivyServer: Using spark-submit version 1.6.0
16/12/19 15:43:01 WARN RequestLogHandler: !RequestLog
16/12/19 15:43:01 INFO WebServer: Starting server on http://cdndc-213044119.wdds.com:8998
4、初级测试:
进入python 命令行,进行如下测试:Spark Example
sudo pip install requests
import json, pprint, requests, textwrap
host = 'http://localhost:8998'
data = {'kind': 'spark'}
headers = {'Content-Type': 'application/json'}
r = requests.post(host + '/sessions', data=json.dumps(data), headers=headers)
r.json()
session_url = host + r.headers['location']
r = requests.get(session_url, headers=headers)
r.json()
statements_url = session_url + '/statements'
data = {'code': '1 + 1'}
r = requests.post(statements_url, data=json.dumps(data), headers=headers)
r.json()
{u'output': None, u'state': u'running', u'id': 0}
statement_url = host + r.headers['location']
r = requests.get(statement_url, headers=headers)
pprint.pprint(r.json())
{u'id': 0,
u'output': {u'data': {u'text/plain': u'res0: Int = 2'},
u'execution_count': 0,
u'status': u'ok'},
u'state': u'available'}
data = {
'code': textwrap.dedent("""\
val NUM_SAMPLES = 100000;
val count = sc.parallelize(1 to NUM_SAMPLES).map { i =>
val x = Math.random();
val y = Math.random();
if (x*x + y*y < 1) 1 else 0
}.reduce(_ + _);
println(\"Pi is roughly \" + 4.0 * count / NUM_SAMPLES)
""")
}
r = requests.post(statements_url, data=json.dumps(data), headers=headers)
pprint.pprint(r.json())
session_url = 'http://localhost:8998/sessions/0'
requests.delete(session_url, headers=headers)