Как использовать api rest, передавая поток flink в качестве параметра и возвращая этот поток преобразованным - PullRequest
0 голосов
/ 08 февраля 2020

Я новичок в apache моргании. У меня есть один проект flink scala, который использует данные из кластера kafka, и мне нужно передать результат потока в качестве параметра, чтобы использовать API, который возвращает преобразованный поток. Вот мой код

class Testing {
  def main(args: Array[String]): Unit = {}
  def streamTest(): Unit = {
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val properties = new Properties()
    properties.setProperty("bootstrap.servers", "test1.server.local:9092,test2.server.local:9092,test3.server.local:9092")
    val consumer_test = new FlinkKafkaConsumer[String]("topic_test", new SimpleStringSchema(), properties)
    consumer_test.setStartFromEarliest()
    val stream =  env.addSource(consumer_test).setParallelism(5)
    val api_test = "http://api-test.server.local/test/?msg=%s"
    // Here I need pass stream as parameter to api and return transformed stream
    env.execute()
  }   
}

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Это мой окончательный код. Я надеюсь, что это помогает

class Testing extends Serializable{
  def main(args: Array[String]): Unit = {}
  def streamTest(): Unit = {
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    val properties = new Properties()
    properties.setProperty("bootstrap.servers", "test1.server.local:9092,test2.server.local:9092,test3.server.local:9092")
    val consumer_test = new FlinkKafkaConsumer[String]("topic_test", new SimpleStringSchema(), properties)
    consumer_test.setStartFromEarliest()
    val stream =  env.addSource(consumer_test)
    // Here I need pass stream as parameter to api and return transformed stream
    val result = stream.flatMap{
      (str, out: Collector[String]) =>
        val api_test = "http://api-test.server.local/test/?msg=%s"
        out.collect {
          getUrl(api_test.format(URLEncoder.encode(str, "UTF-8")))
        }        
    }    
    env.execute()
  }

  def getUrl(url: String): String = {
    val timeout = 5
    val config = RequestConfig.custom.setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build
    val client: CloseableHttpClient = HttpClientBuilder.create.setDefaultRequestConfig(config).build
    val request = new HttpGet(url)
    val response = client.execute(request)
    val entity = response.getEntity
    val get_result = EntityUtils.toString(entity)
    get_result
  }     
}
0 голосов
/ 18 февраля 2020

Вы должны использовать любую библиотеку http / rest, с которой вы знакомы, а затем использовать asyncIO.

...