通过livy向CDH集群的spark提交任务
场景
产品中需要通过前端界面选择执行某种任务(spark任务),然后通过livy 的restful api 提交集群的spark任务
简单介绍下livy,翻译自官网:
Livy是基于Apache许可的一个服务,它可以让远程应用通过REST API比较方便的与Spark集群交互。通过简单的REST接口或RPC客户端库,它可以让你轻松的提交Spark作业或者Spark代码片段,同步或者异步的结果检索,以及SparkContext管理。Livy还简化了Spark和应用程序服务器之间的交互,从而为web/mobile应用简化Spark架构。
主要功能有:
1.由多个客户端为多个Spark作业使用长时间运行的SparkContexts。
2.同时管理多个SparkContexts,让它们在集群中(YARN/Mesos)运行,从而实现很好的容错和并发,而不是在Livy服务上运行。
3.预编译的jars,代码片段或者Java/Scala客户端API都可以用来提交作业。
4.安全认证的通信。(比如kerberos)

livy的rest api比较多(参考链接),这里介绍其中一种
代码如下:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
package cn.com.dtmobile.livy;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class HttpUtils {
public static HttpURLConnection init(HttpURLConnection conn){
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("charset","utf-8");
conn.setRequestProperty("Content-Type","application/json");
return conn;
}
/**
* HttpGET请求
*/
public static JSONObject getAccess(String urlStr) {
HttpURLConnection conn = null;
BufferedReader in = null;
StringBuilder builder = null;
JSONObject response = null;
try {
URL url = new URL(urlStr);
conn = init((HttpURLConnection) url.openConnection());
conn.setRequestMethod("GET");
conn.connect();
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line = "";
builder = new StringBuilder();
while((line = in.readLine()) != null){
builder.append(line);
}
response = JSON.parseObject(builder.toString());
}catch (Exception e){
e.printStackTrace();
}finally {
if (conn!=null)
conn.disconnect();
try {
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return response;
}
/**
* HttpDelete请求
*/
public static Boolean deleteAccess(String urlStr) {
HttpURLConnection conn = null;
try {
URL url = new URL(urlStr);
conn = init((HttpURLConnection) url.openConnection());
conn.setRequestMethod("DELETE");
conn.connect();
conn.getInputStream().close();
conn.disconnect();
}catch (Exception e){
e.printStackTrace();
return false;
}
return true;
}
/**
* HttpPost请求
*/
public static String postAccess(String urlStr, JSONObject data) {
HttpURLConnection conn = null;
BufferedReader in = null;
StringBuilder builder = null;
DataOutputStream out = null;
try {
URL url = new URL(urlStr);
conn = init((HttpURLConnection) url.openConnection());
conn.setRequestMethod("POST");
conn.connect();
out = new DataOutputStream(conn.getOutputStream());
out.write(data.toString().getBytes("utf8"));
out.flush();
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line = "";
builder = new StringBuilder();
while((line = in.readLine()) != null){
builder.append(line);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (conn!= null)
conn.disconnect();
try {
if (in!=null)
in.close();
if (out!=null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (builder != null)
return builder.toString();
return "";
}
}
package cn.com.dtmobile.livy;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
public class LivyApp {
static String host = "http://172.xx.x.xxx:8998";
public static int submitJob() throws JSONException {
JSONObject data = new JSONObject();
JSONObject conf = new JSONObject();
conf.put("spark.master","yarn-cluster");
data.put("conf",conf);
data.put("proxyUser","etluser");
data.put("file","/kong/data/jar/your_jar.jar");// 指定执行的spark jar (hdfs路径)
data.put("jars",new String[]{"/kong/data/jar/dbscan-on-spark_2.11-0.2.0-SNAPSHOT.jar"});//指定spark jar依赖的外部jars
data.put("className", "cn.com.dtmobile.spark.App");
data.put("name","jonitsiteplan");
data.put("executorCores",3);
data.put("executorMemory","2g");
data.put("driverCores",1);
data.put("driverMemory","4g");
data.put("numExecutors",6);
data.put("queue","default");
data.put("args",new String[]{"杭州","yj_hangzhou","2019041719"});//传递参数
String res = HttpUtils.postAccess(host + "/batches", data);
JSONObject resjson = JSON.parseObject(res);
System.out.println("id:"+resjson.getIntValue("id"));
return resjson.getIntValue("id");
}
public static void getJobInfo(int id){
// JSONObject response = HttpUtils.getAccess(host + "/batches/3");
// System.out.print(response.toString(1));
// JSONObject log = HttpUtils.getAccess(host + "/batches/3/log");
// System.out.print(log.toString(1));
JSONObject state = HttpUtils.getAccess(host + "/batches/"+id+"/state");
System.out.println(state.getString("state"));
}
public static void killJob(int id){
// 可以直接kill掉spark任务
if(HttpUtils.deleteAccess(host+"/batches/"+id)) {
System.out.println("kill spark job success");
}
}
public static void main(String[] args) {
int id = submitJob();
while(true) {
try {
getJobInfo(id);
Thread.sleep(10000);
} catch (InterruptedException e) {
}
}
// killJob(9);
}
}
执行提交以后,可以在livy的UI界面上任务的状态,也可以通过api轮询的获取任务状态,以及任务的输出日志

yarn界面

通过livy向CDH集群的spark提交任务的更多相关文章
- CDH集群安装&测试总结
0.绪论 之前完全没有接触过大数据相关的东西,都是书上啊,媒体上各种吹嘘啊,我对大数据,集群啊,分布式计算等等概念真是高山仰止,充满了仰望之情,觉得这些东西是这样的: 当我搭建的过程中,发现这些东西是 ...
- CDH集群中YARN的参数配置
CDH集群中YARN的参数配置 前言:Hadoop 2.0之后,原先的MapReduce不在是简单的离线批处理MR任务的框架,升级为MapReduceV2(Yarn)版本,也就是把资源调度和任务分发两 ...
- CentOS7安装CDH 第七章:CDH集群Hadoop的HA配置
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- 相同版本的CDH集群间迁移hdfs以及hbase
前言 由于项目数据安全的需要,这段时间看了下hadoop的distcp的命令使用,不断的纠结的问度娘,度娘告诉我的结果也让我很纠结,都是抄来抄去, 还好在牺牲大量的时间的基础上还终于搞出来了,顺便写这 ...
- 朝花夕拾之--大数据平台CDH集群离线搭建
body { border: 1px solid #ddd; outline: 1300px solid #fff; margin: 16px auto; } body .markdown-body ...
- CDH集群频繁告警(host频繁swapping)
最近CDH集群频繁告警,原因是某些host频繁swapping,极大影响了集群的性能. 后来发现有个设置(/proc/sys/vm/swappiness)需要修改,默认值60 Setting the ...
- Cloudera Manager安装_搭建CDH集群
2017年2月22日, 星期三 Cloudera Manager安装_搭建CDH集群 cpu 内存16G 内存12G 内存8G 默认单核单线 CDH1_node9 Server || Agent ...
- CDH集群搭建部署
1. 硬件准备 使用了五台机器,其中两台8c16g,三台4c8g.一台4c8g用于搭建cmServer和NFS服务端,另外4台作为cloudera-manager agent部署CDH集群. ...
- Spark集群模式&Spark程序提交
Spark集群模式&Spark程序提交 1. 集群管理器 Spark当前支持三种集群管理方式 Standalone-Spark自带的一种集群管理方式,易于构建集群. Apache Mesos- ...
随机推荐
- 使用R语言预测产品销量
使用R语言预测产品销量 通过不同的广告投入,预测产品的销量.因为响应变量销量是一个连续的值,所以这个问题是一个回归问题.数据集共有200个观测值,每一组观测值对应一种市场情况. 数据特征 TV:对于一 ...
- C# .net Ueditor实现图片上传到阿里云OSS 对象存储
在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...
- python基础知识五 各类型数据方法补充,转换,分类,编码+坑中菜
3.9各类型数据方法补充,转换,分类,编码,坑中菜 3.9.1数据类型方法补充 1.str:不可变 补充方法 s1.capitalize():首字母大写 s1 = "alex" s ...
- mysql -h139.129.205.80 -p test_db_dzpk < db.dump
mysqldump -h139.129.205.80 -uroot -p db_a > db_dzpk.dump mysql -h139.129.205.80 -p test_db< db ...
- C#跟Lua如何超高性能传递数据
前言 在UWA学堂上线那天,我买了招文勇这篇Lua交互的课程,19块还算值,但是前段时间太忙,一直没空研究,他的demo是基于xlua的,今天终于花了大半天时间在tolua下跑起来了,记录一下我的理解 ...
- (转)android自定义控件
原帖地址:http://my.oschina.net/wangjunhe/blog/99764 创建新的控件: 作为一个有创意的开发者,你经常会遇到安卓原生控件无法满足你的需求. 为了优化你的界面和工 ...
- 从0系统学Android-2.4隐式Intent
本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 使用隐式 Intent 相对于显示 Intent ,隐式 Intent 比较含蓄.这种方式不明确指出我们想要启动哪 ...
- 开源分布式事务中间件Seata使用指南
介绍 Seata 是阿里巴巴开源的分布式事务中间件,一种分布式事务解决方案,具有高性能和易于使用的微服务架构. 初衷 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入 高性能 ...
- 努力做一个优秀的programmer [ C# 影院售票系统]
Cinema.cs类 [Serializable] // 电影院类 public class Cinema { public Cinema() { //二进制 SoldTickets = new Li ...
- ASP.NET Core - 实现自定义WebApi模型验证
Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...