Livy简单使用 架构解读

article/2025/10/13 8:36:07

Livy使用 —— 关于Session的操作

官网案例:http://livy.incubator.apache.org/examples/
REST API:http://livy.incubator.apache.org/docs/latest/rest-api.html

通过REST API的方式去获取到session,返回活的交互式session
打开Postman,在其上面进行操作:

GET 192.168.26.131:8998/sessions
{"from": 0,"total": 0,"sessions": []
}

创建一个新的交互式Scala、Python、R 的shell在集群中
在Postman上进行操作(操作失败):
POST 192.168.26.131:8998/sessions

  1. 选择Body --> from-data
  2. 输入信息:
    Key Value
    kind spark
  3. 点击Bulk Edit --> raw
  4. 选择:JSON(application/json)
  5. Send之后,发现挂了:
    “Unrecognized token ‘kind’: was expecting (‘true’, ‘false’ or ‘null’)\n at [Source: (org.eclipse.jetty.server.HttpInputOverHTTP); line: 1, column: 6]”

使用以下方式创建Session

[hadoop@hadoop001 conf]$ curl -X POST --data '{"kind":"spark"}' -H "Content-Type:application/json" 192.168.26.131:8998/sessions

启动失败,打印如下日志:

18/06/09 06:35:27 WARN SparkEntries: SparkSession is not supported
java.net.ConnectException: Call From hadoop001/192.168.26.131 to hadoop001:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

解决方案:启动HDFS

重新启动,启动成功,打印日志:

18/06/09 06:42:56 INFO LineBufferedStream: stdout: 18/06/09 06:42:56 INFO SparkEntries: Spark context finished initialization in 6153ms
18/06/09 06:42:56 INFO LineBufferedStream: stdout: 18/06/09 06:42:56 INFO SparkEntries: Created Spark session.

启动成功之后,返回如下JSON信息:

{"id":0,"appId":null,"owner":null,"proxyUser":null,"state":"starting","kind":"spark","appInfo":{"driverLogUrl":null,"sparkUiUrl":null},"log":["stdout: ","\nstderr: "]}

创建Seesion成功之后,再去查看活的Seesion信息:
2种方式:

  1. Postman的方式,上面已经有操作
  2. curl 192.168.26.131:8998/sessions|python -m json.tool

返回的JSON信息:

{"from": 0,"total": 1,"sessions": [{"id": 0,"appId": null,"owner": null,"proxyUser": null,"state": "idle","kind": "spark","appInfo": {"driverLogUrl": null,"sparkUiUrl": null},"log": ["18/06/09 06:42:53 INFO Utils: Successfully started service 'org.apache.spark.network.netty.NettyBlockTransferService' on port 37616.","18/06/09 06:42:53 INFO NettyBlockTransferService: Server created on 192.168.26.131:37616","18/06/09 06:42:53 INFO BlockManager: Using org.apache.spark.storage.RandomBlockReplicationPolicy for block replication policy","18/06/09 06:42:53 INFO BlockManagerMaster: Registering BlockManager BlockManagerId(driver, 192.168.26.131, 37616, None)","18/06/09 06:42:53 INFO BlockManagerMasterEndpoint: Registering block manager 192.168.26.131:37616 with 413.9 MB RAM, BlockManagerId(driver, 192.168.26.131, 37616, None)","18/06/09 06:42:53 INFO BlockManagerMaster: Registered BlockManager BlockManagerId(driver, 192.168.26.131, 37616, None)","18/06/09 06:42:53 INFO BlockManager: Initialized BlockManager: BlockManagerId(driver, 192.168.26.131, 37616, None)","18/06/09 06:42:56 INFO EventLoggingListener: Logging events to hdfs://192.168.26.131:8020/spark_log/local-1528497773147","18/06/09 06:42:56 INFO SparkEntries: Spark context finished initialization in 6153ms","18/06/09 06:42:56 INFO SparkEntries: Created Spark session."]}]
}

Livy基本使用 —— 提交简单的作业

查询session的状态
打开Postman,在其上面进行操作:

GET 192.168.26.131:8998/sessions/0/state
{"id": 0,"state": "idle"
}

执行代码片段,简单的加法操作(一):

[hadoop@hadoop001 livy-0.5.0-incubating-bin]$curl -X POST 192.168.26.131:8998/sessions/0/statements  -H "Content-Type:application/json" -d '{"code":"1+1"}'
{"id":0,"code":"1+1","state":"waiting","output":null,"progress":0.0}

查询代码片段执行是否成功:
打开Postman,在其上面进行操作:

GET 192.168.26.131:8998/sessions/0/statements/0
{"id": 0,"code": "1+1","state": "available","output": {"status": "ok","execution_count": 0,"data": {"text/plain": "res0: Int = 2\n"}},"progress": 1
}

执行代码片段,简单的加法操作(二):

  1. 打开Postman,在其上面进行操作:
    POST 192.168.26.131:8998/sessions/0/statements
  2. 点击Body --> raw --> JSON{application/json}
  3. 输入信息:
    {"kind":"spark","code":"1+2"}
  1. 点击Send,返回以下信息:
    {"id": 1,"code": "1+2","state": "waiting","output": null,"progress": 0}

查询代码片段执行是否成功:
打开Postman,在其上面进行操作:

GET 192.168.26.131:8998/sessions/0/statements/1
{"id": 1,"code": "1+2","state": "available","output": {"status": "ok","execution_count": 1,"data": {"text/plain": "res1: Int = 3\n"}},"progress": 1
}

如果想执行wordcount操作的话,就直接把代码贴在code处就行了

通过web ui查看代码片段执行结果:
在这里插入图片描述
代码片段与其执行结果都在图中进行了显示

删除session状态:
打开Postman,在其上面进行操作:

DELETE 192.168.26.131:8998/sessions/0
{"msg": "deleted"
}

Livy架构解读

如下图所示:
在这里插入图片描述

有个客户端client,中间有个livy server,后面有spark interactive session和spark batch session(在这2个里面的底层都是有一个SparkContext的)

client发请求过来(http或rest)到livy server,然后会去spark interactive session和spark batch session分别去创建2个session;与spark集群交互打交道,去创建session的方式有2种:http或rpc,现在用的比较多的方式是:rpc

livy server就是一个rest的服务,收到客户端的请求之后,与spark集群进行连接;客户端只需要把请求发到server上就可以了

这样的话,就分为了3层:

  • 最左边:其实就是一个客户单,只需要向livy server发送请求
  • 到livy server之后就会去spark集群创建我们的session
  • session创建好之后,客户端就可以把作业以代码片段的方式提交上来就OK了,其实就是以请求的方式发到server上就行

这样能带来一个优点,对于原来提交作业机器的压力可以减少很多,我们只要保障Livy Server的HA就OK了
对于这个是可以保证的

对比:

  • 使用spark-submit(yarn-client模式)必须在客户端进行提交,如果客户端那台机器挂掉了(driver跑在客户端上,因此driver也就挂了),那么作业全部都完成不了,这就存在一个单点问题

在提交作业的时候,很多监控,可以通过UI搞的定,可以获取相应的接口,自己定制化的去开发监控界面
通过rest api去把接口拿到、去把数据拿到,这样就可以自己定制化出来了,是很方便的

总体执行的流程:

  1. 客户端发一个请求到livy server
  2. Livy Server发一个请求到Spark集群,去创建session
  3. session创建完之后,会返回一个请求到Livy Server
    这样Livy Server就知道session创建过程中的一个状态
  4. 客户端的操作
    如:如果客户端再发一个请求过来看一下,比如说看session信息啥的(可以通过GET API搞定)

多用户的特性:
上述是一个用户的操作,如果第二个、第三个用户来,可以这样操作:

  • 提交过去的时候,可以共享一个session
  • 其实一个session就是一个SparkContext

比如:蓝色的client共享一个session,黑色的client共享一个session,可以通过一定的标识,它们自己能够识别出来

安全性的扩展思路:
中间过程,在Livy Server这里,是可以做安全框架的

Livy的编程:

可以使用编程式的API:http://livy.incubator.apache.org/docs/latest/programmatic-api.html
Github的example:https://github.com/apache/incubator-livy/tree/master/examples

写在最后,关于Livy的使用,可以参考邵赛赛的博客:http://jerryshao.me/2018/01/05/livy-spark-based-rest-service/


http://chatgpt.dhexx.cn/article/bjODF2na.shtml

相关文章

【云原生】Apache Livy on k8s 讲解与实战操作

文章目录 一、概述二、开始编排部署1)部署包准备1)构建镜像2)创建livy chart模板3)修改yaml编排4)开始部署5)测试验证6)卸载 一、概述 Livy是一个提供Rest接口和spark集群交互的服务。它可以提交…

Livy:基于Apache Spark的REST服务

原文:http://geek.csdn.net/news/detail/208943 Apache Spark提供的两种基于命令行的处理交互方式虽然足够灵活,但在企业应用中面临诸如部署、安全等问题。为此本文引入Livy这样一个基于Apache Spark的REST服务,它不仅以REST的方式代替了Spar…

Livy安装使用

本次部署的livy是0.7.0版,zip包下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/incubator/livy/0.7.0-incubating/apache-livy-0.7.0-incubating-bin.zip 安装java jdk1.8 步骤: 一、将下载好的livy的zip包用命令unzip去解压(如果…

livy的安装使用

2019独角兽企业重金招聘Python工程师标准>>> livy简介 Livy是一个提供rest接口和spark集群交互的服务。它可以提交spark job或者spark一段代码,同步或者异步的返回结果;也提供sparkcontext的管理,通过restfull接口或RPC客户端库。Livy也简化了与spark与应用服务的交…

Livy任务提交源码解析

文章目录 简介任务路由代码断任务远程Driver上建立RpcServerLivyServer接收客户端提交代码断任务LivyServer向远程Driver的RpcServer提交任务远程Driver的RpcServer接收任务Driver执行代码断任务Batch任务LivyServer接收batch任务创建BatchSession以提交Spark任务创建SparkYarn…

livy简介

livy简介 什么是livy Livy通过提供REST服务来简化与Spark集群的交互。它可以通过job或者代码片段的方式来提交Spark任务,并同步或者异步地获得任务的结果,以及管理spark context,上述功能通过简单的REST接口或者RPC服务来实现。livy也可以简…

livy部署及应用

一、介绍 Livy把spark交互式和批处理都搬到了web上,提供restful接口,Livy一方面接收并解析客户端提交的REST请求,转换成相应的操作,另一方面它管理着客户端所启动的spark集群 Livy会为用户运行多个session,每个sessio…

C/C++ 实现字符串IP与整数型IP的相互转换

#include <stdio.h> int main() {char ip[32] "192.168.1.151"; //IP值char scIPAddress[32] ""; //存储字符串IPunsigned int nIPAddress 0; //存储整形IPint nTmpIP[4] {0}; //分割IPint i0;//字符串转整形sscanf(ip,"%d.%d.%d.%…

数字字符串转化成 IP 地址

数字字符串转化成 IP 地址 1、参考资料 https://www.nowcoder.com/practice/ce73540d47374dbe85b3125f57727e1e 2、题目要求 题目描述 现在有一个只包含数字的字符串&#xff0c;将该字符串转化成IP地址的形式&#xff0c;返回所有可能的情况。 例如&#xff1a; 给出的字…

IP地址(IPV6)与long数组之间的转换

IP地址&#xff08;IPV6&#xff09;与long数组之间的转换 《IP地址&#xff08;IPV4&#xff09;与int类型之间的转换》《IP地址&#xff08;IPV6&#xff09;与long数组之间的转换》 一、前言 IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#…

如何将字符数串和IP地址进行转换?

这一部分主要是网络编程中会使用&#xff0c;将数串和IP地址进行转换&#xff0c;在进行转换之前&#xff0c;我们需要知道IP地址在linux系统中的结构体定义 地址类型结构体 具体如下表&#xff1a; 结构体功能特性struct sockaddr套接字地址结构IPv4/IPv6通用struct sockad…

如何将IP地址字符串转换为数字数组

如何将IP地址字符串转换为数字数组 最近在做一个项目用到LWIP&#xff0c;通过触摸屏幕上的数字键盘输入要设置的IP地址和网关地址&#xff0c;然后再用输入的地址去设置重新设置lwip。那么问题就来了&#xff0c;输入的IP地址字符串应该怎么去转换成 ip[4] 数组呢&#xff1f…

IP地址字符串和数组相互转换

需求描述&#xff1a; 将字符串“192.168.2.126”&#xff0c;转成Byte类型&#xff0c;存放在字节数组中。数组内容为 192,168,2&#xff0c;126。反之亦然。 实现方法&#xff1a; 通过C# 库中的IPAddress类完成。 IPAddress类 对应的命名空间是using System.Net; 实现代…

花3个月面过华为测开岗,拿个30K不过分吧?

计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在一家初创…

华为OD德科面试+机试记录

一、机试&#xff08;6.25&#xff09; 三道编程题&#xff0c;难度偏中。由于时间久远&#xff0c;只记得其中两道题目 1、找车位&#xff08;动态规划&#xff09; 2、题目不记得了&#xff0c;后面如果找到会补充&#xff08;双指针&#xff09; 3、高效的任务规划&#x…

准备4个月过华为测试岗,拿个23k应该不多吧

我大学是学的编程专业&#xff0c;写代码能力非常一般&#xff0c;之前有一个学校项目经验和两段实习。第一份实习是在进大三之前的暑假在广州一家软件公司做前端&#xff0c;第二份实习时大三暑假两个月在一家刚创业的公司做全栈。 我面试的是测试开发&#xff0c;在2022年初…

vSphere Client连接主机提示远程服务器响应时间过长

问题现象 使用VMware vSphere Client连接EXSi主机时&#xff0c;提示“由于远程服务器响应时间过长&#xff0c;请求失败&#xff08;操作超时&#xff09;”。 解决方法 打开Windows注册表&#xff0c;找到HKEY_CURRENT_USER\Software\VMware\VMware Infrastructure Clien…

官网下载eclipse出现mirror.kakao.com 的响应时间过长+解决方法

Eclipse官网:https://www.eclipse.org/downloads/ 问题&#xff1a;官网下载eclipse出现mirror.kakao.com 的响应时间过长 原因&#xff1a;防火墙导致 解决:选择下载国内的镜像 详细过程如下&#xff1a; 每次下载都出现类似下图这样无法访问页面的界面 出现这个的原因大概…

火狐浏览器打开网页显示服务器响应时间过长,网站测试响应时间太长怎么办

有时候通过第三方工具测试服务器的响应时间会很长&#xff0c;而单独创建一个测试站点响应时间又很短。 如用户在http://seo.chinaz.com/ 这里测试的结果。 以下为一个测试出来响应时间较长的站点&#xff1a; 这种情况该怎么办呢&#xff0c;一般来说这种情况并不是网络原因&a…