如何在Flink上使用BasicAuth和ElasticSearch Connector

时间:2017-11-22 18:27:32

标签: elasticsearch basic-authentication apache-flink flink-streaming http-basic-authentication

我想在flink上使用弹性制作人但我在验证方面有些麻烦: 我的弹性搜索集群前面有Nginx,我在nginx中使用了基本的auth。

但是使用弹性搜索连接器我无法在我的网址中添加基本身份验证(因为InetSocketAddress)

您是否有使用elasticsearch连接器和基本身份验证的想法?

感谢您的时间。

有我的代码:

 val configur = new java.util.HashMap[String, String]

    configur.put("cluster.name", "cluster")

    configur.put("bulk.flush.max.actions", "1000")

    val transportAddresses = new java.util.ArrayList[InetSocketAddress]
    transportAddresses.add(new InetSocketAddress(InetAddress.getByName("cluster.com"), 9300))


    jsonOutput.filter(_.nonEmpty).addSink(new ElasticsearchSink(configur,
                                                                transportAddresses,
                                                                new ElasticsearchSinkFunction[String] {
      def createIndexRequest(element: String): IndexRequest = {

        val jsonMap = parse(element).values.asInstanceOf[java.util.HashMap[String, String]]

        return Requests.indexRequest()
          .index("flinkTest")
          .source(jsonMap);
      }

      override def process(element: String, ctx: RuntimeContext, indexer: RequestIndexer) {
        indexer.add(createIndexRequest(element))
      }
    }))

2 个答案:

答案 0 :(得分:0)

Flink使用Elasticsearch Transport Client,它使用端口9300上的二进制协议进行连接。 您的nginx代理位于端口9200上的HTTP接口前面。

Flink不会使用您的代理,因此无需提供身份验证。

答案 1 :(得分:-1)

如果您需要使用HTTP客户端将Flink与Elasticsearch连接,一种解决方案是使用Jest Library

你必须创建一个自定义SinkFunction,就像这个基本的java类一样:

package fr.gfi.keenai.streaming.io.sinks.elasticsearch5;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;

import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.core.Index;

public class ElasticsearchJestSinkFunction<T> extends RichSinkFunction<T> {

    private static final long serialVersionUID = -7831614642918134232L;

    private JestClient client;

    @Override
    public void invoke(T value) throws Exception {

        String document = convertToJsonDocument(value); 

        Index index = new Index.Builder(document).index("YOUR_INDEX_NAME").type("YOUR_DOCUMENT_TYPE").build();
        client.execute(index);

    }

    @Override
    public void open(Configuration parameters) throws Exception {

        // Construct a new Jest client according to configuration via factory
        JestClientFactory factory = new JestClientFactory();
        factory.setHttpClientConfig(new HttpClientConfig.Builder("http://localhost:9200")
                .multiThreaded(true)
                // Per default this implementation will create no more than 2 concurrent
                // connections per given route
                .defaultMaxTotalConnectionPerRoute(2)
                // and no more 20 connections in total
                .maxTotalConnection(20)
                // Basic username and password authentication
                .defaultCredentials("YOUR_USER", "YOUR_PASSWORD")
                .build());
        client = factory.getObject();
    }

    private String convertToJsonDocument(T value) {
        //TODO
        return "{}";
    }

}

请注意,您还可以使用批量操作来提高速度。

Flink的Jest实现示例在此post

的“连接Flink到Amazon RS”部分进行了描述