0
votes

Good Day, I have an Issue uploading Jobs to Flink API using Scala

All Get request seem to work

import scalaj.http._ 
val url: String = "http://127.0.0.1:8081"
val response: HttpResponse[String] = Http(url+"/config").asString
return response

When I try Uploading a JAR file through CURL (works)

curl -vvv -X POST -H "Expect:" -F "jarfile=@/home/Downloads/myJob.jar" http://127.0.0.1:8081/jars/upload

Now I would Like to upload using SCALA The documentation does not provide a working example and I am fairly new to this type of post: https://ci.apache.org/projects/flink/flink-docs-release-1.3/monitoring/rest_api.html#submitting-programs

Currently my code is (Does not Work): Taken from : https://github.com/Guru107/flinkjobuploadplugin/tree/master/src/main/java/com/github/guru107 - Edited to my needs

// Ideal Case is to upload a Jar File as a multipart in Scala
  import java.io.IOException
  import org.apache.http.client.methods.HttpPost
  import org.apache.http.entity.mime.MultipartEntityBuilder
  import org.apache.http.impl.client.{HttpClients, LaxRedirectStrategy}
  import org.apache.http.message.BasicHeader
  import org.apache.http.util.EntityUtils


  val requestUrl = "http://localhost:8081/jars/upload"
  val jarPath = "@/home/Downloads/myJob.jar"

  val httpClient: CloseableHttpClient = HttpClients.custom.setRedirectStrategy(new LaxRedirectStrategy).build

  val fileToUpload: File = new File(jarPath)
  val uploadFileUrl: HttpPost = new HttpPost(requestUrl)

  val builder: MultipartEntityBuilder = MultipartEntityBuilder.create
  builder.addBinaryBody("jarfile", fileToUpload)

  val multipart: HttpEntity = builder.build
  var jobUploadResponse: JSONObject = null

  uploadFileUrl.setEntity(multipart)
  var response: CloseableHttpResponse  = null
  try {
    response = httpClient.execute(uploadFileUrl)
    println("response: " + response)
    response.setHeader(new BasicHeader("Expect", ""))
    response.setHeader(new BasicHeader("content-type", "application/x-java-archive"))
    val bodyAsString = EntityUtils.toString(response.getEntity, "UTF-8")
    println("bodyAsString: " + bodyAsString)
    jobUploadResponse = new JSONObject(bodyAsString)
    println("jobUploadResponse: " + jobUploadResponse)
  }

It fails to upload file.

Please provide a working example or link of scala example to upload a job/jar file to flink in scala

Thanks in Advance

1

1 Answers

0
votes

You can use the client code from com.github.mjreid.flinkwrapper

And upload jar file with scala code:

val apiEndpoint: String = as.settings.config.getString("flink.url") //http://<flink_web_host>:<flink_web_port>
val client = FlinkRestClient(apiEndpoint, as)
client.runProgram(<jarId>)