黑猴子的家:利用 livy 远程提交 spark作业

livy是cloudera开发的通过REST来连接。管理spark的解决方案,此文记录在使用livy中遇到的一些问题

1、livy的下载

livy安装不多赘述,可以从github上自己build,也可以直接从livy.io上直接下载tar包。
下载 地址 :http://livy.io/quickstart.html
下载之后,解压即可运行

2、解压livy后,在livy-env.sh中添加

export SPARK_HOME=/opt/module/spark-2.1.1-bin-hadoop2.7.2
export HADOOP_CONF_DIR=/opt/module/hadoop/etc/conf

3、在livy.conf中可以进行一些配置

//默认使用hiveContext
livy.repl.enableHiveContext = true
//开启用户代理
livy.impersonation.enabled = true
//设置session空闲过期时间
livy.server.session.timeout = 1h
livy.server.session.factory = yarn/local本地模式或者yarn模式

4、开启livy服务

[root@node1 livy]$ /bin/livy-server

5、使用livy-session来执行spark-shell。

通过使用livy,可以通过rest来执行spark-shell。

  • new session。
curl -X POST --data '{"kind": "scala","proxyUser": "caoaoxiang"}' -H "Content-Type: application/json" localhost:8998/sessions
  • get session list
curl localhost:8998/sessions
  • run code
curl localhost:8998/sessions/{{sessionId}}/statements -X POST -H 'Content-Type: application/json' -d '{"code":"var a = 1;var b=a+1"}'  
  • get result
curl localhost:8998/sessions/{{sessionId}}/statements/{{statId}}
  • delete session
curl -X DELETE localhost:8998/sessions/{{sessionId}}
  • 通过livy建立的session,每一个session会维护一个spark-context,这时侯,如果我们将这个spark-context对应的application kill掉,然后查看session的状态会发现,状态仍然是idle,这时候仍然可以执行scala的基本语法,但不再可以执行spark statement。
  • 如果我们这时候,再去执行一个spark statement,会接受到报错
java.lang.IllegalStateException: RPC channel is closed 
  • 然后查看session的状态,结果是busy。也就是说statement并没有退出。

6、livy batch and spark-submit

  • livy session处理交互式请求,livy batches处理非交互式请求,即,相当与spark-submit操作。
  • new batches
curl -X POST -H "Content-Type: application/json"  localhost:8998/batches --data '{ "conf": {"spark.master":"yarn-cluster"}, "file": "/user/hdfs/spark-examples-1.6.1-hadoop2.6.0.jar", "className": "org.apache.spark.examples.SparkPi", "name": "Scala Livy Pi Example", "executorCores":1, "executorMemory":"512m", "driverCores":1, "driverMemory":"512m", "queue":"default", "args":["100"]}'

7、 batches的相关问题

  • 注意这里的spark.master需要设置为yarn-cluster。不然,在运行jar时,会报错,
  • hue上说,livy可以工作在local和yarn两种模式,当工作在local模式,jar的制定位置可以就是linux机器上的文件位置。当工作在yarn模式时,必须将jar上传到hdfs上,相应的,jar的file路径也是hdfs的路径。
  • 在我们执行spark-submit时,如果在打jar包时指定了入口的class,在spark-submit时可以不用再指定,但使用batches时,必须要制定ClassName作为jar的入口,否则会报错:
Error: Cannot load main class from JAR hdfs://datanode32:8020/user/caoaoxiang/spark-examples-1.6.1-hadoop2.6.0.jar with URI hdfs. Please specify a class through --class.
  • spark的yarn部署模式有spark-client和spark-cluster。这两种方式的主要区别就是driver的运行位置。spark-client的driver运行在宿主机上,spark-cluster的deriver运行在整个集群中,可以从集群中申请资源。
  • 个人认为,batches的yarn工作模式必须是spark-cluster,可以使得宿主机的资源不会成为运行的瓶颈。

你可能感兴趣的:(Spark)