2020-12-05

Flink ElasticSearch Sink 密码 安全校验

如何编写ES Sink(需要输入用户名和密码)

Flink官网没有给出详细的如果,ES带有权限校验,如何连接下面就是详细的ES Sink

object EsSink {
  def esBuilder(params:ParameterTool): ElasticsearchSink.Builder[TopicAndValue] = {
	//添加ES相关的信息
    val httpHosts = new java.util.ArrayList[HttpHost]
    httpHosts.add(new HttpHost("192.168.10.204", 9200, "http"))
    val esSinkBuilder = new ElasticsearchSink.Builder[TopicAndValue](
      httpHosts,
      new ElasticsearchSinkFunction[TopicAndValue] {
        def process(element: TopicAndValue, ctx: RuntimeContext, indexer: RequestIndexer) {
          //这里输入ES相关的信息
          val rqst: IndexRequest = Requests.indexRequest
            .index("test_duration_v2")
            .`type`("_doc")
            .source(element.value, XContentType.JSON)
          indexer.add(rqst)
        }
      }
    )

    esSinkBuilder.setBulkFlushMaxActions(100000)
    esSinkBuilder.setBulkFlushBackoffRetries(1)
    esSinkBuilder.setBulkFlushInterval(TimeUnit.SECONDS.toSeconds(10))
    esSinkBuilder.setBulkFlushMaxSizeMb(100)

    esSinkBuilder.setRestClientFactory(new RestClientFactory{
      override def configureRestClientBuilder(restClientBuilder: RestClientBuilder): Unit = {
        restClientBuilder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
          override def customizeHttpClient(httpClientBuilder: HttpAsyncClientBuilder): HttpAsyncClientBuilder = {
            val credentialsProvider = new BasicCredentialsProvider
            //在这里添加你的账号和密码
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"))
            httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
          }
        })
        restClientBuilder.setMaxRetryTimeoutMillis(100)
      }
    })
    esSinkBuilder
  }
}

主程序代码

object ComputeTimeDifferences {

  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val params = ParameterTool.fromArgs(args)
    val kafkaDStream = KafkaSourceDao
      .getKafkaSource(env, params)

    val sideOutKafkaTag = new OutputTag[TopicAndValue]("side-tag")
    val splitStream = kafkaDStream
      .process(processFunction = new ProcessFunction[TopicAndValue, TopicAndValue] {
        override def processElement(value: TopicAndValue, ctx: ProcessFunction[TopicAndValue, TopicAndValue]#Context, out: Collector[TopicAndValue]): Unit = {
          val specialDataType = getSpecialDataType(value.value)
          if (specialDataType._2.isEmpty || specialDataType._2.size() == 0) {
            ctx.output(sideOutKafkaTag, value)
          } else {
            out.collect(value)
          }
        }
      })

    splitStream
      .getSideOutput(sideOutKafkaTag)
      .addSink(EsSink.esBuilder(params).build())
      .name("side-stream")

    splitStream
      .keyBy(data => {
        val specialDataType = getSpecialDataType(data.value)
        val tag = specialDataType._2.getString("tag")
        val dataJSONObject = ParseJsonDataUtils.getJsonData(data.value)
        val uid = dataJSONObject.getString("uid")
        tag + uid
      })
      .process(new AppendDurationProcessFunction(1000 * 30))
      //在这里引用刚才的累即可
      .addSink(EsSink.esBuilder(params).build())
      .name("es-stream")
    env.execute("job")
  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值