Flink集群鉴权(Kafka+Redis)
需求说明:
出于安全考虑,连接集群时会添加账号密码的校验,所以在Flink与数据源建立连接时需要传入账号和密码。
解决方案:
1、在构造Flink连接器时传入密码
Kafka
Properties proper = new Properties(); proper.setProperty("zookeeper.connect", ZookeeperServers); // zookeeper地址 proper.setProperty("bootstrap.servers", srcBootstrapServers); // kafka集群地址 //Kafka鉴权信息配置 proper.setProperty("security.protocol", "SASL_PLAINTEXT"); proper.setProperty("sasl.mechanism", "SCRAM-SHA-256"); //账号密码配置 proper.setProperty("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"admin\" password=\"admin\";"); // kafka生产者 FlinkKafkaProducer010 producer = new FlinkKafkaProducer010<>(outTopic, new SimpleStringSchema(),proper);
在proper配置好鉴权的信息,但是出现问题:
因网络问题,从第一次发送消息到Kafka收到消息,有接近1分钟的延迟,期间会丢失很多消息。为了减少消息的丢失,需要对前1分钟的数据进行处理,所以使用了自定义的Sink。
@Override public void invoke(String value, Context context) throws Exception { record = new ProducerRecord<>(topic, value); producer.send(record); if (flag < 10){ try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } flag ++; System.out.println("第"+flag+"次尝试"); } System.out.println("Kafka:"+value); }
前几条消息,每发一条,停顿10秒,测试下来,最多丢失8条数据
Redis
redis2.9开始有传入密码的构造函数,使用连接器时需要替换掉自带的redis,然后引入2.9版本。
连接器带有的ClusterConfig
和ContainerBuilder
不支持密码的传入,所以要重写这两个方法,生产出带有密码的Container
。
实现后仍旧存在网络堵塞的状况,所以还是使用自定义的Sink,来解决问题
2、自定义Sink,使用java的API构造
注意两点:
1、Kafak、Redis构造的位置,注意序列化问题
2、Redis不同数据类型的构造
轮子地址:
https://github.com/lemon9610/Flink-JQ.git