可以从AWS EMR Java SDK获取纱线应用程序状态吗?
上下文 我在Amazon EMR集群上运行spark应用程序 这些应用程序由纱线组织 从AWS控制台,我可以使用集群详细信息页面的可以从AWS EMR Java SDK获取纱线应用程序状态吗?,java,amazon-web-services,apache-spark,yarn,emr,Java,Amazon Web Services,Apache Spark,Yarn,Emr,上下文 我在Amazon EMR集群上运行spark应用程序 这些应用程序由纱线组织 从AWS控制台,我可以使用集群详细信息页面的应用程序历史选项卡获取纱线应用程序状态。(参见) 期望/问题 我想从java或scala程序中获得相同的信息(应用程序状态) 那么,是否可以从AWS EMR Java SDK获取纱线应用程序状态 在我的应用程序中,我管理一些EMR对象实例,如: 提前感谢。我之所以想到这一点,是因为我正在寻找一种通过EMRs“步骤”api获取工作状态的方法……但如果您希望通过
应用程序历史
选项卡获取纱线应用程序状态。(参见)
期望/问题
我想从java或scala程序中获得相同的信息(应用程序状态)
那么,是否可以从AWS EMR Java SDK获取纱线应用程序状态
在我的应用程序中,我管理一些EMR对象实例,如:
提前感谢。我之所以想到这一点,是因为我正在寻找一种通过EMRs“步骤”api获取工作状态的方法……但如果您希望通过纱线直接获取,这里有一些示例代码:
object DataLoad {
private def getJsonField(json: JValue, key: String): Option[String] = {
val value = (json \ key)
value match {
case jval: JValue => Some(jval.values.toString)
case _ => None
}
}
def load(logger: Logger, hiveDatabase: String, hiveTable: String, dw_table_name: String): Unit = {
val conf = ConfigFactory.load
val yarnResourceManager = conf.getString("app.yarnResourceManager")
val sparkExecutors = conf.getString("app.sparkExecutors")
val sparkHome = conf.getString("app.sparkHome")
val sparkAppJar = conf.getString("app.sparkAppJar")
val sparkMainClass = conf.getString("app.sparkMainClass")
val sparkMaster = conf.getString("app.sparkMaster")
val sparkDriverMemory = conf.getString("app.sparkDriverMemory")
val sparkExecutorMemory = conf.getString("app.sparkExecutorMemory")
var destination = ""
if(dw_table_name.contains("s3a://")){
destination = "s3"
}
else
{
destination = "sql"
}
val spark = new SparkLauncher()
.setSparkHome(sparkHome)
.setAppResource(sparkAppJar)
.setMainClass(sparkMainClass)
.setMaster(sparkMaster)
.addAppArgs(hiveDatabase)
.addAppArgs(hiveTable)
.addAppArgs(destination)
.setVerbose(false)
.setConf("spark.driver.memory", sparkDriverMemory)
.setConf("spark.executor.memory", sparkExecutorMemory)
.setConf("spark.executor.cores", sparkExecutors)
.setConf("spark.executor.instances", sparkExecutors)
.setConf("spark.driver.maxResultSize", "5g")
.setConf("spark.sql.broadcastTimeout", "144000")
.setConf("spark.network.timeout", "144000")
.startApplication()
var unknownCounter = 0
while(!spark.getState.isFinal) {
println(spark.getState.toString)
Thread.sleep(10000)
if(unknownCounter > 3000){
throw new IllegalStateException("Spark Job Failed, timeout expired 8 hours")
}
unknownCounter += 1
}
println(spark.getState.toString)
val appId: String = spark.getAppId
println(s"appId: $appId")
var finalState = ""
var i = 0
while(i < 5){
val response = Http(s"http://$yarnResourceManager/ws/v1/cluster/apps/$appId/").asString
if(response.code.toString.startsWith("2"))
{
val json = parse(response.body)
finalState = getJsonField(json \ "app","finalStatus").getOrElse("")
i = 55
}
else {
i = i+1
}
}
if(finalState.equalsIgnoreCase("SUCCEEDED")){
println("SPARK JOB SUCCEEDED")
}
else {
throw new IllegalStateException("Spark Job Failed")
}
}
}
对象数据加载{
私有def getJsonField(json:JValue,key:String):选项[String]={
val值=(json\key)
价值匹配{
案例jval:JValue=>Some(jval.values.toString)
案例=>无
}
}
def加载(记录器:记录器,hiveDatabase:String,hiveTable:String,dw_表_名称:String):单位={
val conf=ConfigFactory.load
val yarnResourceManager=conf.getString(“app.yarnResourceManager”)
val sparkExecutors=conf.getString(“app.sparkExecutors”)
val sparkHome=conf.getString(“app.sparkHome”)
val sparkAppJar=conf.getString(“app.sparkAppJar”)
val sparkMainClass=conf.getString(“app.sparkMainClass”)
val sparkMaster=conf.getString(“app.sparkMaster”)
val sparkDriverMemory=conf.getString(“app.sparkDriverMemory”)
val sparkexecutormory=conf.getString(“app.sparkexecutormory”)
var destination=“”
if(dw_table_name.contains(“s3a://”)){
destination=“s3”
}
其他的
{
destination=“sql”
}
val spark=new sparkauncher()
.setSparkHome(斯巴克霍姆)
.setAppResource(sparkAppJar)
.setMainClass(sparkMainClass)
.setMaster(sparkMaster)
.addAppArgs(hiveDatabase)
.addAppArgs(可移植到hiveTable)
.addappags(目的地)
.setVerbose(false)
.setConf(“spark.driver.memory”,sparkDriverMemory)
.setConf(“spark.executor.memory”,sparkExecutorMemory)
.setConf(“spark.executor.cores”,sparkExecutors)
.setConf(“spark.executor.instances”,sparkExecutors)
.setConf(“spark.driver.maxResultSize”,“5g”)
.setConf(“spark.sql.broadcastTimeout”,“144000”)
.setConf(“spark.network.timeout”,“144000”)
.startApplication()
var unknownCounter=0
而(!spark.getState.isFinal){
println(spark.getState.toString)
线程。睡眠(10000)
如果(未知计数>3000){
抛出新的非法状态异常(“Spark作业失败,超时已过期8小时”)
}
未知计数器+=1
}
println(spark.getState.toString)
val-appId:String=spark.getAppId
println(s“appId:$appId”)
var finalState=“”
变量i=0
而(i<5){
val response=Http(s“Http://$yarnResourceManager/ws/v1/cluster/apps/$appId/”)。asString
if(response.code.toString.startsWith(“2”))
{
val json=parse(response.body)
finalState=getJsonField(json\“app”,“finalStatus”)。getOrElse(“”)
i=55
}
否则{
i=i+1
}
}
if(最终状态等信号情况(“成功”)){
println(“火花作业成功”)
}
否则{
抛出新的非法状态异常(“Spark作业失败”)
}
}
}
Hi。你找到解决办法了吗?我也一直在试图找到答案,但运气不好:-(嗨@mywoodstock,不幸的是,AWS SDK中似乎没有任何东西可以做到这一点。但是,您可以使用YarnClient
直接与纱线资源管理器对话。(需要在您的emr主节点上打开一些端口)是的,一旦SSH隧道打开到EMR主节点IP-,您就可以使用Thread REST API了解应用程序状态。