
日常在编写spark任务时,大部分都是通过spark集群或者spark集群作为client,将任务提交到yarn里面来运行。常规的提交方式在做在线服务过程中就不太实用了,当然可以通过java api调用脚本的方式来提交,个人感觉有点不友好。所以经过研究以后,可以直接对接spark yarn api,方便动态提交计算任务,管理计算任务。
第一步:将spark计算任务打包(jar)并上传到hdfs具体路径下面;
第二步:提交spark任务到yarn,并获取到appId;
public String dslSubmit(Task task) throws CoException {
String paramValue = task.getParamValue();
String[] runArgs = new String[]{
"--class", "classPath",
"--jar", "jarPath",
"--arg", "-m",
"--arg", "yarn",
"--arg", "-d",
"--arg", paramValue
};
// 构建Spark conf
SparkConf sparkConf = engineConfigService.buildEngineConfigInSpark();
try {
// 构造运行参数对象
ClientArguments cArgs = new ClientArguments(runArgs);
// 构造Client
Client client = new Client(cArgs, sparkConf, null);
// 提交spark任务到yarn,并获取到appId,后续可以通过appId控制运行的任务,查询运行的状态
ApplicationId applicationId = client.submitApplication();
return applicationId.toString();
} catch (Exception e) {
throw new CoException(ErrorCodeEnum.ENGINE_SUBMIT_EXCEPTION.getCode(), "application submit error");
}
}
第三步:通过第二步的appId,控制运行的任务,查询运行的状态等等管理 *** 作。
二、spark libs/conf首先yarn和spark集群没有必然的联系,yarn是通用的资源管理器,不耦合具体的引擎。所以再yarn里面运行的spark程序,只依赖libs包和conf信息。
即: __app__.jar、__spark_libs__、__spark_conf__这三个文件。每次运行任务都会将这几个文件包进行打包上传,然后才初始化运行环境。为了加快运行时间可以将libs打包上传到hdfs中,可以通过配置key来设置libs包的具体路径:
spark.yarn.archive -> source/__spark_libs__.zip // spark lib的zip包
spark.yarn.jars -> source/jars/*
在spark yarn client中,conf是每次动态生成的。因此每次任务执行都需要动态的设置运行的配置信息。
三、Spark任务提交出现的0.0.0.0:8030问题?通过spark yarn api提交spark任务来提供在线服务的过程中,遇到连不上yarn RM,网上找了比较多的资料,0.0.0.0:8030依然存在。
最后通过手动设置yarn RM的host来解决的。完整配置如下:
spark.hadoop.yarn.resourcemanager.hostname
spark.hadoop.yarn.resourcemanager.address
spark.hadoop.yarn.resourcemanager.scheduler.address
四、HadoopHA,导致spark任务提交的: “java.net.UnknownHostException” 问题HA是属于hadoop系统,脱离hadoop系统是无法识别的。因此需要将响应的配置信息加载进来。
解决方法如下:
在SparkConf对象中添加
sparkConf.set("spark.files", "hdfs:///conf/hdfs-site.xml,hdfs:///conf/core-site.xml");
五、spark yarn api模式资源管理kerberos权限认证官网说可以通过添加这两个配置来进行kerberos权限验证:spark.kerberos.keytab、spark.kerberos.principal
然而我们项目中,权限划分比较细,通过这种方式任然不行。
最后的解决办法是在服务项目中将yarn-site.xml,hdfs-site.xml,core-site.xml添加到resource下面。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)